Nginx 基本概念与生产入门

Nginx 常被用作 Web 服务器、反向代理、负载均衡入口和 TLS 终止点。真正需要掌握的不是背诵配置,而是理解请求经过哪些阶段、配置放在哪个上下文,以及变更后怎样验证和回退。

Nginx 请求处理与反向代理示意图

一、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

七、生产检查清单

  1. 证书、私钥权限和到期时间受监控。
  2. 访问日志包含请求时间、上游地址、上游状态与上游响应时间。
  3. 日志配置轮转,磁盘空间有告警。
  4. 只信任明确的前置代理地址,不盲目信任任意 X-Forwarded-For。
  5. 上传大小、连接数、请求速率和超时符合业务实际。
  6. 变更前保存配置,变更后执行语法检查、功能验证和错误日志观察。
  7. 配置文件纳入版本管理,但私钥、口令和令牌不得提交。

延伸阅读

Copyright © yan-jian.com 2023 - 2026 · Powered by GitBook更新时间: 2026-10-16 08:51:34

results matching ""

    No results matching ""