最近在折腾 Nginx 反向代理,配置好后端服务明明跑着好好的,浏览器一访问却给我甩了个脸色——503 Service Unavailable。这报错看着让人头大,毕竟后端服务是通的,为什么 Nginx 就说不可用呢?

其实遇到 503 错误,别急着重启服务,冷静下来按照这个思路排查,通常十分钟内就能找到病灶。今天就把这套排查流程整理出来,分享给同样在踩坑的朋友们。

一、先确认后端是不是真的“通”

很多时候我们觉得后端正常,是因为在本机或者内网环境下访问没问题,但 Nginx 所在的服务器网络环境可能不同。

第一步:直接通后端端口试试

别光在浏览器看,直接登录到安装 Nginx 的服务器上,用 curl 命令直接访问后端地址:

curl -I http://127.0.0.1:你的后端端口
# 或者
curl -I http://后端服务器IP:端口

如果这里直接报错或者超时,那问题肯定出在后端服务或者网络链路上(比如防火墙拦截),跟 Nginx 配置关系不大。如果这里返回 200 OK,那说明链路是通的,锅就得让 Nginx 背了,接着往下看。

二、检查 Nginx 错误日志(最重要!)

千万别瞎猜,Nginx 的 error.log 里通常会有最直接的线索。日志文件一般在 /var/log/nginx/error.log,用 tail 命令实时监控一下:

tail -f /var/log/nginx/error.log

然后刷新你的页面,看看日志里吐出了什么。

  • 如果是 connect() failed (111: Connection refused):说明 Nginx 根本连不上后端。检查 Nginx 配置里的 proxy_pass 地址写对了吗?后端服务真的在监听那个 IP 和端口吗?
  • 如果是 connect() failed (110: Connection timed out):连上了但是没反应,可能是后端处理太慢,或者有云服务商的安全组/防火墙把连接掐断了。
  • 如果是 upstream prematurely closed connection:后端主动把连接关了,可能是后端程序崩了,或者是 Nginx 发送的 Header 太大被后端拒收。

三、常见配置坑位

n

1. Header 头部大小限制

有些后端应用(比如一些 API 或者复杂的网站)返回的 Header 比较大,或者转发时带了一堆 Cookie。如果 Nginx 默认的缓冲区不够,就会 503。

试试在 httpserverlocation 块里加上:

proxy_buffer_size 128k;
proxy_buffers 4 256k;
proxy_busy_buffers_size 256k;

2. 超时设置太短

如果你的后端业务比较重,处理一个请求需要好几秒,而 Nginx 默认超时时间只有 60 秒,也会导致 503。适当调大超时时间:

proxy_connect_timeout 300;
proxy_send_timeout 300;
proxy_read_timeout 300;

四、SSL/HTTPS 的特殊坑

评论区有朋友提到“开启 HTTPS,配置 SSL 证书”,这确实是一个高频坑点。

如果你开启了 HTTPS 反代(Nginx 是 HTTPS),但后端依然是 HTTP,通常需要加上:

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,很多后端框架(如 Django, WordPress 等)会检测这个头来判断是否是 HTTPS,如果没设置好,后端可能会重定向或者直接拒绝响应,让你误以为是 503。

此外,如果你的 Nginx 要去反代一个 HTTPS 的后端源站,你需要配置好 CA 证书验证,或者临时关闭验证(仅测试用):

proxy_ssl_server_name on;
# proxy_ssl_verify off; # 测试环境下可以用这个跳过证书验证

五、后端服务本身罢工

虽然你说后端服务正常,但在高并发或者处理特定请求时,后端进程可能会崩溃或进入死锁。

  • 检查后端服务的资源占用(CPU、内存),是不是 OOM 了?
  • 如果是 Docker 容器,看看容器是不是反复重启?
  • 数据库连接池是不是满了?导致后端无法建立新连接。

总结一下

遇到 503,排查顺序建议是:

  1. 本地 curl 后端,排除网络和后端假死问题。
  2. 看 Nginx error.log,定位是连接拒绝、超时还是连接中断。
  3. 检查超时和缓冲区配置,尤其是大文件传输或慢速接口。
  4. 确认 Header 转发设置,特别是 HTTPS 相关的头部。

希望能帮你省下几个抓头发的夜晚!如果你还有其他奇奇怪怪的报错,欢迎在评论区交流。

标签: none

AI Skills Smart Station on Nick Launches

评论已关闭