Nginx实战复盘:反向代理配置错误导致服务不可用、限流失效、HTTPS异常、跨域漏洞彻底解决
Nginx实战复盘:反向代理配置错误导致服务不可用、限流失效、HTTPS异常、跨域漏洞彻底解决
前言
Nginx 是互联网系统中最常见的反向代理和网关组件,常用于:
- 反向代理
- 负载均衡
- HTTPS 证书配置
- 限流
- 跨域处理
- 静态资源服务
- 动静分离
- API 网关入口
很多开发者认为 Nginx 配置简单,无非就是写几个 server、location、proxy_pass。
但线上很多严重故障,恰恰源于 Nginx 配置细节错误:
- 反向代理路径错误导致 404
- HTTPS 证书配置错误导致全站不可访问
- 限流规则写错导致限流失效
- 跨域配置不严谨导致安全漏洞
- 代理头信息丢失导致后端服务异常
- 负载均衡策略不合理导致局部服务雪崩

本文基于真实线上网关故障,完整还原 Nginx 配置错误、影响范围、排查过程和生产级最佳实践。
一、真实线上故障场景还原
1.1 业务背景
公司活动页面上线,前端域名使用 HTTPS 访问,后端接口通过 Nginx 反向代理到内部服务。
上线后出现严重问题:
- 页面部分接口报 404
- 登录态丢失
- 跨域报错
- HTTPS 证书在部分环境提示不安全
活动高峰期没有被限流保护
1.2 错误配置示例
nginx
server {
listen 80;
server_name activity.example.com;
location / {
root /usr/share/nginx/html;
index index.html;
}
location /api {
proxy_pass http://127.0.0.1:8080;
}
}
这段配置看起来正常,但实际上存在多个问题。
二、反向代理路径错误导致 404
2.1 问题现象
前端请求:
http
https://activity.example.com/api/activity/list
Nginx 代理到后端后,实际请求路径变成:
http
http://127.0.0.1:8080/api/activity/list
如果后端接口路径不是 /api 开头,或者 Nginx 没有正确处理路径,就会出现 404。
2.2 常见错误一:proxy_pass 路径末尾斜杠问题
Nginx 的 proxy_pass 末尾是否加斜杠,会影响路径转发规则。
错误配置:
nginx
location /api {
proxy_pass http://127.0.0.1:8080;
}
请求:
http
/api/activity/list
转发到:
http
http://127.0.0.1:8080/api/activity/list
如果后端接口路径是 /activity/list,则会 404。
2.3 常见错误二:缺少 URI 重写
如果要去掉 /api 前缀,应该使用斜杠或 rewrite。
正确写法一:
nginx
location /api/ {
proxy_pass http://127.0.0.1:8080/;
}
请求:
http
/api/activity/list
转发到:
http
http://127.0.0.1:8080/activity/list
正确写法二:
nginx
location /api {
rewrite ^/api/(.)$ /$1 break;
proxy_pass http://127.0.0.1:8080;
}
三、HTTPS 配置错误导致全站不可访问
3.1 证书路径错误
很多 HTTPS 故障是因为证书文件路径配置错误或权限不足。
错误配置:
nginx
ssl_certificate /etc/nginx/ssl/server.crt;
ssl_certificate_key /etc/nginx/ssl/server.key;
如果文件不存在、权限过低、证书链不完整,Nginx 会启动失败或浏览器提示不安全。
3.2 证书链不完整
HTTPS 证书必须包含完整证书链。
常见问题:
- 只配置域名证书
- 缺少中间证书
- 证书顺序错误
- 证书过期
私钥不匹配
3.3 正确 HTTPS 配置
nginx
server {
listen 443 ssl http2;
server_name activity.example.com;
ssl_certificate /etc/nginx/ssl/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
root /usr/share/nginx/html;
index index.html;
}
}
建议使用完整证书链文件,避免浏览器安全警告。
四、HTTP 跳转 HTTPS 配置错误
4.1 错误跳转配置
很多配置会写:
nginx
server {
listen 80;
server_name activity.example.com;
return 301 https://$host$request_uri;
}
这个配置本身可以跳转,但如果没有处理 Websocket、静态资源、接口路径,可能导致循环跳转或资源加载失败。
4.2 推荐配置
nginx
server {
listen 80;
server_name activity.example.com;
location /.well-known/acme-challenge/ {
root /var/www/html;
}
location / {
return 301 https://$host$request_uri;
}
}
.well-known 路径用于证书续期验证,不能被 HTTPS 跳转拦截。
五、跨域配置错误导致安全漏洞
5.1 跨域问题现象
前端请求后端接口时报错:
text
No 'Access-Control-Allow-Origin' header is present on the requested resource.
5.2 错误配置:允许任意域名
很多开发者为了快速解决跨域,直接配置:
nginx
add_header Access-Control-Allow-Origin ;
这种方式虽然能解决问题,但在敏感接口场景下存在安全风险。
5.3 更安全的配置
nginx
location /api {
set $allowed_origin "";
if ($http_origin ~ "^(https://activity.example.com|https://www.example.com)$") {
set $allowed_origin $http_origin;
}
add_header Access-Control-Allow-Origin $allowed_origin;
add_header Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS";
add_header Access-Control-Allow-Headers "Content-Type, Authorization";
add_header Access-Control-Allow-Credentials "true";
if ($request_method = OPTIONS) {
return 204;
}
proxy_pass http://127.0.0.1:8080;
}
注意:如果使用 Allow-Credentials true,Allow-Origin 不能为 ``。
六、限流配置错误导致限流失效
6.1 限流没有生效
很多 Nginx 限流配置看起来写了,但实际没有生效。
常见原因:
limit_req_zone没有正确引用- 限流规则写错层级
- 没有命中
location - 内部跳转绕过限流
限流阈值设置过大
6.2 正确限流配置
nginx
http {
limit_req_zone $binary_remote_addr zone=activity_api:10m rate=10r/s;
server {
listen 443 ssl;
server_name activity.example.com;
location /api/ {
limit_req zone=activity_api burst=20 nodelay;
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}
含义:
10r/s:每秒最多 10 个请求burst=20:允许最多 20 个请求排队nodelay:排队请求立即处理七、反向代理头信息丢失
7.1 问题现象
后端服务拿到的客户端 IP 不是真实用户 IP,而是 Nginx 地址。
原因是代理头信息没有正确传递。
7.2 正确配置
nginx
location /api {
proxy_pass http://127.0.0.1:8080;
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;
}
后端服务应从以下字段获取真实信息:
http
X-Real-IP
X-Forwarded-For
X-Forwarded-Proto
八、负载均衡配置不合理
8.1 单点负载过高
错误配置:
nginx
upstream backend {
server 192.168.1.10:8080;
server 192.168.1.11:8080;
}
如果没有配置权重、健康检查、失败重试,某台服务异常后可能继续接收请求。
8.2 推荐配置
nginx
upstream backend {
least_conn;
server 192.168.1.10:8080 weight=10 max_fails=3 fail_timeout=30s;
server 192.168.1.11:8080 weight=10 max_fails=3 fail_timeout=30s;
}
说明:
least_conn:选择连接数最少的后端weight:权重max_fails:最大失败次数fail_timeout:失败后重试时间九、静态资源缓存配置错误
9.1 静态资源没有缓存
图片、JS、CSS 等资源如果没有缓存,会增加服务器压力。
9.2 正确缓存配置
nginx
location ~ .(jpg|jpeg|png|gif|ico|css|js|svg|woff|woff2|ttf|eot)$ {
expires 30d;
add_header Cache-Control "public, max-age=2592000";
access_log off;
}
十、生产级完整安全配置示例
nginx
user nginx;
worker_processes auto;
events {
worker_connections 10240;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
limit_req_zone $binary_remote_addr zone=activity_api:10m rate=20r/s;
server {
listen 80;
server_name activity.example.com;
location /.well-known/acme-challenge/ {
root /var/www/html;
}
location / {
return 301 https://$host$request_uri;
}
}
server {
listen 443 ssl http2;
server_name activity.example.com;
ssl_certificate /etc/nginx/ssl/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
root /usr/share/nginx/html;
index index.html;
location /api/ {
limit_req zone=activity_api burst=30 nodelay;
proxy_pass http://127.0.0.1:8080/;
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;
set $allowed_origin "";
if ($http_origin ~ "^(https://activity.example.com|https://www.example.com)$") {
set $allowed_origin $http_origin;
}
add_header Access-Control-Allow-Origin $allowed_origin;
add_header Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS";
add_header Access-Control-Allow-Headers "Content-Type, Authorization";
add_header Access-Control-Allow-Credentials "true";
if ($request_method = OPTIONS) {
return 204;
}
}
location ~ \.(jpg|jpeg|png|gif|ico|css|js|svg|woff|woff2|ttf|eot)$ {
expires 30d;
add_header Cache-Control "public, max-age=2592000";
access_log off;
}
}
}
十一、线上排查命令
11.1 检查 Nginx 配置
bash
nginx -t
11.2 重载配置
bash
nginx -s reload
11.3 查看错误日志
bash
tail -f /var/log/nginx/error.log
11.4 查看访问日志
bash
tail -f /var/log/nginx/access.log
11.5 测试端口连通性
bash
curl -I https://activity.example.com
11.6 测试代理路径
bash
curl https://activity.example.com/api/activity/list
十二、企业级 Nginx 编码规范
所有域名必须配置 HTTPS,禁止生产环境使用裸 HTTP;
证书必须使用完整证书链,避免浏览器安全警告;
反向代理必须明确路径规则,注意
proxy_pass末尾斜杠;代理接口必须传递真实客户端 IP、Host、协议头;
跨域配置禁止无脑 ``,敏感接口必须限制可信域名;
活动、登录、支付等关键接口必须配置限流;
静态资源必须配置合理缓存时间;
负载均衡必须配置健康检查、失败重试和权重;
配置变更前必须执行
nginx -t;上线前必须检查错误日志、访问日志和接口返回。
十三、总结
Nginx 配置看似简单,但每一个细节都可能影响全站可用性。
线上常见问题包括:
- 反向代理路径错误
- HTTPS 证书配置错误
- 跨域配置不严谨
- 限流规则未生效
- 真实客户端 IP 丢失
- 静态资源缓存不合理
- 负载均衡健康检查缺失
生产环境核心准则:配置必须可验证、证书必须完整、路径必须明确、限流必须生效、日志必须可排查。
版权与友链信息
版权归属:凡尘
友情链接:凡尘博客 fanchenblog.com、wz.fanchenblog.com、雨落凡尘博客 b.fanchenblog.com、t.fanchenblog.com、凡尘乡音 y.fanchenblog.com、凡尘影院 a.fanchenblog.com