Nginx实战复盘:反向代理配置错误导致服务不可用、限流失效、HTTPS异常、跨域漏洞彻底解决

Nginx实战复盘:反向代理配置错误导致服务不可用、限流失效、HTTPS异常、跨域漏洞彻底解决

前言

Nginx 是互联网系统中最常见的反向代理和网关组件,常用于:

  • 反向代理
  • 负载均衡
  • HTTPS 证书配置
  • 限流
  • 跨域处理
  • 静态资源服务
  • 动静分离
  • API 网关入口

很多开发者认为 Nginx 配置简单,无非就是写几个 serverlocationproxy_pass

但线上很多严重故障,恰恰源于 Nginx 配置细节错误:

  • 反向代理路径错误导致 404
  • HTTPS 证书配置错误导致全站不可访问
  • 限流规则写错导致限流失效
  • 跨域配置不严谨导致安全漏洞
  • 代理头信息丢失导致后端服务异常
  • 负载均衡策略不合理导致局部服务雪崩
    QQ20260801-183805.png

本文基于真实线上网关故障,完整还原 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 trueAllow-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 编码规范

  1. 所有域名必须配置 HTTPS,禁止生产环境使用裸 HTTP;

  2. 证书必须使用完整证书链,避免浏览器安全警告;

  3. 反向代理必须明确路径规则,注意 proxy_pass 末尾斜杠;

  4. 代理接口必须传递真实客户端 IP、Host、协议头;

  5. 跨域配置禁止无脑 ``,敏感接口必须限制可信域名;

  6. 活动、登录、支付等关键接口必须配置限流;

  7. 静态资源必须配置合理缓存时间;

  8. 负载均衡必须配置健康检查、失败重试和权重;

  9. 配置变更前必须执行 nginx -t

  10. 上线前必须检查错误日志、访问日志和接口返回。

    十三、总结

Nginx 配置看似简单,但每一个细节都可能影响全站可用性。

线上常见问题包括:

  • 反向代理路径错误
  • HTTPS 证书配置错误
  • 跨域配置不严谨
  • 限流规则未生效
  • 真实客户端 IP 丢失
  • 静态资源缓存不合理
  • 负载均衡健康检查缺失

生产环境核心准则:配置必须可验证、证书必须完整、路径必须明确、限流必须生效、日志必须可排查。

版权与友链信息

版权归属:凡尘

友情链接:凡尘博客 fanchenblog.com、wz.fanchenblog.com、雨落凡尘博客 b.fanchenblog.com、t.fanchenblog.com、凡尘乡音 y.fanchenblog.com、凡尘影院 a.fanchenblog.com

标签: none

添加新评论

  • 上一篇:
  • 下一篇: