Nginx 是 fenij.com 上所有 Web 服务的前端,也是大部分运维问题的第一现场。502、504、SSL 报错、性能瓶颈——这些问题的根因往往不在 Nginx 本身,但表现都集中在 Nginx 层面。这篇手册把 Nginx 从安装配置到故障排查的完整流程串起来,遇到问题可以先在这里定位方向,再深入到具体文章。
一、Nginx 的角色和常见故障分布
在典型的 LNMP 架构里,Nginx 负责接收 HTTP 请求、转发给后端(PHP-FPM、uWSGI、Node.js),再把结果返回给客户端。大部分故障发生在三个环节:
- 请求入口:SSL 证书问题、域名解析、端口监听
- 反向代理:后端服务挂了或响应太慢,导致 502/504
- 性能瓶颈:连接数打满、worker 不够、buffer 太小
下面按这个顺序展开。
二、SSL 证书配置
HTTPS 是现代网站的标配,Let’s Encrypt 提供免费证书。Nginx 配置 SSL 证书的核心是 certbot 工具,它能自动申请证书、修改 Nginx 配置、设置自动续期。
基本流程:
# 安装 certbot
apt install certbot python3-certbot-nginx
# 申请证书并自动修改 nginx 配置
certbot --nginx -d example.com -d www.example.com
# 测试自动续期
certbot renew --dry-run
证书过期是最常见的 SSL 问题。Let’s Encrypt 证书有效期 90 天,如果 certbot 的定时续期任务出问题,证书就会过期导致浏览器报错。关于证书过期的确认和续期操作,可以参考 HTTPS 证书过期怎么办?确认与续期完整指南。
如果你从零开始配置 Let’s Encrypt SSL,详细步骤见 Nginx 配置 Let’s Encrypt SSL 证书完整教程。
SSL 配置完成后还要注意混合内容问题——页面里如果有 HTTP 资源引用,浏览器会报不安全。关于混合内容的修复方法,参考 WordPress 启用 HTTPS 后混合内容修复指南。
三、502 Bad Gateway 排查
502 是 Nginx 最常见的错误,意思是 Nginx 无法从后端服务获取有效响应。根因通常是后端服务挂了、端口不对、或者后端响应超时。
排查 502 的标准流程:
- 检查后端服务是否在运行:
systemctl status php-fpm(或你的后端服务) - 检查 Nginx 配置里的 upstream 端口和后端监听端口是否一致
- 查看 Nginx 错误日志:
tail -50 /var/log/nginx/error.log - 检查后端服务日志有没有报错
- 如果是 PHP-FPM,检查 socket 文件权限和路径
关于 502 的详细排查步骤和真实案例,参考 Nginx 502 Bad Gateway 怎么办?原因定位与解决全流程。如果想看一个完整的 502 排查实战案例,参考 Nginx 502 故障排查实战:从日志到根因。
四、504 Gateway Timeout 排查
504 和 502 的区别:502 是后端根本没响应(挂了或连不上),504 是后端在响应但太慢了,Nginx 等不及了就断开。常见于 PHP 脚本执行时间过长、数据库慢查询、或者外部 API 调用超时。
解决 504 的思路:
- 调大 Nginx 的
proxy_read_timeout和fastcgi_read_timeout - 优化后端脚本执行时间(优化数据库查询、加缓存)
- 如果是偶尔慢,考虑加重试机制
详细配置和排查步骤参考 Nginx 504 Gateway Timeout 怎么办?超时优化与排查指南。
五、性能调优
Nginx 本身的性能通常不是瓶颈,但默认配置偏保守。在高流量场景下需要调整:
worker 进程:
# nginx.conf
worker_processes auto; # 自动匹配 CPU 核心数
worker_connections 10240; # 每个 worker 的最大连接数
缓冲区(反向代理场景):
proxy_buffer_size 16k;
proxy_buffers 8 16k;
proxy_busy_buffers_size 32k;
gzip 压缩:
gzip on;
gzip_min_length 1000;
gzip_types text/plain text/css application/json application/javascript text/xml;
静态文件缓存:
location ~* \.(jpg|png|gif|css|js|woff2)$ {
expires 30d;
add_header Cache-Control "public, no-transform";
}
六、Nginx 故障速查表
| 错误 | 含义 | 首先检查 |
|---|---|---|
| 502 | 后端无响应 | 后端服务状态、端口、socket 权限 |
| 504 | 后端超时 | proxy_read_timeout、后端脚本执行时间 |
| SSL_ERROR | 证书问题 | 证书过期时间、证书路径、中间证书链 |
| 413 | 请求体太大 | client_max_body_size |
| 499 | 客户端主动断开 | 通常是用户取消或前端超时 |
| 301/302 循环 | 重定向死循环 | HTTPS 跳转配置、www/非 www 跳转 |
七、日志配置建议
Nginx 的日志是排查问题的第一手资料。建议把日志格式改成包含响应时间:
log_format main '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'rt=$request_time urt=$upstream_response_time';
access_log /var/log/nginx/access.log main;
这样每条访问日志都带上了请求总时间(rt)和后端响应时间(urt),排查慢请求一目了然。
八、日常维护清单
- 每周检查证书有效期:
echo | openssl s_client -connect example.com:443 2>/dev/null | openssl x509 -noout -dates - 每周查看错误日志:
grep -i error /var/log/nginx/error.log | tail -50 - 每月检查配置语法:
nginx -t - 定期清理日志(logrotate)避免磁盘占满
- 关注 Nginx 安全更新:
apt list --upgradable | grep nginx
更多 Nginx 运维教程,请访问 fenij.com。
常见问题
问:Nginx 配置改了之后怎么验证不会中断服务?
答:先 nginx -t 验证语法,再 nginx -s reload 平滑重载。reload 不会断开现有连接,新连接走新配置。如果配置有问题,reload 会报错并继续用旧配置,不会中断服务。
问:502 和 504 交替出现是什么情况?
答:说明后端服务在临界状态——有时候直接挂了(502),有时候还在跑但太慢(504)。重点查后端的内存和 CPU 使用率,可能是 OOM 或者进程数不够导致间歇性无响应。
问:Nginx worker_connections 设多大合适?
答:公式:worker_processes × worker_connections ≥ 预期最大并发连接数。一般 VPS 上设 10240 够用。如果内存紧张,注意每个连接大约占 256KB-512KB 内存,1 万连接大约需要 2.5-5 GB。