Nginx反向代理配置踩坑指南:从入门到放弃再到精通

Nginx反向代理架构示意图

Nginx反向代理工作原理示意图,帮助理解请求转发流程。

最近折腾服务器,感觉Nginx反向代理这东西真的是看着简单,一上手全是坑。很多朋友(包括我自己)在配置网站宝塔面板、自建服务或者是给后端API做转发时,总会遇到各种奇奇怪怪的问题。今天就把平时遇到的那些“反人类”配置问题和解决办法整理一下,希望能帮大家少走弯路。

1. 代理之后页面样式全乱?Headers丢失问题

这是最常见的坑。你配置好了反向代理,能打开页面了,但是一片空白,或者是CSS、JS加载失败,后台还报错。

原因: 很多后端应用(或者前端框架)依赖请求头里的 HostX-Real-IP 或者 X-Forwarded-For 等信息来判断真实的域名来源。如果你不加透传,后端默认拿到的可能是 localhost 或者内网IP,导致资源引用路径错误。

502 Bad Gateway错误页面

常见的502 Bad Gateway错误界面,通常是后端服务连接问题导致的。

解决姿势:location 或者 server 块里加上这些标准配置:

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;

特别是 X-Forwarded-Proto,如果你的后端是强制HTTPS的,这个头如果不传,后端可能会无限重定向。

2. 502 Bad Gateway 与 连接超时

看到502错误,心态很容易崩。这通常意味着Nginx连接不到后端的服务。

排查思路:

  1. 后端起没起? 先进服务器 ps -ef | grep php 或者看看你的Docker容器是不是Running状态。
  2. 端口对不对? 检查 proxy_pass 后面的端口(比如 http://127.0.0.1:8080)是不是真的在监听,有没有被防火墙拦截。
  3. 超时设置: 有些业务处理耗时较长,默认的超时时间可能在60秒左右就断开了。如果是大文件上传或者复杂查询,需要手动加长:
proxy_connect_timeout 300;
proxy_send_timeout 300;
proxy_read_timeout 300;

3. WebSocket 连接失败 (400/502)

如果你在反代即时通讯应用、在线终端或者某些现代化的Web Dashboard,WebSocket连不上是常态。

核心配置: WebSocket需要HTTP长连接支持,Nginx默认会把连接切掉。必须显式upgrade头部。

proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";

记住这三行是标配,缺一不可。同时要确保上面的超时时间设置得足够大,不然WebSocket发呆一会儿就被踢了。

4. 强制HTTPS跳转循环

配置SSL证书后,想让HTTP请求自动跳转HTTPS,结果提示“重定向次数过多”。

原因: 你在Nginx里配置了 80 跳转 443,但是后端应用(比如WordPress、某些PHP程序)检测到自己是在 80 端口(因为经过反代),于是又发了一个 Location: https://... 的头。浏览器拿到后,又去访问Nginx的80,以此类推,死循环了。

解决: 除了前面提到的 proxy_set_header X-Forwarded-Proto $scheme;,还需要在后端应用里配置信任代理。如果是PHP,通常需要在 config 里设置 $_SERVER['HTTPS'] = 'on' 或者开启类似“Behind Reverse Proxy”的选项。不要让后端自己去判断协议,完全听Nginx传过来的头。

5. 静态资源缓存优化

反向代理不仅仅是转发,还能当做静态资源缓存层用,减轻后端压力。

简单的缓存配置示例:

proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m;

server {
    ...
    location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
        proxy_pass http://backend;
        proxy_cache my_cache;
        proxy_cache_valid 200 302 1h; # 状态码200和302缓存1小时
        expires 1h;
    }
}

总结

Nginx反向代理的配置其实非常有逻辑性,大部分问题都出在Headers透传协议升级上。遇到问题不要慌,开启Nginx的 error.log,那是你最好的朋友。把日志报错 copy 出来去搜,基本都能找到答案。希望这篇笔记能帮你省下几个小时的脱发时间!

标签: none

AI Skills Smart Station on Nick Launches

评论已关闭