前言

本博客内容的测试与演示环境为 Rocky Linux 10.2 操作系统

一、认识Nginx

1、what 什么是 Nginx?

官方定义

Nginx(读音:Engine X)是一款免费、开源、高性能、轻量级的 HTTP Web 服务器、反向代理服务器、负载均衡器。由俄罗斯程序员 Igor Sysoev 开发,2004 年正式开源发布,目前是全球使用率最高的 Web 服务软件之一。
区别于传统 Apache 服务器,Nginx 基于异步、非阻塞、事件驱动模型设计,主打高并发、低内存、高稳定性。

核心身份定位

  • 静态 Web 服务器:直接部署静态资源(HTML/CSS/JS/图片),替代 Apache、Tomcat 静态服务能力。
  • 反向代理服务器:客户端请求统一入口,转发请求到后端应用服务,隐藏后端真实地址。
  • 负载均衡器:将海量流量分发到多台后端服务器,解决单服务器压力瓶颈,提升集群可用性。
  • HTTP 网关:实现 HTTPS 加密、限流、缓存、黑白名单、URL 重写、跨域处理等统一流量管控能力。

核心架构特点

采用 Master + Worker 多进程模型

  • Master 主进程:负责管理配置、调度 Worker 进程、监控服务状态、实现热重载。
  • Worker 工作进程:负责处理客户端所有网络请求,默认进程数等同于 CPU 核心数,资源利用率极高。
  • 事件驱动模型:基于 epoll(Linux)实现异步非阻塞,单进程可维持上万并发连接。

2、why 为什么用 Nginx?

核心优势

对比传统服务器(Apache、Tomcat),Nginx 在生产环境成为首选,核心原因是性能强、稳定高、功能全、成本低。

  • 超高并发能力
    Apache采用同步阻塞模型,单进程处理单请求,并发上限低;Nginx异步非阻塞,单台服务器可支撑10万+并发连接,是高并发场景首选。
  • 极低资源占用
    运行时内存占用极小,百兆并发下仅占用几十 MB 内存,服务器硬件成本更低,低配机器也能稳定运行。
  • 高稳定性、高可用
    支持热加载、热部署,修改配置后可平滑生效,无需重启服务,不中断用户请求,适合7*24小时运行。
  • 功能极度丰富
    原生支持反向代理、负载均衡、静态缓存、Gzip 压缩、HTTPS、限流、防攻击、URL 重写、动静分离,无需额外插件即可满足绝大多数业务场景。
  • 跨平台、开源免费
    支持 Linux、Windows、MacOS 系统,开源协议宽松,无商业授权成本,企业、个人均可免费使用。
  • 扩展性极强
    模块化设计,支持 Lua 脚本、第三方模块扩展,可实现自定义网关、监控、限流、灰度发布等高级功能。

解决的行业痛点

  • 解决单台 Tomcat 并发不足、性能瓶颈问题;
  • 解决后端服务地址暴露、网络安全风险问题;
  • 解决多服务集群流量分配不均、单点故障问题;
  • 解决静态资源访问慢、带宽占用高的问题;
  • 解决多域名、多项目统一入口管理混乱问题。

3、where

Nginx 是互联网项目的流量入口标配,几乎所有网站、小程序、后端服务、微服务架构中都会部署,覆盖绝大多数 Web 业务场景。

静态资源部署场景

  • 电商
  • 政务
  • 门户
    在这里插入图片描述
    在这里插入图片描述

反向代理场景(最核心、最常用)

作为客户端与后端服务的中间层,接收用户请求,转发给后端 Java、Python、Node 服务,隐藏后端真实 IP 和端口,提升系统安全性和解耦性。

负载均衡集群场景

后端部署多台业务服务器,通过 Nginx 统一分发流量,实现:

  • 流量均分,避免单服务器过载;
  • 自动剔除故障节点,实现服务高可用;
  • 支持灰度发布、流量权重分配。

二、安装Nginx

安装Nginx

三、配置Nginx静态站点

1、准备自定义 HTML 文件

  • 本地电脑创建一个名为index.html的自定义静态页面
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>我的第一个Nginx静态站点</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            max-width: 800px;
            margin: 0 auto;
            padding: 50px 20px;
            text-align: center;
            background-color: #f5f5f5;
        }
        .container {
            background-color: white;
            padding: 40px;
            border-radius: 10px;
            box-shadow: 0 2px 10px rgba(0,0,0,0.1);
        }
        h1 {
            color: #2c3e50;
        }
        p {
            color: #7f8c8d;
            font-size: 18px;
        }
    </style>
</head>
<body>
    <div class="container">
        <h1>🎉 恭喜!静态站点搭建成功</h1>
        <p>这是通过Nginx 1.26.3在Rocky Linux 10.1上部署的静态网站</p>
        <p>部署时间:2026年5月28日</p>
    </div>
</body>
</html>
  • 上传文件到服务器并复制到默认站点根目录
    在这里插入图片描述
ls usr/share/nginx/html/

cp index.html usr/share/nginx/html/

2、配置 Nginx 静态站点

Rocky Linux 10 默认 Nginx 配置文件位于/etc/nginx/nginx.conf。

  • 备份默认配置
cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak
  • 编辑 Nginx 配置文件 找到server块修改server_name 你的服务器IP 或者 你的域名
vim /etc/nginx/nginx.conf
server {
    listen       80;
    listen       [::]:80;
    server_name  你的服务器IP 或者 你的域名;
    root         /usr/share/nginx/html;
    index        index.html index.htm;

    # 错误页面配置
    error_page 404 /404.html;
    location = /404.html {
    }

    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
    }
}

在这里插入图片描述

3测试配置并重启 Nginx

# 测试Nginx配置文件语法是否正确
nginx -t
# nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
# nginx: configuration file /etc/nginx/nginx.conf test is successful

# 重启Nginx服务使配置生效
systemctl restart nginx

在这里插入图片描述

4、验证静态站点

在浏览器中输入你的服务器 IP 或域名,能看到刚才创建的自定义 HTML 页面。
在这里插入图片描述

四、配置lnmp动态站点

1、安装 PHP 及 WordPress 必要扩展

先启用 CRB 仓库(必须步骤)

# 启用CRB仓库
dnf config-manager --set-enabled crb

# 验证CRB是否启用
dnf repolist enabled | grep crb
  • 安装 PHP 8.3 及 WordPress 必需扩展
dnf install -y php php-fpm php-mysqlnd php-cli php-curl php-gd php-mbstring php-xml php-soap php-intl php-zip php-opcache php-fileinfo
  • 验证 PHP 安装成功
# 检查PHP版本(应该显示PHP 8.3.x)
php -v

# 检查已安装的扩展(确认mysqlnd、gd等关键扩展存在)
php -m | grep -E "mysqlnd|gd|curl|mbstring|xml|zip|intl"

在这里插入图片描述
在这里插入图片描述

2、配置 PHP-FPM

Rocky Linux 10 的 PHP-FPM 默认配置文件位于/etc/php-fpm.d/www.conf,需要修改运行用户和组为nginx。

  • 编辑PHP-FPM配置文件
vi /etc/php-fpm.d/www.conf
user = nginx
group = nginx
listen.owner = nginx
listen.group = nginx
listen.mode = 0660

在这里插入图片描述

  • 启动并设置 PHP-FPM 开机自启
systemctl enable --now php-fpm
# 检查PHP-FPM状态
systemctl status php-fpm

在这里插入图片描述

3、安装 MariaDB 数据库(MySQL 替代)

Rocky Linux 10 默认仓库提供 MariaDB 10.11 版本。

# 安装MariaDB服务器和客户端
dnf install -y mariadb-server mariadb

# 启动并设置MariaDB开机自启
systemctl enable --now mariadb
# 检查MariaDB状态
systemctl status mariadb

在这里插入图片描述

4、安全配置 MariaDB

运行安全配置脚本,设置 root 密码并删除不安全的默认配置。

mysql_secure_installation

输入当前 root 密码(初始为空,直接回车)
询问是否设置 root 密码:输入y,然后输入并确认你的 root 密码
询问是否删除匿名用户:输入y
询问是否禁止 root 远程登录:输入y
询问是否删除 test 数据库:输入y
询问是否重新加载权限表:输入y

在这里插入图片描述

5、创建 WordPress 数据库和用户

  • 登录MariaDB
mysql -u root -p
# 输入你刚才设置的root密码
  • 在 MariaDB 命令行中执行以下 SQL 语句
-- 创建wordpress数据库
CREATE DATABASE wordpress DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- 创建wordpress用户并设置密码(将'你的密码'替换为强密码)
CREATE USER 'wordpress'@'localhost' IDENTIFIED BY '你的密码';

-- 授予wordpress用户对wordpress数据库的所有权限
GRANT ALL ON wordpress.* TO 'wordpress'@'localhost';

-- 刷新权限
FLUSH PRIVILEGES;

-- 退出MariaDB
EXIT;

在这里插入图片描述

6、下载并配置 WordPress

# 进入网站根目录
cd /usr/share/nginx/

# 下载最新版WordPress
wget https://wordpress.org/latest.tar.gz

# 解压WordPress
tar -xzf latest.tar.gz

# 设置正确的文件和目录权限
chown -R nginx:nginx wordpress/
chmod -R 755 wordpress/

# 复制WordPress配置文件模板
cd wordpress/
cp wp-config-sample.php wp-config.php
  • 编辑 WordPress 配置文件
vim wp-config.php
  • 修改以下数据库配置信息
/** 数据库名称 */
define( 'DB_NAME', 'wordpress' );

/** 数据库用户名 */
define( 'DB_USER', 'wordpress' );

/** 数据库密码 */
define( 'DB_PASSWORD', '你的密码' );

/** 数据库主机 */
define( 'DB_HOST', 'localhost' );

/** 数据库字符集 */
define( 'DB_CHARSET', 'utf8mb4' );

/** 数据库排序规则 */
define( 'DB_COLLATE', 'utf8mb4_unicode_ci' );

在这里插入图片描述

  • 生成 WordPress 安全密钥
    访问https://api.wordpress.org/secret-key/1.1/salt/ 获取随机密钥,替换配置文件中对应的部分。
    在这里插入图片描述
    在这里插入图片描述

7、配置 Nginx 虚拟主机

  • 创建 WordPress 站点的 Nginx 配置文件 添加以下内容
vim /etc/nginx/conf.d/wordpress.conf
server {
    listen 80;
    listen [::]:80;
    server_name 你的服务器IP 或者 你的域名;
    root /usr/share/nginx/wordpress;
    index index.php index.html index.htm;

    # 隐藏Nginx版本号
    server_tokens off;

    # 安全头
    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Content-Type-Options "nosniff";

    # 永久链接设置
    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    # 禁止访问隐藏文件
    location ~ /\. {
        deny all;
        access_log off;
        log_not_found off;
    }

    # 禁止访问wp-config.php
    location ~* wp-config.php {
        deny all;
        access_log off;
        log_not_found off;
    }

    # PHP处理
    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_pass unix:/run/php-fpm/www.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

    # 静态资源缓存
    location ~* \.(jpg|jpeg|png|gif|ico|css|js|pdf|txt)$ {
        expires 30d;
        access_log off;
    }
}

在这里插入图片描述

  • 测试配置并重启服务
# 测试Nginx配置
nginx -t

# 重启Nginx服务
systemctl restart nginx

8、完成 WordPress 安装

在浏览器中输入你的服务器 IP 或域名,会看到 WordPress 的安装向导。

五、反向代理

1、核心定义

反向代理是代理服务器端的角色:所有的客户端的请求不会直接发给后端的Tomcat应用服务器,而是先统一发给Nginx。Nginx接受请求后再转发给后端的某台Tomcat服务器,Tomcat处理完返回给Nginx,最终由Nginx把结果返回给客户端。

2、关键特点

  • 用户完全无感知
    客户端只知道Nginx的地址,根本不知道后端有几台服务区也不知道自己的请求最终被哪台服务器处理。
  • 隐藏后端服务器
    后台服务器的真实IP不会暴露给外网,极大提高了系统安全性。
  • 统一入口
    所有请求都走Nginx这一个入口,方便做统一的权限控制、请求过滤、SSL加密、静态资源缓存等。

3、和正向代理的区别

在这里插入图片描述

案例:反向代理 Node.js 应用

我们先在服务器上启动一个简单的 Node.js 服务(运行在 3000 端口),然后用 Nginx 反向代理它。

端口选择原则(避坑指南)
Linux 端口分为三类,我们只需要关注注册端口(1024-49151):
❌ 0-1023:系统特权端口,需要 root 权限,且几乎都被系统服务占用
✅ 1024-49151:普通应用端口,推荐使用
❌ 49152-65535:系统动态端口,会被客户端临时分配,不适合长期绑定服务
  • 安装 Node.js(用于测试后端服务)
# 安装Node.js和npm
dnf install -y nodejs npm

# 验证安装
node -v
npm -v
  • 创建并启动 Node.js 测试服务
# 创建应用目录
mkdir -p /opt/node-app
cd /opt/node-app

# 创建简单的HTTP服务
cat > app.js << 'EOF'
const http = require('http');
const server = http.createServer((req, res) => {
    res.writeHead(200, {'Content-Type': 'text/html; charset=utf-8'});
    res.end(`
        <h1>🎉 Node.js 服务运行成功</h1>
        <p>这是通过Nginx反向代理访问的后端服务</p>
        <p>服务端口:3000</p>
        <p>客户端真实IP:${req.headers['x-real-ip'] || req.connection.remoteAddress}</p>
    `);
});
server.listen(3000, '127.0.0.1', () => {
    console.log('Node.js服务已启动,监听127.0.0.1:3000');
});
EOF

# 后台启动服务
node app.js &
  • 配置 Nginx 反向代理
# 创建反向代理配置文件
vim /etc/nginx/conf.d/node-proxy.conf

# 添加以下内容(生产环境标准配置)
server {
    listen 1026;
    server_name 192.168.13.134;  # 你的服务器IP或域名

    # 反向代理核心配置
    location / {
        # 将请求转发到本地3000端口的Node.js服务
        proxy_pass http://127.0.0.1:3000;

        # 必配:传递客户端真实信息给后端
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        # 超时配置(防止502错误)
        proxy_connect_timeout 5s;
        proxy_send_timeout 30s;
        proxy_read_timeout 30s;

        # 启用长连接(提升性能)
        proxy_http_version 1.1;
        proxy_set_header Connection "";
    }
}
# 检查配置语法是否正确
nginx -t

# 重启Nginx使配置生效
systemctl restart nginx

在这里插入图片描述

# 最常见问题:防火墙未开放端口

# 1. 临时开放1026端口(立即生效,重启失效)
firewall-cmd --add-port=1026/tcp

# 2. 永久开放1026端口(重启后仍生效)
firewall-cmd --permanent --add-port=1026/tcp

# 3. 重新加载防火墙规则
firewall-cmd --reload

在这里插入图片描述

  • 验证反向代理 http://IP+端口号
    在这里插入图片描述

六、负载均衡

1、核心定义

当后端有多台应用服务器,如果所有的请求都发给同一台服务区,那这台服务器会因为压力过大崩溃。负载均衡就是Nginx按照预设的规则,把请求均匀/按比例分发到不同的后端服务器,分摊压力,让整个系统能处理更多并发请求。

2、负载均衡策略

在这里插入图片描述

3、案例:3 节点 Web 服务负载均衡

我们在同一台服务器上启动 3 个不同端口的模拟 Web 服务,然后配置 Nginx 将请求分发到这 3 个服务上。

  • 启动 3 个模拟后端服务
# 启动服务1(端口1027)
cat > /opt/node-app/app1.js << 'EOF'
const http = require('http');
http.createServer((req, res) => {
    res.writeHead(200, {'Content-Type': 'text/html; charset=utf-8'});
    res.end('<h1>🚀 后端服务 1 (端口1027)</h1>');
}).listen(1027, '127.0.0.1');
EOF

# 启动服务2(端口1028)
cat > /opt/node-app/app2.js << 'EOF'
const http = require('http');
http.createServer((req, res) => {
    res.writeHead(200, {'Content-Type': 'text/html; charset=utf-8'});
    res.end('<h1>🚀 后端服务 2 (端口1028)</h1>');
}).listen(1028, '127.0.0.1');
EOF

# 启动服务3(端口1029)
cat > /opt/node-app/app3.js << 'EOF'
const http = require('http');
http.createServer((req, res) => {
    res.writeHead(200, {'Content-Type': 'text/html; charset=utf-8'});
    res.end('<h1>🚀 后端服务 3 (端口1029)</h1>');
}).listen(1029, '127.0.0.1');
EOF

# 后台启动所有服务
node /opt/node-app/app1.js &
node /opt/node-app/app2.js &
node /opt/node-app/app3.js &
  • 配置 Nginx 负载均衡
vim /etc/nginx/conf.d/load-balancer.conf

# 添加以下内容
# 定义后端服务器集群(upstream块必须放在http块内)
upstream backend_servers {
    # 4种负载均衡算法(选一种即可)
    # 1. 轮询(默认):请求依次分发到每台服务器
    server 127.0.0.1:1027;
    server 127.0.0.1:1028;
    server 127.0.0.1:1029;

    # 2. 加权轮询:权重越高,分配的请求越多
    # server 127.0.0.1:1027 weight=3;  # 3份请求
    # server 127.0.0.1:1028 weight=2;  # 2份请求
    # server 127.0.0.1:1029 weight=1;  # 1份请求

    # 3. IP哈希:同一个客户端IP的请求始终分发到同一台服务器(解决会话问题)
    # ip_hash;
    # server 127.0.0.1:1027;
    # server 127.0.0.1:1028;
    # server 127.0.0.1:1029;

    # 4. 最少连接:请求分发到当前连接数最少的服务器
    # least_conn;
    # server 127.0.0.1:1027;
    # server 127.0.0.1:1028;
    # server 127.0.0.1:1029;

    # 健康检查配置(自动剔除故障服务器)
    # max_fails=3:连续3次失败标记为不可用
    # fail_timeout=30s:不可用后暂停30秒再尝试
    server 127.0.0.1:1027 max_fails=3 fail_timeout=30s;
    server 127.0.0.1:1028 max_fails=3 fail_timeout=30s;
    server 127.0.0.1:1029 max_fails=3 fail_timeout=30s backup;  # backup表示备用服务器
}

server {
    listen 1030;
    server_name 192.168.13.134;  # 你的服务器IP或域名

    location / {
        # 将请求转发到上面定义的服务器集群
        proxy_pass http://backend_servers;

        # 反向代理通用配置(和上面一样)
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        proxy_connect_timeout 5s;
        proxy_send_timeout 30s;
        proxy_read_timeout 30s;

        proxy_http_version 1.1;
        proxy_set_header Connection "";
    }
}

在这里插入图片描述

  • 防火墙开放端口
firewall-cmd --permanent --add-port=1027/tcp
firewall-cmd --permanent --add-port=1028/tcp
firewall-cmd --permanent --add-port=1029/tcp
firewall-cmd --permanent --add-port=1030/tcp

firewall-cmd --reload

systemctl restart nginx
  • 验证负载均衡效果
    在浏览器中多次刷新 http://192.168.13.134:1030,你会看到页面在 “后端服务 1”、“后端服务 2” 和 “后端服务 3” 之间轮流切换,这就是轮询算法的效果。
    在这里插入图片描述
  • 测试故障转移
    手动停止其中一个服务,观察 Nginx 是否会自动将请求转发到其他正常的服务。
# 停止服务2
pkill -f "node /opt/node-app/app2.js"

再次刷新浏览器,你会发现请求只会分发到服务 1 和服务 3,不会出现 502 错误。这就是 Nginx 的自动故障转移功能。

  • 两者的关系
    反向代理是基础,负载均衡是应用。很多人会把它们混为一谈,其实是包含与被包含的关系:

反向代理是 Nginx 的基础能力:它的核心是 “转发请求”,不管后端有 1 台还是 100 台服务器,Nginx 都能做反向代理。
负载均衡是反向代理的高级应用:只有当后端有多台服务器时,才需要负载均衡来 “决定转发到哪一台”。

简单记:
反向代理 = 统一入口 + 转发请求
负载均衡 = 按规则选择转发目标
在这里插入图片描述

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐