Nginx相关

9 minute read

Nginx 反向代理与 Web 服务器 系统学习

本文面向测试工程师及后端开发初学者。Nginx 几乎出现在所有 Web 系统的架构中——前端静态资源托管、后端接口反向代理、多实例负载均衡、HTTPS 终结、限流防刷…… 学会 Nginx 不仅能帮你理解被测系统的整体架构,更是排查线上问题(502/504、慢接口、被限流)的必备技能。 文中所有配置均基于 Nginx 1.2x 版本,配置路径以 Linux 默认路径 /etc/nginx 为例,Windows 下路径类似。

一、Nginx 概述

1.1 什么是 Nginx?

  • 定义:Nginx(读作 “engine x”)是一个高性能的 HTTP 服务器、反向代理服务器、负载均衡器 和 邮件代理服务器,同时也是一个通用的 TCP/UDP 代理服务器。
  • 历史:由俄罗斯工程师 Igor Sysoev 于 2004 年发布,最初为解决 C10K 问题(单机同时处理 1 万个连接)而生。
  • 事件驱动模型:采用异步非阻塞的事件驱动架构(master-worker 多进程 + 事件循环),单 worker 进程可以处理成千上万的并发连接,资源占用极低。

1.2 核心特点

特点 说明
高并发 单机可轻松支撑数万并发连接,远超 Apache
低内存占用 同样负载下内存消耗约为 Apache 的 1/3
高可靠性 master 进程监控 worker,worker 异常退出会自动拉起
热部署 nginx -s reload 平滑重载配置,无需停机
模块化 功能以模块方式扩展(gzip、ssl、rewrite、stream 等)
跨平台 Linux、Windows、macOS、Unix 均支持

1.3 主要应用场景

  1. 静态资源服务:托管 HTML/CSS/JS/图片,如前端项目的 dist 目录。
  2. 反向代理:把客户端请求转发给后端应用(Tomcat、Spring Boot、Python、Node.js 等)。
  3. 负载均衡:把请求分发到多台后端服务器,实现水平扩展与高可用。
  4. HTTPS 终结:统一在 Nginx 层做 SSL 加解密,后端走明文 HTTP。
  5. 缓存加速:代理缓存、页面静态化,减轻后端压力。
  6. 限流与安全:连接数/请求频率限制、访问控制、防盗链、防 DDoS。
  7. 网关层:统一入口、跨域处理、灰度发布、灰度分流。

1.4 Nginx vs Apache vs Tomcat

维度 Nginx Apache Tomcat
定位 Web 服务器 / 反向代理 Web 服务器 Java Servlet 容器
架构 事件驱动,异步非阻塞 多进程 + 模块化 Java 多线程
并发处理 极高(数万级) 较高(千级) 中等
静态文件 强项,效率极高 一般 较弱
动态请求 通过反向代理转给应用 通过模块(PHP 等)处理 直接执行 Servlet/JSP
典型组合 Nginx + Tomcat(主流) Apache + PHP 单独或被 Nginx 反代

💡 常见架构:Nginx(静态资源 + 反向代理 + 负载均衡)→ Tomcat 集群(Java 应用)。测试环境里一般会看到 Nginx 作为统一入口。

二、安装与环境搭建

2.1 Windows 安装

  1. 到 Nginx 官网 下载 Windows 版 zip 包(选择 nginx/Windows-*)。
  2. 解压到如 D:\nginx-1.24.0(路径不要有中文和空格)。
  3. 目录说明:
    • nginx.exe:主程序
    • conf/nginx.conf:主配置文件
    • html/:默认静态页面目录
    • logs/:日志目录(error.log、access.log)
  4. 启动与验证:
    cd /d D:\nginx-1.24.0
    start nginx          :: 启动(后台运行,窗口不阻塞)
    :: 或直接双击 nginx.exe
    

    浏览器访问 http://localhost 看到 “Welcome to nginx!” 即成功。

  5. 常用管理命令(Windows 需在 nginx 目录下执行):
    nginx -s stop        :: 快速停止(强制)
    nginx -s quit        :: 优雅停止(处理完当前请求)
    nginx -s reload      :: 平滑重载配置
    nginx -t             :: 测试配置文件语法
    taskkill /f /im nginx.exe   :: 强制结束所有 nginx 进程
    

2.2 Linux 安装

# Ubuntu / Debian
sudo apt update && sudo apt install -y nginx

# CentOS / RHEL(EPEL 源)
sudo yum install -y epel-release && sudo yum install -y nginx

# 编译安装(进阶,可自定义模块)
# wget https://nginx.org/download/nginx-1.24.0.tar.gz
# tar -zxvf nginx-1.24.0.tar.gz && cd nginx-1.24.0
# ./configure --prefix=/usr/local/nginx --with-http_ssl_module
# make && make install

2.3 目录结构(Linux)

路径 说明
/etc/nginx/nginx.conf 主配置文件
/etc/nginx/conf.d/ 自定义配置目录(*.conf 会被 include)
/etc/nginx/sites-available/ 虚拟主机配置(可用)
/etc/nginx/sites-enabled/ 虚拟主机配置(启用,软链接到 available)
/var/www/html/ 默认站点根目录
/var/log/nginx/access.log 访问日志
/var/log/nginx/error.log 错误日志

2.4 启停与常用命令(Linux)

sudo systemctl start nginx      # 启动
sudo systemctl stop nginx       # 停止
sudo systemctl restart nginx    # 重启
sudo systemctl reload nginx     # 平滑重载配置
sudo systemctl enable nginx     # 设置开机自启
sudo systemctl status nginx     # 查看状态

nginx -t                        # 检查配置语法(改配置后必做)
nginx -v                        # 查看版本
nginx -V                        # 查看版本及编译参数(看有哪些模块)

⚠️ 黄金法则:每次修改 nginx.conf 后,务必先执行 nginx -t 确认语法正确,再 nginx -s reload。语法错误会导致 reload 失败。

三、配置文件详解

3.1 配置结构总览

Nginx 配置采用树形嵌套结构,核心层次为:

nginx.conf
├── main(全局块)      # 进程、日志、用户等全局设置
├── events { ... }      # 事件驱动模型配置(连接数)
└── http { ... }        # HTTP 核心配置
    ├── server { ... }  # 虚拟主机(一个 http 可多个 server)
    │   └── location { ... }  # URI 匹配规则(一个 server 可多个 location)
    ├── upstream { ... }      # 后端服务器组(负载均衡)
    └── include ...           # 引入其他配置文件

3.2 最小可用配置

# 全局块
worker_processes  1;                    # worker 进程数,通常 = CPU 核数

# events 块
events {
    worker_connections  1024;           # 单 worker 最大连接数
}

# http 块
http {
    include       mime.types;           # 引入文件类型映射
    default_type  application/octet-stream;

    sendfile        on;
    keepalive_timeout  65;

    # server 块:定义一个虚拟主机
    server {
        listen       80;                # 监听端口
        server_name  localhost;         # 域名/主机名

        # location 块:匹配请求 URI
        location / {
            root   html;                # 静态文件根目录(相对 prefix)
            index  index.html index.htm; # 默认首页
        }

        error_page   500 502 503 504  /50x.html;  # 错误页
        location = /50x.html {
            root   html;
        }
    }
}

3.3 配置分割与 include

生产环境建议按功能拆分配置,保持主配置清爽:

# nginx.conf 中 http 块末尾
http {
    ...
    include /etc/nginx/conf.d/*.conf;      # 业务 server 配置
    include /etc/nginx/conf.d/upstream/*.conf;  # 负载均衡组
}
# /etc/nginx/conf.d/test-api.conf 示例
server {
    listen 80;
    server_name test-api.example.com;
    location / {
        proxy_pass http://api_backend;
    }
}

四、静态资源服务

server {
    listen       80;
    server_name  www.example.com;

    # 前端构建产物目录
    location / {
        root   /var/www/dist;      # 静态文件根目录
        index  index.html;
        try_files $uri $uri/ /index.html;   # 前端路由 history 模式关键配置
    }

    # 图片等静态资源:开启缓存,减少后端压力
    location ~* \.(png|jpg|jpeg|gif|ico|svg|css|js)$ {
        root /var/www/dist;
        expires 7d;                 # 缓存 7 天
        access_log off;             # 静态资源不打访问日志,节省 IO
    }
}

4.1 root vs alias(高频易错点)

指令 行为 示例 请求 /img/a.png 实际访问
root 根目录 拼接 完整 URI root /var/www; /var/www/img/a.png
alias 用 alias 路径 替换 location 前缀 alias /var/www/img/; /var/www/img/a.png
location /img/ {
    root /var/www;            # 实际路径 = /var/www + /img/a.png
}
location /img/ {
    alias /var/www/assets/;   # 实际路径 = /var/www/assets/a.png(/img/ 被替换)
}

⚠️ alias 结尾的 / 必须保留,且不要与 location 前缀产生重复拼接,否则 404。

4.2 location 匹配规则与优先级

匹配方式 语法 优先级 示例
精确匹配 = 最高 location = /index.html
前缀匹配(长优先) ^~ 次高 location ^~ /static/
正则匹配(按书写顺序) ~ 区分大小写 / ~* 忽略大小写 中 location ~* \.png$
普通前缀匹配 /xxx 低 location /api/
兜底匹配 / 最低 location /

匹配流程:先精确匹配 = → 再普通前缀匹配并记录最长者(若命中 ^~ 直接结束)→ 再按顺序尝试正则 → 正则都没命中则用前面最长前缀匹配。

💡 测试提示:接口返回 404 时,第一反应检查 location 匹配是否符合预期,可用 nginx -T 导出完整生效配置核对。

五、反向代理(重点)

5.1 正向代理 vs 反向代理

维度 正向代理 反向代理
代理对象 代理 客户端(代替客户端访问) 代理 服务器(代替服务器响应)
典型场景 翻墙、公司上网代理 Nginx 转发到后端应用
客户端感知 客户端需要配置代理地址 客户端无感知,只认 Nginx 地址
安全性 隐藏客户端 隐藏后端服务器

5.2 基础反向代理配置

server {
    listen       80;
    server_name  test-api.example.com;

    location / {
        # 转发到后端 Spring Boot / Tomcat 服务
        proxy_pass http://127.0.0.1:8080;

        # 保留客户端真实信息(关键,后端才能拿到真实 IP)
        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;   # 读取响应超时
    }
}

5.3 proxy_pass 带不带斜杠的区别(高频易错点)

# 情况 1:不带 URI(只写 host:port)—— 原样转发完整 URI
location /api/ {
    proxy_pass http://127.0.0.1:8080;
}
# 请求 /api/user/1  ->  后端收到 /api/user/1

# 情况 2:带 URI(路径)—— location 前缀被替换
location /api/ {
    proxy_pass http://127.0.0.1:8080/server/;
}
# 请求 /api/user/1  ->  后端收到 /server/user/1(/api/ 被替换为 /server/)

⚠️ 规则:proxy_pass 不带 URI(host 后无路径)时,请求 URI 原样转发;带 URI 时,location 前缀部分会被替换。这是配置反向代理时最常见的坑。

5.4 反向代理 + 前后端分离示例

server {
    listen 80;
    server_name www.example.com;

    # 前端静态资源
    location / {
        root /var/www/dist;
        index index.html;
        try_files $uri $uri/ /index.html;
    }

    # 后端 API
    location /api/ {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }

    # WebSocket 支持(如实时消息、调试工具)
    location /ws/ {
        proxy_pass http://127.0.0.1:8080;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

六、负载均衡(重点)

6.1 upstream 配置

http {
    # 定义后端服务器组
    upstream api_backend {
        server 192.168.1.11:8080 weight=3;   # 权重 3
        server 192.168.1.12:8080 weight=1;   # 权重 1
        server 192.168.1.13:8080 down;       # 标记下线,不参与调度
        server 192.168.1.14:8080 backup;     # 备用机,主服务器全挂时才启用
    }

    server {
        listen 80;
        location / {
            proxy_pass http://api_backend;
            proxy_set_header Host $host;
        }
    }
}

6.2 负载均衡策略

策略 关键字 说明 适用场景
轮询(默认) 无 请求依次分发,各后端机会均等 后端配置相同
加权轮询 weight 按权重比例分发,权重越大流量越多 机器配置有差异
IP 哈希 ip_hash 按客户端 IP 哈希分配,同一 IP 固定打到同一台 需保持会话(无共享 Session)
最少连接 least_conn 分发给当前连接数最少的后端 长连接、处理时间不均
URL 哈希(第三方) hash $request_uri 按 URL 哈希分配,同一 URL 固定到同一台 缓存命中友好
一致性哈希(第三方) hash $request_uri consistent 节点增减只影响少量 key 分布式缓存场景
# 示例:ip_hash(解决 session 丢失)
upstream app_cluster {
    ip_hash;
    server 192.168.1.11:8080;
    server 192.168.1.12:8080;
}

6.3 健康检查与故障转移

upstream api_backend {
    server 192.168.1.11:8080 max_fails=3 fail_timeout=30s;  # 30s 内失败 3 次则标记不可用
    server 192.168.1.12:8080 max_fails=3 fail_timeout=30s;
}
  • Nginx 对后端节点的健康判断基于请求失败次数(max_fails / fail_timeout),被标记不可用的节点会在 fail_timeout 后尝试恢复。
  • 需要主动探测(HTTP 探活、自定义检查)时,需使用开源扩展 nginx_upstream_check_module 或商业版 Nginx Plus。

💡 测试提示:压测前先确认负载均衡策略,否则加权轮询下你的并发请求可能大部分打在同一台机器上,导致测试结论失真。

七、虚拟主机(多站点)

同一台 Nginx 通过 server 块提供多个站点,区分方式有三种:

# 1. 基于端口
server { listen 8081; server_name _; ... }
server { listen 8082; server_name _; ... }

# 2. 基于域名(最常用)
server {
    listen 80;
    server_name www.example.com;      # 精确匹配
    ...
}
server {
    listen 80;
    server_name api.example.com;
    ...
}

# 3. 通配符 / 正则
server { listen 80; server_name *.example.com; ... }
server { listen 80; server_name ~^www\.\d+\.example\.com$; ... }

server_name 匹配优先级:精确匹配 > 通配符(*)> 正则(~)。都不匹配时使用默认 server(第一个 server 或 default_server 指定的):

server {
    listen 80 default_server;   # 未匹配域名时兜底(通常指向一个 404 页面)
    server_name _;
    return 404;
}

八、HTTPS 配置

8.1 证书准备

  • 测试环境可用自签名证书(openssl req -x509 -newkey rsa:2048 -nodes -days 365 -keyout server.key -out server.crt)。
  • 生产推荐免费证书:Let’s Encrypt(配合 certbot 自动续期)或云厂商免费证书(阿里云、腾讯云等)。

8.2 HTTPS server 配置

server {
    listen       443 ssl;
    server_name  www.example.com;

    # 证书路径(证书文件 + 私钥文件)
    ssl_certificate      /etc/nginx/ssl/example.crt;
    ssl_certificate_key  /etc/nginx/ssl/example.key;

    # 协议与加密套件
    ssl_protocols       TLSv1.2 TLSv1.3;
    ssl_ciphers         HIGH:!aNULL:!MD5;
    ssl_session_cache   shared:SSL:10m;
    ssl_session_timeout 10m;

    location / {
        root /var/www/dist;
        index index.html;
    }
}

# HTTP 自动跳转 HTTPS
server {
    listen       80;
    server_name  www.example.com;
    return 301 https://$host$request_uri;
}

💡 测试提示:接口测试中若发现”非 HTTPS 请求被重定向”,就是这条 return 301 干的;用 curl -I 看响应头 Location 可确认。

九、日志管理

9.1 日志配置

http {
    # 自定义日志格式:时间/客户端IP/请求/状态码/响应大小/耗时/UA
    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for" '
                    'request_time=$request_time';

    # 访问日志
    access_log /var/log/nginx/access.log main;

    # 错误日志(级别:debug < info < notice < warn < error < crit)
    error_log  /var/log/nginx/error.log warn;

    server {
        # 可为某个站点单独指定日志
        access_log /var/log/nginx/test-api.log main;
        location /api/ {
            proxy_pass http://api_backend;
            access_log off;   # 也可关闭(如健康检查请求)
        }
    }
}

9.2 日志切割

# 方案一:logrotate(Linux 推荐,每日轮转 + 压缩 + 保留 14 天)
sudo vim /etc/logrotate.d/nginx
# /var/log/nginx/*.log {
#     daily
#     missingok
#     rotate 14
#     compress
#     dateext
#     postrotate
#         [ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
#     endscript
# }

# 方案二:手动切割
# mv access.log access.log.$(date +%F) && nginx -s reopen

9.3 排查技巧(测试高频)

# 查看最近访问(接口是否到达 Nginx)
tail -f /var/log/nginx/access.log

# 筛选某个接口的访问及耗时
grep "/api/login" /var/log/nginx/access.log | awk '{print $NF}' | sort -rn | head

# 看 5xx / 4xx 分布
grep -o 'HTTP/1.1" [0-9]*' /var/log/nginx/access.log | sort | uniq -c

# 实时观察错误日志
tail -f /var/log/nginx/error.log

# 按 IP 统计访问量 Top10
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -10

💡 测试定位三步法:客户端报错 → 先看 Nginx access.log 是否有请求进来 → 再看后端日志。Nginx 就像网关层的”红绿灯”,能快速判断问题出在链路的前段还是后段。

十、常用模块与高级配置

10.1 gzip 压缩

http {
    gzip on;                     # 开启压缩
    gzip_min_length 1k;          # 小于 1k 不压缩
    gzip_comp_level 5;           # 压缩级别 1-9(越大越费 CPU)
    gzip_types text/plain text/css application/json
               application/javascript application/xml
               image/svg+xml;    # 需要压缩的 MIME 类型
    gzip_vary on;
}

💡 验证方式:curl -H "Accept-Encoding: gzip" -I http://xxx/api 看响应头是否带 Content-Encoding: gzip。注意图片(jpg/png)本身已压缩,无需再压。

10.2 rewrite 地址重写

server {
    # 旧地址 301 跳转到新地址(利于 SEO 且不改变语义)
    location /old {
        rewrite ^/old/(.*)$ /new/$1 permanent;   # 301 永久重定向
    }

    # 伪静态:/news/123 重写为 index.php?id=123
    location /news/ {
        rewrite ^/news/(\d+)$ /detail?id=$1 last;
    }

    # 强制 https
    if ($scheme != "https") {
        return 301 https://$host$request_uri;
    }
}

⚠️ rewrite 的 flag:last(本条重写后重新匹配 location)、break(重写后不再匹配其他规则)、redirect(302)、permanent(301)。

10.3 防盗链

location ~* \.(gif|jpg|png|jpeg|webp)$ {
    # 只允许本站和空 referer 访问(浏览器直接打开图片 referer 为空)
    valid_referers none blocked server_names *.example.com;
    if ($invalid_referer) {
        return 403;
    }
}

10.4 访问控制

# 基于 IP 黑白名单
location /admin/ {
    allow 192.168.1.0/24;      # 允许内网
    deny  all;                 # 其余全部拒绝
}

# 基于账号密码(htpasswd 认证,配合 apache2-utils)
# sudo htpasswd -c /etc/nginx/.htpasswd user1
location /internal/ {
    auth_basic           "Restricted Area";
    auth_basic_user_file /etc/nginx/.htpasswd;
}

10.5 限流(防刷/限速)

http {
    # 1. 请求频率限制:zone 名为 req_zone,1m 内存,速率 10r/s(10 次/秒)
    limit_req_zone $binary_remote_addr zone=req_zone:10m rate=10r/s;

    # 2. 连接数限制
    limit_conn_zone $binary_remote_addr zone=conn_zone:10m;

    server {
        location /api/ {
            # 触发限流:超出部分排队等待(burst),超过队列直接 503
            limit_req zone=req_zone burst=20 nodelay;
            # 单个 IP 最多同时 10 个连接
            limit_conn conn_zone 10;

            # 限制下载速度(单连接 1MB/s)
            limit_rate 1m;

            proxy_pass http://api_backend;
        }
    }
}

💡 测试提示:压测时如果发现请求大面积返回 503,先检查是否命中 Nginx 限流(limit_req 默认错误码 503)。这也是接口防刷测试要验证的关键点。

10.6 代理缓存

http {
    proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g
                     inactive=60m use_temp_path=off;

    server {
        location /api/ {
            proxy_cache my_cache;                 # 使用缓存区
            proxy_cache_valid 200 302 10m;        # 200/302 缓存 10 分钟
            proxy_cache_valid 404 1m;
            proxy_cache_key $scheme$request_method$host$request_uri;  # 缓存键
            proxy_pass http://api_backend;
        }
    }
}

十一、高可用(Keepalived + Nginx 双机热备)

单台 Nginx 宕机会导致整个服务不可用,生产环境常用 Keepalived + 虚拟 IP(VIP) 实现主备切换:

客户端 → 虚拟IP 192.168.1.100
              ↓
   ┌──────────┴──────────┐
 主 Nginx(192.168.1.10)  备 Nginx(192.168.1.11)
   └──────────┬──────────┘
              ↓
        后端服务器集群
  • Keepalived 通过 VRRP 协议在主备之间漂移虚拟 IP:主节点宕机后,备节点自动接管 VIP,客户端无感知(切换时间秒级)。
  • 配合健康检查脚本(定时 curl 本机 Nginx 状态),Nginx 进程异常时主动降级并触发切换。

十二、性能优化要点

优化项 配置 说明
进程数 worker_processes auto; 自动 = CPU 核数
连接数 worker_connections 10240; 按需调大(受系统文件句柄限制,需 ulimit -n)
长连接 keepalive_timeout 65; keepalive_requests 1000; 减少握手开销
静态资源缓存 expires 7d; 减少重复请求
压缩 gzip 开启 减少传输体积
代理缓冲 proxy_buffering on; 后端响应先缓冲再下发
访问日志 静态资源 access_log off; 减少磁盘 IO
系统层面 ulimit -n 65535、调整内核 net.core.somaxconn 提高文件句柄与连接队列上限
压测排查 nginx -t、ss -lntp 确认监听 先排除配置/端口问题再谈性能

⚠️ 性能优化验证:优化前后用 ab、wrk、JMeter 压测对比吞吐量(QPS)、P99 延迟、错误率,数据说话。

十三、测试场景实战与常见问题排查

13.1 Nginx 在测试工作中的作用

  1. 理解被测架构:通过 Nginx 配置快速梳理”前端 → Nginx → 后端服务”的调用链。
  2. 接口测试入口:被测环境通常通过 Nginx 域名访问,接口请求最终由 Nginx 转发到具体后端实例。
  3. 定位问题边界:接口 502/504 时,判断是 Nginx 转发问题还是后端服务问题。
  4. 配置验证:灰度/环境切换时,验证 Nginx 转发、限流、白名单是否符合预期。
  5. 压测前置检查:确认负载均衡策略、是否有限流、超时时间等,避免测出”假指标”。

13.2 常见错误码排查

错误码 含义 常见原因 排查方向
404 找不到 location/root 配置错误、URI 前缀被替换 核对 location 匹配、nginx -T 查生效配置
403 禁止访问 目录权限不足、白名单拦截、防盗链 检查 allow/deny、文件权限、index 文件是否存在
502 Bad Gateway 网关错误 后端服务未启动/端口错误/连接被拒 检查后端进程、proxy_pass 地址端口、后端防火墙
504 Gateway Timeout 网关超时 后端响应慢,超过 proxy_read_timeout 调大超时时间、排查后端慢查询/死锁
503 服务不可用 限流触发、upstream 无可用节点 查 limit_req/limit_conn 配置、upstream 节点健康状态
499 客户端断开 客户端等不及主动断开 多为接口过慢,配合后端日志分析耗时
431 请求头过大 请求头超过默认大小 调大 large_client_header_buffers

排查通用命令:

# 看配置是否合法
sudo nginx -t
# 看端口监听
ss -lntp | grep -E '80|443'
# 看后端进程
ps aux | grep java | grep -v grep
# 看错误日志(含 Nginx 自身与 upstream 错误)
tail -100 /var/log/nginx/error.log

13.3 实战小练习

  1. 在本机用 Nginx 把一个本地端口服务(如 8080)反代到 80 端口,用浏览器/curl 验证。
  2. 起两个不同内容的 HTTP 服务(如 8081/8082),配置轮询负载均衡,多次请求观察请求被分发到不同后端。
  3. 给一个接口配置 limit_req 限流,用 JMeter 或 ab 并发压测,观察超限请求返回 503。
  4. 配置 HTTPS 虚拟主机 + HTTP 跳转,用 curl -I 验证 301 重定向和证书生效。
  5. 改配置后故意写错语法,nginx -t 看报错信息,并练习回滚(备份配置文件是好习惯)。

十四、学习资源

资源 说明
Nginx 官方文档 最权威的模块与指令参考
Nginx 官方中文 wiki 中文入门资料
Nginx 入门教程 官方快速上手
掘金 / 博客园 Nginx 专栏 大量实战踩坑文章
《深入理解 Nginx》 进阶:模块开发、源码剖析
《Nginx 高性能 Web 服务器详解》 系统化运维向书籍