Nginx 基本概念与生产入门
Nginx 常被用作 Web 服务器、反向代理、负载均衡入口和 TLS 终止点。真正需要掌握的不是背诵配置,而是理解请求经过哪些阶段、配置放在哪个上下文,以及变更后怎样验证和回退。
一、Nginx 在架构中的位置
- 静态资源服务器:直接返回 HTML、CSS、JavaScript、图片和下载文件。
- 反向代理:客户端只访问 Nginx,由 Nginx 把请求转发给后端应用。
- 负载均衡:将请求分配到多个上游实例,并配合超时、重试和健康检查策略。
- TLS 终止:集中管理 HTTPS 证书和加密套件,后端可继续使用 HTTP 或内部 TLS。
- 流量治理入口:完成限速、限并发、缓存、跨域、安全响应头和访问日志记录。
它不是应用服务器,也不会替代数据库、消息队列或完整的 API 网关。配置越复杂,越要明确哪些能力应由应用、网关或防火墙承担。
二、Master 与 Worker
主进程负责读取配置、绑定端口、管理 Worker 和执行平滑重载;Worker 负责处理实际连接。通常将 Worker 数量设为自动或接近可用 CPU 核数。
Nginx 使用事件驱动模型,一个 Worker 可以同时管理大量连接。高并发能力并不等于后端无限承载:上游连接池、文件句柄、超时、带宽和应用线程池仍可能成为瓶颈。
常用观察命令:
nginx -V
nginx -t
ps -ef | grep '[n]ginx'
ss -lntp | grep nginx
三、配置层级
| 上下文 | 主要用途 |
|---|---|
| main | Worker、日志、进程和全局资源设置 |
| events | 连接处理方式与连接数 |
| http | HTTP 通用设置、日志格式、压缩和上游定义 |
| server | 一个虚拟主机及其监听端口、域名和证书 |
| location | 路径匹配、代理、静态文件和访问控制 |
| upstream | 一组后端服务器和负载均衡策略 |
location 的匹配优先级容易出错。修改前应先确认是精确匹配、前缀匹配还是正则匹配,并用真实 URI 验证,而不是只看配置表面。
四、一个可验证的反向代理示例
upstream app_backend {
least_conn;
server 10.0.10.11:8080 max_fails=3 fail_timeout=10s;
server 10.0.10.12:8080 max_fails=3 fail_timeout=10s;
keepalive 32;
}
server {
listen 80;
server_name app.example.internal;
access_log /var/log/nginx/app.access.log;
error_log /var/log/nginx/app.error.log warn;
location / {
proxy_pass http://app_backend;
proxy_http_version 1.1;
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;
proxy_connect_timeout 3s;
proxy_read_timeout 60s;
}
}
不要直接在生产环境修改后重启。建议采用“备份—检查—重载—验证—观察”的顺序:
cp -a /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak
nginx -t
systemctl reload nginx
curl -I -H 'Host: app.example.internal' http://127.0.0.1/
journalctl -u nginx --since '-10 min'
reload 会让新 Worker 使用新配置,并让旧 Worker 处理完已有连接后退出;它比直接停止服务更适合常规配置变更。
五、超时与重试如何理解
proxy_connect_timeout:连接上游所允许的时间。proxy_read_timeout:两次读取上游响应之间允许等待的时间,不等同于整个请求总时长。proxy_send_timeout:向上游发送数据时的等待时间。proxy_next_upstream:什么情况下尝试下一台上游。对非幂等请求启用重试前必须评估重复提交风险。
不要为了“减少报错”把所有超时都设得很大。超时过长会占用连接和 Worker 资源,还会把真实故障隐藏成缓慢响应。
六、常见故障定位
| 现象 | 优先检查 |
|---|---|
| 502 Bad Gateway | 上游端口、进程、协议、DNS、SELinux、防火墙和错误日志 |
| 504 Gateway Timeout | 上游处理时长、读取超时、连接池和数据库慢查询 |
| 413 Request Entity Too Large | client_max_body_size 与应用上传限制 |
| 重定向循环 | X-Forwarded-Proto、应用可信代理设置和 HTTP/HTTPS 跳转规则 |
| 获取不到真实 IP | 前置代理链、real_ip_header 与可信来源网段 |
| 配置已改但未生效 | 编辑的文件是否被 include、nginx -T 输出和重载结果 |
完整展开生效配置可使用:
nginx -T
七、生产检查清单
- 证书、私钥权限和到期时间受监控。
- 访问日志包含请求时间、上游地址、上游状态与上游响应时间。
- 日志配置轮转,磁盘空间有告警。
- 只信任明确的前置代理地址,不盲目信任任意
X-Forwarded-For。 - 上传大小、连接数、请求速率和超时符合业务实际。
- 变更前保存配置,变更后执行语法检查、功能验证和错误日志观察。
- 配置文件纳入版本管理,但私钥、口令和令牌不得提交。
