一、Nginx 源码编译安装与基础环境配置

1. 实验准备:安装编译依赖

Nginx 源码编译需依赖 GCC 编译器、正则库、压缩库、SSL 库等基础组件,需提前安装,避免编译过程中出现依赖缺失错误,执行以下命令安装:

# 安装核心编译依赖
dnf install -y gcc pcre-devel zlib-devel openssl-devel
# 安装辅助工具
dnf install -y wget tar vim net-tools
# 创建Nginx运行用户(无登录权限,提升安全性)
useradd -s /sbin/nologin -M nginx

2. 源码编译与安装

采用源码编译安装方式,可自定义安装路径、启用 / 禁用模块,适配企业级定制化需求,实验选用 Nginx 1.24.0 稳定版,步骤如下:

(1)下载并解压源码包
# 进入源码存放目录
cd /usr/local/src
# 下载官方源码包
wget https://nginx.org/download/nginx-1.24.0.tar.gz
# 解压源码包
tar zxf nginx-1.24.0.tar.gz
# 进入解压目录
cd nginx-1.24.0
(2)配置编译参数

通过./configure命令配置编译参数,核心指定安装路径、运行用户、启用核心模块,生产环境需保证编译参数与业务需求匹配,执行以下命令:

./configure \
--prefix=/usr/local/nginx \ # 核心安装路径
--user=nginx \ # 运行用户
--group=nginx \ # 运行用户组
--with-http_ssl_module \ # 启用HTTPS支持
--with-http_v2_module \ # 启用HTTP/2支持
--with-http_realip_module \ # 启用客户端真实IP透传
--with-http_stub_status_module \ # 启用Nginx状态监控
--with-http_gzip_static_module \ # 启用静态压缩优化
--with-pcre \ # 启用PCRE正则库支持
--with-stream \ # 启用四层TCP/UDP代理
--with-stream_ssl_module \ # 启用四层SSL加密
--with-http_sub_module # 启用内容替换模块

编译参数校验:执行完上述命令后,若最后输出「Configuration successful」,表示参数配置成功;若出现错误,根据提示补充缺失的依赖即可。

(3)编译并安装
# 编译(-j指定编译线程数,建议等于CPU核心数,提升编译速度)
make -j 4
# 安装
make install

3. 安装目录结构详解

Nginx 编译安装后,所有文件集中在/usr/local/nginx目录下,目录结构清晰,便于运维管理,核心目录及作用如下:

/usr/local/nginx/
├── conf/        # 所有配置文件目录,核心配置:nginx.conf
├── html/        # 默认Web根目录,包含默认首页和50x错误页
├── logs/        # 日志目录,核心日志:access.log(访问日志)、error.log(错误日志)、nginx.pid(进程PID文件)
└── sbin/        # 二进制可执行文件目录,核心程序:nginx(主程序)

4. 全局环境变量配置

将 Nginx 可执行文件路径加入系统 PATH 环境变量,实现全局调用nginx命令,无需输入完整路径,提升运维效率:

# 编辑用户环境变量配置文件
vim ~/.bash_profile
# 在文件末尾添加以下内容
export PATH=$PATH:/usr/local/nginx/sbin
# 使配置生效
source ~/.bash_profile
# 验证配置(任意目录执行以下命令,输出版本信息即成功)
nginx -v

5. Systemd 服务配置

将 Nginx 注册为 systemd 系统服务,实现通过systemctl命令进行启动、停止、重启、开机自启等操作,贴合 Linux 系统标准运维方式,步骤如下:

(1)创建 systemd 服务文件
vim /lib/systemd/system/nginx.service
(2)写入服务配置内容
[Unit]
Description=The NGINX HTTP and reverse proxy server # 服务描述
After=syslog.target network-online.target remote-fs.target nss-lookup.target # 启动依赖
Wants=network-online.target # 弱依赖

[Service]
Type=forking # 后台运行模式
PIDFile=/usr/local/nginx/logs/nginx.pid # PID文件路径
ExecStartPre=/usr/local/nginx/sbin/nginx -t # 启动前执行配置校验
ExecStart=/usr/local/nginx/sbin/nginx # 启动命令
ExecReload=/usr/local/nginx/sbin/nginx -s reload # 平滑重载配置
ExecStop=/bin/kill -s QUIT $MAINPID # 优雅停止命令
PrivateTmp=true # 独立临时目录
Restart=on-failure # 失败时自动重启

[Install]
WantedBy=multi-user.target # 开机自启级别
(3)生效服务并验证
# 重新加载systemd配置,使新服务生效
systemctl daemon-reload
# 启动Nginx服务
systemctl start nginx
# 设置开机自启
systemctl enable nginx
# 验证服务状态(输出active(running)即成功)
systemctl status nginx
# 验证端口监听(默认监听80端口,输出LISTEN即成功)
netstat -tulnp | grep nginx

6. Nginx 核心运维命令

掌握 Nginx 核心命令是日常运维的基础,所有命令均基于nginx主程序执行,核心命令如下,生产环境优先使用 systemd 命令,特殊操作使用原生命令

# 查看版本信息
nginx -v
# 查看版本信息+编译参数(核心,用于确认启用的模块)
nginx -V
# 校验配置文件语法(修改配置后必执行)
nginx -t
# 平滑重载配置(修改配置后生效,无中断)
nginx -s reload
# 优雅停止(处理完当前请求后停止,无中断)
nginx -s quit
# 强制停止(立即停止,可能导致请求中断,不建议生产使用)
nginx -s stop
# 前台运行(适用于测试、容器环境)
nginx -g "daemon off;"
# 查看所有Nginx进程
ps -ef | grep nginx

二、Nginx 版本平滑升级与回滚实验

1. 实验目的

掌握 Nginx无业务中断的版本升级方法,实现生产环境下的版本更新;同时掌握升级失败后的快速回滚方法,保证服务的高可用性,是企业级 Nginx 运维的核心技能。

2. 实验环境准备

  • 已安装并运行的旧版本:Nginx 1.24.0
  • 待升级的新版本:Nginx 1.26.1
  • 核心要求:新版本编译参数必须与旧版本完全一致,避免模块不兼容导致升级失败。

3. 平滑升级核心步骤

# 步骤1:下载并解压新版本源码包
cd /usr/local/src
wget https://nginx.org/download/nginx-1.26.1.tar.gz
tar zxf nginx-1.26.1.tar.gz
cd nginx-1.26.1

# 步骤2:配置编译参数(与旧版本完全一致,可通过nginx -V查看旧版本参数)
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module --with-stream --with-http_stub_status_module

# 步骤3:仅编译不安装(避免覆盖旧版本配置)
make -j 4

# 步骤4:备份旧版本二进制可执行文件(核心,用于回滚)
cd /usr/local/nginx/sbin
cp nginx nginx.old.1.24.0

# 步骤5:替换新版本二进制文件(强制覆盖,保留文件属性)
\cp -f /usr/local/src/nginx-1.26.1/objs/nginx /usr/local/nginx/sbin/

# 步骤6:校验新版本配置(必执行,避免配置不兼容)
nginx -t

# 步骤7:向旧Master进程发送USR2信号,启动新版本Master进程(新旧进程共存)
kill -USR2 $(cat /usr/local/nginx/logs/nginx.pid)

# 步骤8:向旧Master进程发送WINCH信号,优雅停止旧Worker进程(旧连接处理完后退出)
kill -WINCH $(cat /usr/local/nginx/logs/nginx.pid.oldbin)

# 步骤9:验证升级结果(查看Server响应头的版本,输出1.26.1即成功)
curl -I localhost

4. 升级失败快速回滚步骤

若升级后出现服务异常、功能不兼容等问题,需立即回滚至旧版本,核心利用备份的旧版本二进制文件,实现快速回滚,步骤如下:

# 步骤1:恢复旧版本二进制文件
cd /usr/local/nginx/sbin
cp nginx.old.1.24.0 nginx

# 步骤2:向旧Master进程发送HUP信号,重启旧Worker进程
kill -HUP $(cat /usr/local/nginx/logs/nginx.pid.oldbin)

# 步骤3:向新版本Master进程发送QUIT信号,优雅停止新版本进程
kill -QUIT $(cat /usr/local/nginx/logs/nginx.pid)

# 步骤4:验证回滚结果(输出旧版本1.24.0即成功)
curl -I localhost
# 验证服务状态,确保无异常
systemctl status nginx

5. 实验核心注意事项

  1. 新版本编译参数必须与旧版本完全一致,否则会出现模块缺失、配置不兼容等问题;
  2. 升级前必须备份旧版本二进制文件,为回滚提供基础;
  3. 升级过程中,新旧进程会短暂共存,属于正常现象,旧 Worker 进程会处理完当前请求后优雅退出;
  4. 升级后需全面验证业务功能,包括静态资源、反向代理、负载均衡等,确保无异常。

三、Nginx 核心配置文件详解与基础优化

1. 主配置文件结构

Nginx 主配置文件为/usr/local/nginx/conf/nginx.conf,采用指令 + 指令块的配置格式,指令以分号结尾,指令块以{}包裹,核心分为 4 个层级,层级之间嵌套生效,结构如下:

# 1. 全局配置段(main):对整个Nginx实例生效,所有层级均继承该配置
user nginx nginx;
worker_processes 4;
error_log logs/error.log error;
pid logs/nginx.pid;

# 2. 事件驱动配置段(events):仅影响Nginx的事件处理机制,不涉及业务配置
events {
    use epoll;
    worker_connections 65535;
}

# 3. HTTP配置段:所有HTTP/HTTPS相关配置的父级,可嵌套多个Server块,所有Server块继承该配置
http {
    include mime.types;
    default_type application/octet-stream;
    sendfile on;
    keepalive_timeout 65;

    # 虚拟主机配置段(Server块):对应一个域名/IP,可配置多个,实现虚拟主机
    server {
        listen 80;
        server_name localhost;

        # 路径匹配配置段(Location块):匹配请求URI,实现精细化的请求处理,可配置多个
        location / {
            root html;
            index index.html index.htm;
        }
    }
}

# 4. Stream配置段:四层TCP/UDP代理配置,可嵌套多个Server块,1.9+版本支持
stream {
    server {
        listen 3306;
        proxy_pass 172.25.254.20:3306;
    }
}

2. 高并发核心优化配置

针对 Linux 系统和 Nginx 自身进行优化,提升 Nginx 的并发处理能力,解决「Too many open files」「连接数受限」等问题,核心优化分为Nginx 配置优化系统内核优化两部分。

(1)Nginx 配置优化(修改 nginx.conf)
# 全局段优化
worker_processes auto; # 自动匹配CPU核心数,最大化利用多核资源
worker_cpu_affinity 0001 0010 0100 1000; # 进程绑定CPU核心,避免上下文切换
worker_rlimit_nofile 65535; # 设置Worker进程最大打开文件数,突破系统默认限制
error_log logs/error.log warn; # 日志级别设为warn,减少日志写入开销

# 事件段优化
events {
    use epoll; # 启用epoll事件驱动模型,适配Linux系统
    worker_connections 65535; # 单个Worker进程最大并发连接数
    accept_mutex on; # 开启连接竞争互斥锁,解决惊群问题
    multi_accept on; # 单个Worker进程同时接受多个连接,提升连接处理效率
}

# HTTP段优化
http {
    include mime.types;
    default_type application/octet-stream;
    sendfile on; # 启用sendfile零拷贝技术,提升静态资源传输效率
    tcp_nopush on; # 开启TCP推模式,减少网络包数量
    tcp_nodelay on; # 开启TCP无延迟,提升实时性
    keepalive_timeout 65; # 长连接超时时间,单位秒
    keepalive_requests 100; # 单个长连接最大处理请求数
    client_max_body_size 10m; # 客户端最大请求体大小,避免大文件上传导致的异常
}
(2)Linux 系统内核优化(修改 /etc/security/limits.conf)
# 编辑系统限制配置文件
vim /etc/security/limits.conf
# 在文件末尾添加以下内容,提升系统最大打开文件数和最大进程数
* soft nofile 65535
* hard nofile 65535
* soft nproc 65535
* hard nproc 65535
# 使配置生效
ulimit -n 65535

3. 配置文件分离最佳实践

生产环境中,若所有配置均写在主配置文件nginx.conf中,会导致配置文件庞大、难以维护,最佳实践是采用「主配置文件 + 子配置文件」的方式,将虚拟主机、负载均衡等配置分离到独立的子配置文件中,通过include指令引入主配置文件。

(1)创建子配置文件目录
# 在conf目录下创建conf.d目录,用于存放所有子配置文件
mkdir /usr/local/nginx/conf/conf.d
(2)在主配置文件中引入子配置文件

修改/usr/local/nginx/conf/nginx.conf的 HTTP 段,添加include指令:

http {
    include mime.types;
    default_type application/octet-stream;
    sendfile on;
    keepalive_timeout 65;

    # 引入conf.d目录下的所有.conf后缀的子配置文件
    include conf.d/*.conf;
}
(3)子配置文件命名规范

子配置文件以「业务名称 / 功能名称 +.conf」命名,便于运维管理,例如:

  • 虚拟主机配置:vhost_lee.conf
  • 负载均衡配置:upstream_web.conf
  • PHP 代理配置:php_fpm.conf

四、Nginx 企业级核心配置实战

1. 基于域名的虚拟主机配置

实现一个 Nginx 实例部署多个域名,每个域名对应独立的 Web 根目录和配置,是企业级 Nginx 最常用的配置之一,实验需求:配置域名lee.timinglee.org,指向自定义 Web 根目录/webdata/nginx/lee/html

(1)创建 Web 根目录并添加测试文件
# 创建自定义Web根目录
mkdir -p /webdata/nginx/lee/html
# 添加测试首页
echo "Hello Nginx! Domain: lee.timinglee.org" > /webdata/nginx/lee/html/index.html
# 设置目录权限,避免权限不足导致403错误
chown -R nginx:nginx /webdata/nginx/
(2)创建子配置文件
vim /usr/local/nginx/conf/conf.d/vhost_lee.conf
(3)写入虚拟主机配置
server {
    listen 80; # 监听80端口
    server_name lee.timinglee.org; # 配置域名,多个域名用空格分隔

    # 配置访问日志,独立日志文件便于问题排查
    access_log logs/lee.timinglee.org_access.log main;
    error_log logs/lee.timinglee.org_error.log warn;

    # 根路径匹配,处理域名根请求
    location / {
        root /webdata/nginx/lee/html; # 自定义Web根目录
        index index.html index.htm; # 默认首页
        deny 192.168.1.100; # 禁止指定IP访问
        allow all; # 允许其他所有IP访问
    }

    # 自定义404错误页
    error_page 404 /404.html;
    location = /404.html {
        root /webdata/nginx/lee/error; # 错误页目录
        index 404.html;
    }

    # 自定义50x错误页(500、502、503、504)
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root /webdata/nginx/lee/error;
        index 50x.html;
    }
}
(4)校验配置并生效
# 校验配置文件语法
nginx -t
# 平滑重载配置,使新配置生效
nginx -s reload
(5)访问测试

配置本地 Hosts 解析(将lee.timinglee.org指向 Nginx 服务器 IP),通过浏览器或 curl 命令访问:

curl lee.timinglee.org
# 输出测试内容「Hello Nginx! Domain: lee.timinglee.org」即配置成功

2. Location 规则匹配实战

Location 用于匹配客户端的请求 URI,实现精细化的请求处理,是 Nginx 配置的核心,掌握 Location 的匹配语法和优先级,是实现复杂业务配置的基础。

(1)匹配语法与优先级

Location 的匹配语法为:location [ 修饰符 ] URI { ... },修饰符决定匹配规则,优先级从高到低依次为:=(精确匹配) > ^~(前缀匹配,跳过正则) > ~(正则匹配,区分大小写)/~*(正则匹配,不区分大小写) > 普通前缀匹配(无修饰符) > /(通用匹配,匹配所有未命中的请求)

(2)核心修饰符说明
  • =:精确匹配,仅当请求 URI 与配置的 URI 完全一致时才匹配,例如location = /index.html仅匹配http://domain/index.html
  • ^~:前缀匹配,当请求 URI 以配置的 URI 为前缀时匹配,匹配成功后跳过后续所有正则匹配,提升效率;
  • ~:正则匹配,区分大小写,支持 PCRE 正则表达式;
  • ~*:正则匹配,不区分大小写,适用于文件后缀、路径匹配;
  • 无修饰符:普通前缀匹配,按配置的 URI 长度从长到短匹配;
  • /:通用匹配,所有未被其他 Location 匹配的请求均会匹配到该规则。
(3)企业级实战配置
server {
    listen 80;
    server_name lee.timinglee.org;
    root /webdata/nginx/lee;

    # 精确匹配:访问/logo.png时匹配,优先级最高
    location = /logo.png {
        root /webdata/nginx/lee/images;
        expires 7d; # 设置浏览器缓存7天
    }

    # 前缀匹配:访问/images/开头的URI时匹配,跳过后续正则
    location ^~ /images {
        root /webdata/nginx/lee;
        expires 30d;
        allow 192.168.0.0/16;
        deny all;
    }

    # 正则匹配:匹配所有图片后缀,不区分大小写
    location ~* \.(gif|jpg|png|jpeg|webp)$ {
        root /webdata/nginx/lee/static;
        expires 15d;
    }

    # 正则匹配:匹配所有JS/CSS文件,不区分大小写
    location ~* \.(js|css)$ {
        root /webdata/nginx/lee/static;
        expires 7d;
        gzip on; # 开启压缩
    }

    # 普通前缀匹配:访问/abc开头的URI时匹配
    location /abc {
        root /webdata/nginx/lee;
        index index.html;
    }

    # 通用匹配:匹配所有未命中的请求
    location / {
        root /webdata/nginx/lee/html;
        index index.html;
    }
}

3. 访问控制与防盗链配置

(1)基于账号密码的访问控制

为指定路径添加账号密码认证,限制未授权访问,基于 Nginx 原生的ngx_http_auth_basic_module模块实现,无需额外扩展。

步骤 1:安装 htpasswd 密码生成工具
dnf install -y httpd-tools
步骤 2:生成密码文件
# -c:创建新文件;-m:MD5加密;-b:直接指定密码
htpasswd -cmb /usr/local/nginx/conf/.htpasswd admin 123456
# 添加第二个用户(去掉-c,避免覆盖现有文件)
htpasswd -mb /usr/local/nginx/conf/.htpasswd lee 654321
# 设置密码文件权限,提升安全性
chmod 600 /usr/local/nginx/conf/.htpasswd
步骤 3:配置访问控制
server {
    listen 80;
    server_name lee.timinglee.org;
    root /webdata/nginx/lee;

    # 为/admin路径添加密码认证
    location /admin {
        root /webdata/nginx/lee;
        index index.html;
        auth_basic "Nginx Admin Auth"; # 认证提示语
        auth_basic_user_file "/usr/local/nginx/conf/.htpasswd"; # 密码文件路径
    }
}
(2)资源防盗链配置

禁止其他网站引用本站的图片、JS、CSS 等静态资源,避免带宽被盗用,基于 Nginx 原生的ngx_http_referer_module模块实现,核心通过校验Referer请求头判断请求来源。

server {
    listen 80;
    server_name lee.timinglee.org;
    root /webdata/nginx/lee;

    # 对图片资源配置防盗链
    location ~* \.(gif|jpg|png|jpeg|webp)$ {
        root /webdata/nginx/lee/images;
        # 允许的请求来源:none(无Referer,直接访问)、blocked(Referer被屏蔽)、本站域名、百度搜索引擎
        valid_referers none blocked server_names *.timinglee.org ~/.baidu/.;
        # 非法来源,返回404错误
        if ($invalid_referer) {
            return 404;
            # 可选:将盗链请求重定向至防盗链提示图
            # rewrite ^/ http://lee.timinglee.org/anti_steal.png permanent;
        }
    }
}

4. Gzip 压缩与状态监控配置

(1)Gzip 压缩配置

启用 Gzip 压缩,减小响应数据的体积,提升客户端访问速度,降低服务器带宽消耗,基于 Nginx 原生的ngx_http_gzip_module模块实现,核心配置在 HTTP 段,全局生效。

http {
    gzip on; # 启用Gzip压缩
    gzip_comp_level 5; # 压缩级别,1-9,级别越高压缩比越大,CPU消耗越高,5为折中
    gzip_min_length 1k; # 最小压缩文件大小,小于1k的文件不压缩
    gzip_buffers 4 16k; # 压缩缓冲区大小
    gzip_http_version 1.1; # 支持的HTTP协议版本
    # 需要压缩的文件类型,按需配置
    gzip_types text/plain text/html text/css application/javascript application/json image/png image/jpeg;
    gzip_vary on; # 向响应头添加Vary: Accept-Encoding,告知浏览器启用压缩
    gzip_proxied any; # 对反向代理的请求也进行压缩
}
(2)Nginx 状态监控配置

启用 Nginx 内置的状态监控页面,实时查看 Nginx 的运行状态(如活动连接数、总请求数、进程状态),是 Nginx 运维监控的核心,基于ngx_http_stub_status_module模块实现。

server {
    listen 80;
    server_name lee.timinglee.org;

    # 配置状态监控页面路径
    location /nginx_status {
        stub_status; # 启用状态监控
        auth_basic "Nginx Status Auth"; # 添加密码认证,避免未授权访问
        auth_basic_user_file "/usr/local/nginx/conf/.htpasswd";
        allow 192.168.0.0/16; # 仅允许内网IP访问
        allow 127.0.0.1;
        deny all; # 拒绝其他所有IP
    }
}
状态页面核心指标说明

访问http://lee.timinglee.org/nginx_status,输入账号密码后,可查看以下核心指标:

  • Active connections:当前活动连接数;
  • accepts/handled/requests:Nginx 启动以来总接受连接数 / 总处理连接数 / 总请求数;
  • Reading:正在读取客户端请求头的连接数;
  • Writing:正在向客户端发送响应数据的连接数;
  • Waiting:处于空闲长连接状态的连接数。

五、Nginx 反向代理与负载均衡实战

1. HTTP 七层反向代理配置

将客户端的 HTTP/HTTPS 请求转发至后端的 Web 服务器(如 Apache、Tomcat、PHP-FPM),实现前端统一入口,后端服务集群的架构,是企业级微服务架构的核心配置。

(1)单台后端服务器代理

实验需求:将www.timinglee.org的请求转发至后端 Apache 服务器(IP:172.25.254.30,端口:80)。

server {
    listen 80;
    server_name www.timinglee.org;
    access_log logs/www_access.log main;

    location / {
        proxy_pass http://172.25.254.30:80; # 后端服务器地址
        # 透传客户端真实IP至后端服务器
        proxy_set_header X-Forwarded-For $remote_addr;
        # 透传客户端请求的Host头
        proxy_set_header Host $host;
        # 透传客户端请求的协议
        proxy_set_header X-Forwarded-Proto $scheme;
        # 反向代理连接超时时间
        proxy_connect_timeout 6s;
        # 反向代理读取超时时间
        proxy_read_timeout 60s;
        # 启用反向代理缓冲区
        proxy_buffering on;
        proxy_buffers 4 16k;
    }
}
(2)HTTP 七层负载均衡配置

实验需求:配置后端 Web 服务器集群(172.25.254.20:80、172.25.254.30:80),实现请求的负载均衡,基于 Nginx 原生的ngx_http_upstream_module模块实现。

核心调度算法

Nginx 内置多种负载均衡调度算法,生产环境可根据业务需求选择,主流算法如下:

  • 轮询(默认):请求按顺序依次转发至后端服务器,负载分布均匀;
  • 权重轮询(weight):为后端服务器设置权重,权重越高,接收的请求越多,适用于后端服务器性能不一致的场景;
  • IP 哈希(ip_hash):根据客户端 IP 进行哈希计算,将同一客户端的请求始终转发至同一台后端服务器,实现会话保持
  • 最少连接(least_conn):将请求转发至当前连接数最少的后端服务器,适用于请求处理时间不一致的场景;
  • URL 哈希(url_hash):根据请求 URI 进行哈希计算,将同一 URI 的请求始终转发至同一台后端服务器,实现缓存命中优化(需第三方模块支持)。
企业级配置示例
http {
    # 定义后端服务器组,命名为webserver
    upstream webserver {
        server 172.25.254.20:80 weight=2 max_fails=3 fail_timeout=30s; # 权重2,失败3次标记为不可用,30s后重试
        server 172.25.254.30:80 weight=1 max_fails=3 fail_timeout=30s; # 权重1
        server 172.25.254.40:80 backup; # 备份服务器,主服务器均不可用时启用
        # ip_hash; # 启用IP哈希,实现会话保持,注释则使用默认轮询
        # least_conn; # 启用最少连接算法,按需开启
    }

    # 配置虚拟主机,代理至后端服务器组
    server {
        listen 80;
        server_name www.timinglee.org;
        access_log logs/www_access.log main;

        location / {
            proxy_pass http://webserver; # 代理至后端服务器组
            # 透传客户端真实IP和Host头
            proxy_set_header X-Forwarded-For $remote_addr;
            proxy_set_header Host $host;
            # 后端服务器不可用时,返回503错误
            proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
            proxy_connect_timeout 6s;
            proxy_read_timeout 60s;
        }
    }
}

2. TCP/UDP 四层负载均衡配置

Nginx 1.9 + 版本通过stream模块实现TCP/UDP 四层负载均衡,突破 HTTP 七层代理的限制,支持数据库(MySQL、Redis)、中间件(Kafka、ZooKeeper)等非 Web 服务的代理与负载均衡,实验需求如下:

(1)MySQL TCP 负载均衡

将 3306 端口的 MySQL 请求转发至后端 MySQL 集群(172.25.254.20:3306、172.25.254.30:3306)。

# Stream段,四层代理核心配置
stream {
    # 定义MySQL后端服务器组
    upstream mysql_server {
        server 172.25.254.20:3306 max_fails=3 fail_timeout=30s;
        server 172.25.254.30:3306 max_fails=3 fail_timeout=30s;
    }

    # 配置四层代理服务,监听3306端口
    server {
        listen 172.25.254.10:3306; # 绑定Nginx服务器的内网IP,避免公网访问
        proxy_pass mysql_server; # 代理至MySQL服务器组
        proxy_connect_timeout 30s; # 连接超时时间
        proxy_timeout 300s; # 代理超时时间
        proxy_buffer_size 4k; # 代理缓冲区大小
    }
}
(2)DNS UDP 负载均衡

将 53 端口的 DNS 请求(UDP 协议)转发至后端 DNS 服务器集群(172.25.254.20:53、172.25.254.30:53)。

stream {
    # 定义DNS后端服务器组
    upstream dns_server {
        server 172.25.254.20:53;
        server 172.25.254.30:53;
    }

    # 配置UDP协议的四层代理
    server {
        listen 53 udp; # 监听UDP 53端口
        proxy_pass dns_server; # 代理至DNS服务器组
        proxy_timeout 1s; # UDP超时时间
        proxy_responses 1; # 期望接收的UDP响应报文数
    }
}

六、Nginx+PHP-FPM 实战(LNMP 环境搭建)

实现 Nginx 与 PHP-FPM 的联动,搭建LNMP(Linux+Nginx+MySQL+PHP) 环境,处理 PHP 动态请求,是企业级 PHP 网站的主流架构,Nginx 通过 FastCGI 协议与 PHP-FPM 通信,核心基于ngx_http_fastcgi_module模块实现。

1. PHP-FPM 编译安装与配置

(1)安装 PHP 编译依赖
dnf install -y gcc libxml2-devel sqlite-devel libpng-devel libcurl-devel oniguruma-devel bzip2-devel systemd-devel
(2)编译安装 PHP 8.3.9(含 FPM 模块)
# 下载并解压PHP源码包
cd /usr/local/src
wget https://www.php.net/distributions/php-8.3.9.tar.gz
tar zxf php-8.3.9.tar.gz
cd php-8.3.9

# 配置编译参数,启用FPM模块
./configure \
--prefix=/usr/local/php \
--with-config-file-path=/usr/local/php/etc \
--enable-fpm \
--with-fpm-user=nginx \
--with-fpm-group=nginx \
--with-curl \
--with-openssl \
--enable-mysqlnd \
--with-mysqli \
--with-pdo-mysql \
--with-png \
--with-zlib

#
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐