Nginx 核心功能
核心功能
下面这张表覆盖了日常九成以上的用法。每一条都能直接用,关键是搞清楚它写在哪个 context 里。
| 功能 | 关键指令 / 配置 | 要点说明 |
|---|---|---|
| 反向代理 | proxy_pass、proxy_set_header |
proxy_pass http://127.0.0.1:3000;。若 URL 带路径且结尾有斜杠,匹配到的 location 前缀会被替换掉;结尾没斜杠则原样拼接。这是最容易踩的坑,改完必须实测。默认要转发 Host、X-Real-IP、X-Forwarded-For、X-Forwarded-Proto,否则后端拿到的全是 Nginx 的地址和 http 协议。 |
| 负载均衡:round-robin | upstream 默认策略 |
按顺序轮流分发。等价于不写任何策略关键字。适合后端实例配置一致、请求耗时接近的场景。 |
| 负载均衡:least_conn | least_conn; |
发给当前活跃连接数最少的后端。适合请求耗时差异大(有的几十毫秒、有的几秒)的场景,能避免慢请求全压在一台上。 |
| 负载均衡:ip_hash | ip_hash; |
按客户端 IP 的哈希固定到某一台,用于「会话粘性」。缺点是 NAT 后的用户会集中到同一台,且后端增减会打乱映射。有条件的话优先把 session 外置到 Redis,而不是靠 ip_hash。 |
| 被动健康检查 | max_fails、fail_timeout |
写在 upstream 的 server 行上。Nginx 开源版没有主动健康检查,只有「请求失败次数超阈值就暂时摘掉」的被动机制。要主动探测得用 Nginx Plus 或第三方模块。 |
| TLS / HTTPS | ssl_certificate、ssl_certificate_key、ssl_protocols、ssl_ciphers、ssl_session_cache |
只开 TLSv1.2 与 TLSv1.3,套用官方的 ssl_ciphers 推荐值,开 ssl_session_cache shared:SSL:10m; 减少握手开销。HTTP 站点要做 301 跳转到 HTTPS。证书续期交给 certbot 或 acme.sh,续期后要 reload。 |
| gzip 压缩 | gzip、gzip_types、gzip_min_length、gzip_comp_level、gzip_vary |
只压缩文本类响应(text/、application/json、application/javascript 等),图片和视频本身已压缩,再 gzip 纯属浪费 CPU。gzip_comp_level 一般 3 到 5 就够,再往上收益很小而 CPU 涨得快。静态资源建议提前生成 .gz 文件并用 gzip_static on; 直接发,省掉运行时压缩。 |
| 响应缓存 proxy_cache | proxy_cache_path、proxy_cache、proxy_cache_key、proxy_cache_valid |
把后端响应缓存到磁盘,命中后不打扰后端。对读多写少的接口效果好。要注意带 Cookie 的个性化响应不能缓存,需要 proxy_cache_bypass / proxy_no_cache 做区分。缓存目录由 proxy_cache_path 定义在 http 块,只在 server / location 里用 proxy_cache 引用。 |
| 请求限流 limit_req | limit_req_zone、limit_req、burst、nodelay |
按请求速率限流。limit_req_zone $binary_remote_addr zone=xxx:10m rate=10r/s; 定义在 http 块,limit_req zone=xxx burst=20 nodelay; 用在 location。超出速率但未超 burst 的请求排队或直接放行(nodelay),再超的返回 503。 |
| 连接数限流 limit_conn | limit_conn_zone、limit_conn |
限制单 IP 同时保持的连接数,防慢速连接占满资源。常和 limit_req 一起用:一个管速率,一个管并发。 |
| URL 重写与跳转 | rewrite、return、try_files |
纯跳转优先用 return 301,比 rewrite 快且语义清晰。rewrite 适合需要正则捕获的场合。注意 rewrite ... last 与 break 的区别:last 会重新走一遍 location 匹配,break 不会。 |
| WebSocket 代理 | proxy_http_version 1.1、Upgrade、Connection |
WebSocket 依赖 HTTP/1.1 的协议升级握手,必须显式设置 proxy_set_header Upgrade $http_upgrade; 和 proxy_set_header Connection $connection_upgrade;。同时要放宽 proxy_read_timeout,否则空闲的长连接会被 Nginx 掐断。 |
| 访问日志定制 | log_format、access_log |
建议在日志里带上 $request_time 和 $upstream_response_time,前者是 Nginx 看到的端到端耗时,后者是后端耗时。两者差得多说明瓶颈在网络或 Nginx 侧,几乎相等说明瓶颈在后端。 |

