Nginx相关
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 主要应用场景
- 静态资源服务:托管 HTML/CSS/JS/图片,如前端项目的
dist目录。 - 反向代理:把客户端请求转发给后端应用(Tomcat、Spring Boot、Python、Node.js 等)。
- 负载均衡:把请求分发到多台后端服务器,实现水平扩展与高可用。
- HTTPS 终结:统一在 Nginx 层做 SSL 加解密,后端走明文 HTTP。
- 缓存加速:代理缓存、页面静态化,减轻后端压力。
- 限流与安全:连接数/请求频率限制、访问控制、防盗链、防 DDoS。
- 网关层:统一入口、跨域处理、灰度发布、灰度分流。
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 安装
- 到 Nginx 官网 下载 Windows 版 zip 包(选择
nginx/Windows-*)。 - 解压到如
D:\nginx-1.24.0(路径不要有中文和空格)。 - 目录说明:
nginx.exe:主程序conf/nginx.conf:主配置文件html/:默认静态页面目录logs/:日志目录(error.log、access.log)
- 启动与验证:
cd /d D:\nginx-1.24.0 start nginx :: 启动(后台运行,窗口不阻塞) :: 或直接双击 nginx.exe浏览器访问
http://localhost看到 “Welcome to nginx!” 即成功。 - 常用管理命令(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 在测试工作中的作用
- 理解被测架构:通过 Nginx 配置快速梳理”前端 → Nginx → 后端服务”的调用链。
- 接口测试入口:被测环境通常通过 Nginx 域名访问,接口请求最终由 Nginx 转发到具体后端实例。
- 定位问题边界:接口 502/504 时,判断是 Nginx 转发问题还是后端服务问题。
- 配置验证:灰度/环境切换时,验证 Nginx 转发、限流、白名单是否符合预期。
- 压测前置检查:确认负载均衡策略、是否有限流、超时时间等,避免测出”假指标”。
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 实战小练习
- 在本机用 Nginx 把一个本地端口服务(如 8080)反代到 80 端口,用浏览器/curl 验证。
- 起两个不同内容的 HTTP 服务(如 8081/8082),配置轮询负载均衡,多次请求观察请求被分发到不同后端。
- 给一个接口配置
limit_req限流,用 JMeter 或ab并发压测,观察超限请求返回 503。 - 配置 HTTPS 虚拟主机 + HTTP 跳转,用
curl -I验证 301 重定向和证书生效。 - 改配置后故意写错语法,
nginx -t看报错信息,并练习回滚(备份配置文件是好习惯)。
十四、学习资源
| 资源 | 说明 |
|---|---|
| Nginx 官方文档 | 最权威的模块与指令参考 |
| Nginx 官方中文 wiki | 中文入门资料 |
| Nginx 入门教程 | 官方快速上手 |
| 掘金 / 博客园 Nginx 专栏 | 大量实战踩坑文章 |
| 《深入理解 Nginx》 | 进阶:模块开发、源码剖析 |
| 《Nginx 高性能 Web 服务器详解》 | 系统化运维向书籍 |