核心 · Key Idea
一句话:nginx 是 C 写的事件驱动 web 服务器,扮演反向代理 / 静态服务器 / 负载均衡 / TLS 终止等多种角色,在生产环境部署量最大。配置文件是它的 API。
是什么#
最常见的两种用法:
# 反向代理一个后端服务
server {
listen 443 ssl http2;
server_name api.example.com;
ssl_certificate /etc/letsencrypt/live/api/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/api/privkey.pem;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
# 多后端负载均衡
upstream app {
server 10.0.0.11:8080 weight=1;
server 10.0.0.12:8080 weight=2;
keepalive 64;
}打个比方#
打个比方 · Analogy
nginx 像酒店前台 + 总机:客人进门先到他这里,他接待(TLS 终止)、指路(路由 / 路径匹配)、叫号(负载均衡)、记录(access log)。后台真正干活的是客房服务员(你的应用)。
关键概念#
Worker Processes工作进程
事件驱动 + 多 worker。auto 通常等于 CPU 核数。
Location Match路径匹配
= 精确 / ^~ 前缀(不再正则)/ ~ 正则 / 默认前缀。优先级有讲究。
Upstream上游
后端服务组。可以加 keepalive、weight、最少连接、ip_hash。
Map / If条件
map 是定义阶段映射、if 在 server/location 内做条件判断(**慎用 if**)。
Try Filesfallback
`try_files $uri $uri/ /index.html` —— SPA 必备。
Limit Req限流
基于 leaky bucket 的速率限制:`limit_req_zone $binary_remote_addr zone=...`。
怎么工作#
事件驱动模型让 nginx 单进程能扛 10 万 +长连接。
实操要点#
nginx -t:每次改完先 test,再nginx -s reload。不要直接 restart。- 统一
proxy_set_header:尤其Host/X-Forwarded-For/X-Forwarded-Proto,后端要识别真实客户端。 - WebSocket 反代:必须
proxy_http_version 1.1+Upgrade+Connection "upgrade"。 - 静态资源:用
expires 1y; add_header Cache-Control "public, immutable";配版本化文件名。 - gzip/brotli:开 gzip 几乎免费;brotli 需要第三方模块,效果更好。
- 日志格式:常见的 combined 不够,建议加
$request_time和$upstream_response_time区分本地慢与上游慢。 - 常用工具:openresty(nginx + LuaJIT)让你在 nginx 里写 Lua 拦截 / 改写请求。
易混点#
nginx
手动配 TLS / 高度可调。
生态最大、文档最全。
生态最大、文档最全。
Caddy
自动 HTTPS、配置极简。
生态较小,定制能力略弱。
生态较小,定制能力略弱。