NGINX · 反向代理 / 流量入口

Nginx速查

从配置层级、location 匹配规则到反向代理、负载均衡,再到 HTTPS 加固与 502 排错,运维与生产方向最常用的 41 条配置要点一张表收齐,随查随用。

41条配置要点 6大场景 持续更新

📖 速查表

点击展开各小节

⚙️ 核心配置结构
配置层级 / 指令说明示例
main 全局块 最外层全局配置区:运行用户、工作进程数、错误日志、PID 文件路径,作用于整个 Nginx user www-data;
error_log /var/log/nginx/error.log;
events 事件驱动模型配置区(全局只能有一个):每个 worker 的最大连接数、IO 多路复用模型 events { worker_connections 10240; use epoll; }
http HTTP 服务全局区:MIME 类型、日志格式、gzip、keepalive 等通用指令,所有 server 都定义在其中 http { include mime.types; gzip on; }
server 虚拟主机:监听端口与域名,一台机器可配多个 server,按域名/端口分流 server { listen 80; server_name example.com; }
location server 内的路由单元:按 URI 规则匹配请求,转给后端代理或返回静态文件 location /api/ { proxy_pass http://backend; }
worker_processes 工作进程数,auto 自动等于 CPU 核数;IO 密集场景可略调高 worker_processes auto;
worker_connections 单个 worker 的最大并发连接数;反向代理场景一个请求占用 2 个连接(客户端 + 后端) worker_connections 10240; 理论并发 ≈ worker × connections
systemctl 常用命令 启动/停止/重启/平滑重载;改完配置先用 nginx -t 校验语法再重载,避免带病上线 systemctl start nginx
nginx -t && nginx -s reload 平滑重载不断连接
📍 location 匹配规则
匹配符号说明示例
= 精确匹配 URI 完全相等才命中,命中后立即停止匹配,性能最好,适合健康检查等固定路径 location = /health { return 200 "ok"; } 优先级最高
^~ 前缀匹配 按前缀匹配后不再检查后面的正则,适合静态资源目录的确定性路由 location ^~ /static/ { root /data/www; }
~ 正则(区分大小写) 按配置书写顺序依次尝试正则,首个命中即生效 location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; }
~* 正则(忽略大小写) ~ 相同但不区分大小写,常用于图片等静态后缀 location ~* \.(jpg|png|gif)$ { expires 7d; }
无符号 普通前缀 最长前缀优先;命中普通前缀后仍可能被正则覆盖,需配合 ^~ 阻断 location /api/ { proxy_pass http://backend; }
优先级总览 = > ^~ > 正则(~ / ~* 按书写顺序)> 普通前缀(最长优先) 口诀:精确最优先,正则压前缀
🔀 反向代理
配置项说明示例(前提 location /api/
proxy_pass 不带路径 原样透传完整 URI:/api/userhttp://backend/api/user proxy_pass http://backend; 最常用
proxy_pass/ 去掉 location 匹配前缀再转发:/api/userhttp://backend/user proxy_pass http://backend/;
proxy_pass 带路径 把 location 前缀替换为指定路径:/api/userhttp://backend/v2/user proxy_pass http://backend/v2/;
proxy_pass 带变量 按变量动态决定后端,此时 URI 不再自动替换,且需 resolver 解析域名 resolver 114.114.114.114;
proxy_pass http://$upstream_host;
传递真实 IP 让后端拿到客户端真实 IP 而不是 Nginx 地址,Host 头也要一并透传 proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
WebSocket 代理 必须升级到 HTTP/1.1 并透传 Upgrade/Connection 头,同时拉长读超时防止长连接被断 proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 300s; 长连接必备
⚖️ 负载均衡
策略 / 参数说明示例
轮询(默认) 请求依次分发到各后端节点,无需任何额外配置 upstream app { server 10.0.0.1:8080; server 10.0.0.2:8080; }
weight 权重轮询 按权重分配流量,性能强的机器多分担 server 10.0.0.1:8080 weight=3;
ip_hash 同一客户端 IP 固定打到同一后端,最简单的会话保持方案 ip_hash; 会话保持
least_conn 把新请求分给当前连接数最少的后端,适合请求耗时不均的场景 least_conn;
hash 一致性哈希 按指定 key 哈希分片,增删节点时影响面小;配合 consistent 参数更平滑 hash $cookie_jsessionid consistent;
backup 备用节点 平时不接流量,主节点全部不可用时自动顶上;可配合 max_fails/fail_timeout 做被动健康检查 server 10.0.0.3:8080 backup;
down 摘除节点 标记后不再接收新请求,常用于发布前先摘流量、观察期后上线 server 10.0.0.2:8080 down; 发布摘流量
🔐 HTTPS 与安全
配置场景说明示例
SSL 证书配置 443 端口加 ssl 标记,指定证书与私钥文件,并限制只允许安全的 TLS 版本 listen 443 ssl;
ssl_certificate /etc/nginx/ssl/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
HTTP 强制跳转 HTTPS 单独用一个 server 监听 80 端口,301 永久跳转并保留原始 URI 与参数 return 301 https://$host$request_uri;
Gzip 压缩 文本类资源压缩传输,省带宽、加快首屏;注意补上 JSON/JS 等 MIME 类型 gzip on;
gzip_min_length 1k;
gzip_comp_level 5;
gzip_types text/css application/json application/javascript;
limit_req 限流 按 IP 限制请求速率:limit_req_zone 定义必须写在 http 上下文,limit_req 在 server/location 中引用;burst 允许突发排队,nodelay 不排队直接处理超额请求 limit_req_zone $binary_remote_addr zone=perip:10m rate=10r/s;
limit_req zone=perip burst=20 nodelay; 防刷防爬
limit_conn 并发限连 限制单个 IP 的同时连接数,压制大文件盗刷与长连接占用 limit_conn_zone $binary_remote_addr zone=perconn:10m;
limit_conn perconn 20;
防盗链 校验 Referer 合法性,放行本站与指定域名,非法来源直接拒绝 valid_referers none blocked server_names *.example.com;
if ($invalid_referer) { return 403; }
🩺 排错与性能
主题 / 指令说明示例
root 实际路径 = root + 完整 URI,location 与 root 各写各的、互不影响 location /img/ { root /data/www; }
# /img/a.png → /data/www/img/a.png
alias 实际路径 = alias 直接替换 location 匹配部分,两端斜杠必须一致,是最易踩坑的指令 location /img/ { alias /data/images/; }
# /img/a.png → /data/images/a.png ⚠ 易错:斜杠一致
502 Bad Gateway 后端连不上或返回非法响应:进程挂了、端口写错、防火墙拦截 curl 10.0.0.1:8080 验证后端存活
grep "connect() failed" error.log
504 Gateway Timeout 后端处理超过读超时:慢 SQL、下游接口卡死、线程池打满 proxy_read_timeout 300s;
proxy_connect_timeout 10s; 同时排查后端耗时
日志格式与排查 自定义 log_format 加入 $request_time$upstream_response_time,一眼定位慢在哪一层 tail -f error.log
awk '{print $1}' access.log | sort | uniq -c | sort -rn | head Top IP
配置校验与重载 任何修改先校验语法再平滑重载,master 进程热加载新配置、旧 worker 处理完再退出 nginx -t && nginx -s reload
静态文件性能 sendfile 内核态直接发送文件不落用户态,tcp_nopush 攒满包再发 sendfile on;
tcp_nopush on; 大文件传输
keepalive 复用连接 客户端到 Nginx 的长连接超时;对上游 upstream 也配 keepalive,减少反复建连开销 keepalive_timeout 65;
upstream app { keepalive 32; }