← 返回场景决策

🟢 Nginx 能力与生产实战

结果导向 · 能力全景 / 反向代理 / 负载均衡 / HTTPS / 限流 / 灰度发布

反向代理 负载均衡 HTTPS Gzip 限流 灰度发布 静态资源

① 直接给结论

Nginx 是什么(一句话):一个高性能的 HTTP 服务器 + 反向代理,用事件驱动(epoll)单机扛几万并发连接。几乎是所有 Web 项目的"统一入口标配"。

什么场景该用 Nginx:

场景Nginx 在里面干什么不用会怎样
Java/Node/Python 服务对外反向代理,隐藏后端真实地址,统一 80/443 入口后端直接暴露端口,证书/限流/日志都得各服务自己搞
多台后端实例分流负载均衡,把请求分到多台机器得自己写分流逻辑或用更重的网关
前端静态资源(JS/CSS/图片)直接吐文件,比 Tomcat 快一个量级静态走后端应用服务器,浪费应用性能
HTTPS 上线证书在 Nginx 终结,后端走 HTTP,证书集中管理每个后端服务都要配证书,运维噩梦
灰度/蓝绿/A-B 发布按比例或按规则切流量到新版本得停机切换或上更复杂的发布系统
一句话选型:只要你的项目是对外提供 Web 服务的(不管后端是 Java/Go/Node/Python),前面放一个 Nginx 几乎都是默认选择——它便宜、快、稳、配置简单。真正要想的是"还要不要上更重的东西(API 网关/Service Mesh)",而不是"要不要 Nginx"。

② Nginx 是什么 + 能力全景

定位:Nginx 不是一个应用服务器(不跑你的业务代码),它是一个"流量入口层"。你的 Spring Boot 应用是"干活的人",Nginx 是"门口的前台 + 调度员",所有外部请求先到它,它再分发、过滤、转发。

关键认知(容易混的点):反向代理 ≠ 正向代理。
正向代理 = 代购:你(客户端)找代购帮你买东西,商家不知道你是谁。代理的是客户端。典型:VPN、爬虫代理池。
反向代理 = 公司前台:外面的人找前台,前台转给具体部门,部门不直接对外。代理的是服务端。Nginx 干的就是这个。

核心能力全景(6 大块):

📁
静态资源服务
直接读文件吐回去,支持 sendfile 零拷贝。吐静态文件比 Tomcat 快 10 倍以上,前端打包产物放 Nginx 是标准做法。
🔀
反向代理
proxy_pass 把请求转发到后端,隐藏后端真实地址,统一入口。可以改请求头、改路径。
⚖️
负载均衡
upstream 定义一组后端,5 种分流策略:轮询/权重/ip_hash/least_conn/一致性 hash。像银行叫号机把客户分到不同窗口。
🔒
HTTPS 终结
证书在 Nginx 这一层加解密,后端走明文 HTTP。证书集中管理,后端不用关心 HTTPS。
🛡️
限流/熔断
limit_req 按请求速率限流,limit_conn 按并发连接数限流。挡在应用前面,保护后端不被打挂。
🎯
灰度/AB 流量切分
split_clients / map 按用户或比例把流量切到不同 upstream。蓝绿、金丝雀、A-B 测试都能做。
PRO TIP Nginx vs 应用服务器的本质区别:Nginx 是事件驱动(一个 worker 进程用 epoll 同时盯几万连接),Tomcat 是线程模型(一个请求占一个线程)。所以 Nginx 扛并发能力强得多,但它不跑业务逻辑——业务还得交给后端应用。两者是配合关系,不是替代关系。

③ Nginx vs 其他同类

常被拿来和 Nginx 比的有:Apache(老牌 HTTP 服务器)、HAProxy(专业负载均衡器)、云厂商 ALB/SLB(云负载均衡)。结果导向直接看下表:

维度 Nginx Apache HAProxy 云 ALB/SLB
定位 HTTP服务器+反向代理+LB,全能 老牌HTTP服务器 专业四层/七层负载均衡 云上托管的负载均衡
并发模型 事件驱动(epoll),单机几万连接 多进程/多线程,连接多了吃内存 事件驱动,专精LB 云端弹性,不用管容量
强项 静态资源+反代+LB+HTTPS+限流全都能干 动态模块丰富,老项目兼容 LB 策略最全,健康检查最细 免运维,自动扩容,和高可用绑定
弱项 健康检查较弱(开源版被动检查) 并发能力不如 Nginx 不能吐静态文件,不做HTTPS证书管理 贵(按量计费),配置灵活度低
什么时候选它 ✅ 默认选择,Web 入口几乎都用它 维护老项目才用 需要极精细 LB 策略/健康检查时 全量上云、不想自己运维 LB 时
实际怎么搭:最常见的组合是 云 ALB → Nginx → 后端应用。云 ALB 负责入口高可用和跨可用区,Nginx 负责具体路由/限流/HTTPS/灰度,后端干活。小项目直接 Nginx → 后端就够了,云 ALB 那层可以省。

④ 配置长啥样(nginx.conf 结构)

Nginx 的配置是嵌套块结构,从外到内四层:main → events → http → server → location。理解这个层级,看任何 Nginx 配置都不会懵。

/etc/nginx/nginx.conf
📁 /etc/nginx/
nginx.conf
⭐ 当前文件
📁 conf.d/
default.conf
api.conf
📁 ssl/
server.crt
server.key
# ───── main 块:全局配置 ───── user nginx; worker_processes auto; # worker 进程数,通常=CPU核数 error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; # ───── events 块:连接相关 ───── events { worker_connections 10240; # 每个 worker 最大连接数 } # ───── http 块:HTTP 服务相关 ───── http { include mime.types; default_type application/octet-stream; sendfile on; # 零拷贝,吐静态文件用 keepalive_timeout 65; # ── upstream:定义一组后端(负载均衡用)── upstream backend { server 10.0.0.1:8080 weight=3; server 10.0.0.2:8080 weight=1; } # ── server:一个虚拟主机(一个域名对应一个)── server { listen 80; server_name www.example.com; # ── location:按 URL 路径匹配,最细粒度 ── location / { root /usr/share/nginx/html; index index.html; } location /api/ { proxy_pass http://backend; } } }

请求匹配 location 的流程(最容易踩坑的地方):

请求 /api/user/login 匹配 server (按域名) 匹配 location (按路径)
location 匹配优先级(从高到低):
① = 精确匹配 ② ^~ 前缀匹配(不再正则) ③ ~ / ~* 正则匹配 ④ 普通前缀匹配
记住这个优先级,能避免 80% 的 location 配错事故。很多人以为 location 按"从上到下"匹配,其实是按类型优先级匹配。后面坑与事故里会专门讲。

⑤ 核心配置实战(7 个常用场景)

下面是生产里用得最多的 7 段配置,每段都能直接抄。配置都用 IDE 窗口展示,重点是看懂每行在干嘛

5.1 反向代理(最基础,必会)

conf.d/api.conf
server { listen 80; server_name api.example.com; location /api/ { proxy_pass http://127.0.0.1:8080; # 转发到本地 Spring Boot # 关键三件套:把客户端真实信息透传给后端 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_connect_timeout 5s; # 连后端超时 proxy_read_timeout 30s; # 读后端响应超时 } }
为什么要传这三个头?后端经过 Nginx 转发后,request.getRemoteAddr() 拿到的是 Nginx 的 IP(127.0.0.1),不是用户真实 IP。要拿真实 IP 得读 X-Forwarded-For。Spring Boot 里用 request.getHeader("X-Forwarded-For") 取。不传这三个头,后端日志、风控、限流全瞎。

5.2 负载均衡(5 种分流策略)

conf.d/upstream.conf
# 策略1:轮询(默认),请求轮流分 upstream backend { server 10.0.0.1:8080; server 10.0.0.2:8080; } # 策略2:权重,机器强的多分 upstream backend { server 10.0.0.1:8080 weight=3; # 3/4 流量 server 10.0.0.2:8080 weight=1; # 1/4 流量 } # 策略3:ip_hash,同一用户固定打到同一台(会话保持) upstream backend { ip_hash; server 10.0.0.1:8080; server 10.0.0.2:8080; } # 策略4:least_conn,分给当前连接数最少的(最均衡) upstream backend { least_conn; server 10.0.0.1:8080; server 10.0.0.2:8080; } # 策略5:一致性 hash(按某个key固定,扩缩容时影响最小) upstream backend { hash $request_uri consistent; server 10.0.0.1:8080; server 10.0.0.2:8080; }
策略适用场景注意
轮询后端机器配置一样,无状态默认,不用写
权重机器配置不一样,强的多扛
ip_hashSession 存本地、要会话保持用户 IP 变了会漂移,不完美
least_conn请求处理时间差异大最均衡,推荐
一致性hash有本地缓存,要尽量命中同一台扩容时只影响一部分流量

5.3 HTTPS(证书 + HTTP 跳转)

conf.d/ssl.conf
# HTTP 全部 301 跳到 HTTPS server { listen 80; server_name www.example.com; return 301 https://$host$request_uri; } # HTTPS 主配置 server { listen 443 ssl; server_name www.example.com; ssl_certificate /etc/nginx/ssl/server.crt; # 证书公钥 ssl_certificate_key /etc/nginx/ssl/server.key; # 证书私钥 ssl_protocols TLSv1.2 TLSv1.3; # 只开 1.2/1.3 ssl_ciphers HIGH:!aNULL:!MD5; location / { proxy_pass http://backend; } }
为什么证书放 Nginx?这叫"HTTPS 终结"——加解密在 Nginx 完成,Nginx 到后端走明文 HTTP(内网安全)。好处:①后端不用配证书,省事;②后端不用做加解密,省 CPU;③证书续期只改 Nginx 一个地方。

5.4 Gzip 压缩(前端必开)

nginx.conf (http 块)
gzip on; gzip_min_length 1k; # 小于1k不压,划不来 gzip_comp_level 6; # 压缩级别1-9,6是甜点 gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; gzip_vary on; # 加 Vary: Accept-Encoding 头
PRO TIP 开了 Gzip,前端 JS/CSS 体积能压到 1/3~1/4,首屏加载快很多。但别压图片/视频(已经是压缩格式,再压没用还费 CPU),所以 gzip_types 里别写 image/png 之类。

5.5 静态资源(expires 缓存)

conf.d/static.conf
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff2?)$ { root /usr/share/nginx/html; expires 30d; # 浏览器缓存30天 add_header Cache-Control "public, no-transform"; } # 前端 Vue/React 打包产物:index.html 不能缓存(否则发版刷不出来) location = /index.html { root /usr/share/nginx/html; add_header Cache-Control "no-cache, no-store, must-revalidate"; } # SPA 路由回退:刷新 /user/profile 不能 404,要回退到 index.html location / { try_files $uri $uri/ /index.html; }
SPA 部署三大坑全在这段配置里:①静态资源要长缓存(带 hash 的文件名);②index.html 要 no-cache(否则发版刷不出新版);③try_files ... /index.html 是前端路由刷新 404 的唯一解。Vue/React 项目上线必查这三点。

5.6 限流(limit_req)

nginx.conf
# http 块里定义限流规则 limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s; # 按客户端IP限流,每秒10个请求,zone叫api_limit,占10m内存 server { location /api/ { limit_req zone=api_limit burst=20 nodelay; # burst=20: 允许突发20个排队; nodelay: 突发的不延迟直接放行 proxy_pass http://backend; } }
PRO TIP burst 和 nodelay 是限流最容易配错的两个参数。burst=20 表示"桶能装20个等待请求",nodelay 表示"等待的请求不延迟、能放就立刻放"。没加 nodelay 的话,突发请求会被排队延迟处理(响应变慢但不报错);加了 nodelay,超出的直接 503。保护接口防刷用 nodelay,保护用户体验不加 nodelay。

5.7 灰度/AB(split_clients 按比例切流量)

conf.d/canary.conf
# 按 cookie 值哈希,10%流量走新版(v2),90%走老版(v1) split_clients "${cookie_userid}" $upstream_pool { 10% v2; # 10% 用户 → v2 * v1; # 其余 90% → v1 } upstream v1 { server 10.0.0.1:8080; } # 老版本 upstream v2 { server 10.0.0.9:8080; } # 新版本 server { location /api/ { proxy_pass http://$upstream_pool; } }
灰度发布的典型节奏:10% → 50% → 100%。先放 10% 流量给新版观察 1 小时,没问题改 50%,再观察,最后全量 100%。出问题立刻把 split_clients 改回 0% v2,秒级回滚。这是 Nginx 做灰度最大的优势:改个配置 reload 一下就切了,不用停机。

⑥ 生产场景(3 个带界面演示)

场景 1:高并发下后端响应变慢 → Nginx 接管静态 + 反代

背景:某电商首页大促前压测,QPS 上到 2000,后端 Spring Boot 扛不住——因为前端 JS/CSS/图片都从 Tomcat 走,Tomcat 线程全被静态资源占满了,业务接口排队超时。

方案:静态资源交给 Nginx 直接吐,业务接口走反代。改完 QPS 5000 都扛得住。

改配置前后对比(access log 流):
📊 Nginx Access Log 实时流 统计 最近 1 分钟
🔴 优化前(静态走 Tomcat,后端排队)
203.0.113.5 GET /static/js/app.3f2a.js 200 0.842s ⚠ 慢
203.0.113.6 GET /static/css/main.css 200 0.731s ⚠ 慢
203.0.113.7 GET /api/products 504 30.000s ⚠ 超时
203.0.113.8 GET /static/img/banner.png 200 0.915s ⚠ 慢
203.0.113.9 GET /api/products 504 30.000s ⚠ 超时
🟢 优化后(静态 Nginx 吐,接口秒回)
203.0.113.5 GET /static/js/app.3f2a.js 200 0.003s
203.0.113.6 GET /static/css/main.css 200 0.002s
203.0.113.7 GET /api/products 200 0.045s
203.0.113.8 GET /static/img/banner.png 200 0.004s
203.0.113.9 GET /api/products 200 0.052s
优化前 QPS
2000
已撑不住
优化后 QPS
5000
2.5倍提升
优化前接口耗时
30s
504超时
优化后接口耗时
45ms
正常
# 关键就这两段 location location ~* \.(js|css|png|jpg|svg|woff2?)$ { root /usr/share/nginx/html; # Nginx 直接吐,不碰 Tomcat expires 30d; } location /api/ { proxy_pass http://backend; # 只有 API 走后端 }
PRO TIP Tomcat 不是用来吐静态文件的。它的线程模型是"一个请求一个线程",静态资源请求把线程占满,业务接口就没线程处理了。把静态资源从应用服务器剥离到 Nginx,是性价比最高的优化,没有之一。

场景 2:灰度发布新版本 → 流量按比例切换

背景:订单服务要上线 v2 版本(重构了计费逻辑),不敢全量上。用 Nginx split_clients 做灰度,先放 10% 流量观察,逐步放量到 100%。

🎯 灰度流量分配面板 order-service user-service 实时
总 QPS
1,240
订单接口
v1 错误率
0.02%
正常
v2 错误率
0.08%
可接受
v2 平均耗时
62ms
比v1高15ms
灰度进度(点击 reload 切换比例):
第1阶段 10:00
v1 90%
v2
第2阶段 11:00
v1 50%
v2 50%
第3阶段 12:00
v2 100% ✅
v1 老版本 (10.0.0.1) v2 新版本 (10.0.0.9)
UP v1: 10.0.0.1:8080 权重1 失败 0
UP v2: 10.0.0.9:8080 权重1 失败 2
灰度操作流程:①改 split_clients 比例 → ②nginx -t 校验 → ③nginx -s reload 热加载 → ④盯监控看 v2 错误率/耗时 → ⑤没问题继续放量,有问题改回 0% 秒级回滚。整个过程不停机、不丢请求(reload 是优雅的,老 worker 处理完手头请求再退)。
# 第2阶段:50/50 split_clients "${cookie_userid}" $upstream_pool { 50% v2; * v1; } # 改完执行: # nginx -t && nginx -s reload

场景 3:被恶意刷接口 → Nginx 限流挡在最前

背景:某活动接口 /api/coupon/grab 被脚本疯狂刷,QPS 飙到 8000,后端 MySQL 连接池被打满,正常用户全部超时。加 Nginx 限流:单 IP 每秒最多 10 次,超出直接 503。

🛡️ 限流监控面板 /api/coupon/grab 全部接口 最近 5 分钟
总请求
42,318
5分钟
放行
8,412
20%
拒绝(503)
33,906
80% 挡住
后端 QPS
28
已保护
被限流的 TOP IP(异常流量来源):
封禁 182.16.34.7 1280 req/s 拒绝 99.2%
封禁 182.16.34.9 1102 req/s 拒绝 99.1%
正常 203.0.113.5 3 req/s 拒绝 0%
正常 203.0.113.6 2 req/s 拒绝 0%
限流后 error.log:
13:42:01 [limit_req] limiting requests, excess: 5.2 by zone api_limit 182.16.34.7
13:42:01 [limit_req] limiting requests, excess: 4.8 by zone api_limit 182.16.34.9
13:42:02 [limit_req] passed, excess: 0.1 by zone api_limit 203.0.113.5
# 1. http 块定义限流区 limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s; # 2. location 里应用 location /api/coupon/grab { limit_req zone=api_limit burst=5 nodelay; proxy_pass http://backend; }
PRO TIP 限流要挡在应用前面,不是应用里做。Java 应用里用 Guava RateLimiter 限流,请求已经进了 JVM、占了线程,挡不住"打满线程池"。Nginx 限流在请求进应用之前就拒了,应用一点压力没有。限流位置越靠前,保护效果越好。

⑦ 坑与事故(4 个真实翻车)

事故 1:location 优先级配错,请求全打到错误的服务

现象:配了两个 location,想给 /api/admin 走管理后台服务,/api/ 走主服务。结果所有 /api/ 开头的请求(包括 admin)全进了主服务。

原因:两个都是普通前缀匹配,Nginx 选了最长前缀匹配/api/admin 应该匹配 admin 那个才对……但配的人误以为"写在前面优先",又用了 ~ 正则干扰了优先级。

正解:记住优先级 = > ^~ > ~ / ~* > 普通前缀。要确保某个 location 一定优先,用 =(精确)或 ^~(前缀且不再走正则)。

# ❌ 错误:以为写在前面优先 location /api/admin { proxy_pass http://admin-service; } location ~ ^/api/ { proxy_pass http://main-service; } # 正则会先于普通前缀匹配!admin 全进这里 # ✅ 正确:admin 用 ^~ 强制优先 location ^~ /api/admin { proxy_pass http://admin-service; } location /api/ { proxy_pass http://main-service; }
事故 2:proxy_pass 末尾斜杠的坑,路径多/少了一截

现象:请求 /api/user/login,后端收到的路径变成了 //user/login/api/user/login,导致 Spring Boot 路由 404。

原因:proxy_pass 末尾有没有斜杠,决定了 Nginx 转发时要不要把 location 匹配的部分去掉。这个规则坑了无数人:

# location /api/ + proxy_pass http://backend/ (末尾有斜杠) # 请求 /api/user/login → 后端收到 /user/login (去掉了 /api) # location /api/ + proxy_pass http://backend (末尾无斜杠) # 请求 /api/user/login → 后端收到 /api/user/login (保留 /api)

正解:后端如果用 @RequestMapping("/api/user"),Nginx 就不要加斜杠(保留 /api);后端如果用 @RequestMapping("/user"),Nginx 就加斜杠(去掉 /api)。规则统一:前后端路径前缀要对齐。

事故 3:worker_connections 没调,大促当晚连接被拒

现象:双 11 零点流量峰值,大量用户访问直接报 502/连接拒绝,error.log 刷屏 worker_connections are not enough

原因:默认 worker_connections 1024,4 核机器 = 4 worker × 1024 = 4096 连接上限。反代场景下每个连接要占 2 个(客户端+后端),实际只能扛 2000 并发,大促直接打满。

正解:生产环境标配调到 worker_connections 10240,同时改系统 ulimit(ulimit -n 65535)。公式:最大连接 = worker_processes × worker_connections / 2(反代场景)。

# 系统层:/etc/security/limits.conf * soft nofile 65535 * hard nofile 65535 # Nginx:nginx.conf worker_processes auto; # = CPU核数 events { worker_connections 10240; }
事故 4:limit_req burst 配错,要么误伤要么没防住

现象:两套都出过事。第一套 burst=0 nodelay,正常用户点快一点就被 503,客服投诉爆了;第二套改成 burst=100(不加 nodelay),结果刷子照样打进来 100 个排队请求,后端还是被压垮。

原因:没理解 burst 的含义。burst 是"突发桶容量"——允许超出 rate 的请求数。burst 太小误伤正常用户,太大防不住刷子。

正解:按业务定 burst。登录类接口 burst=5(用户偶尔连点),查询类 burst=20,秒杀类 burst=0 直接拒(防刷优先)。原则:保护后端用小 burst + nodelay,保护用户体验用大 burst 不加 nodelay。

⑧ FAQ(5 个高频问题)

Nginx 和 Tomcat 什么关系?要一起用吗?

要一起用,分工不同。Tomcat 是应用服务器(跑 Spring Boot 业务代码),Nginx 是入口层(静态资源、反代、负载均衡、HTTPS)。

典型架构:用户 → Nginx (80/443) → Tomcat (8080)。Nginx 吐静态文件、做 HTTPS、做限流,Tomcat 专心跑业务。不要让 Tomcat 直接对外——它吐静态文件慢、没有限流、HTTPS 配置麻烦、单机扛并发能力弱。

worker_processes 设几个?worker_connections 设多少?

worker_processes = CPU 核数(写 auto 自动匹配)。每个 worker 是单进程,多核机器开多个 worker 才能用满 CPU。

worker_connections:静态服务 1024 够用,反代服务生产标配 10240。反代场景每个请求占 2 个连接(客户端+后端),所以实际并发上限 = worker_processes × worker_connections / 2。4 核 × 10240 / 2 = 20480 并发,够大多数场景。

同时记得改系统 ulimit(ulimit -n 65535),否则系统层文件描述符限制会先卡住。

反向代理为什么要加 Host / X-Forwarded-For 头?

因为经过 Nginx 转发后,后端拿到的请求信息变了:

不加 Host:后端 request.getServerName() 拿到的是 Nginx 的 IP,不是域名。生成绝对 URL、重定向会错。

不加 X-Forwarded-For:后端 request.getRemoteAddr() 拿到的是 Nginx 的 IP(127.0.0.1),日志、风控、限流全拿不到用户真实 IP。

所以反代必加这三件套:proxy_set_header Host $host; + X-Real-IP $remote_addr; + X-Forwarded-For $proxy_add_x_forwarded_for;。Spring Boot 取真实 IP:request.getHeader("X-Forwarded-For")

Nginx 能做 API 网关吗?和 Spring Cloud Gateway 什么区别?

能做一部分,但不是专业 API 网关。Nginx 能做路由、限流、HTTPS、灰度,但不擅长:鉴权(JWT 校验得写 Lua)、协议转换、请求/响应改写、可编程逻辑。

区别:Nginx 是"静态配置的流量入口",改路由要 reload;Spring Cloud Gateway / Kong 是"可编程 API 网关",支持动态路由、过滤器链、用代码/Lua 写复杂逻辑。

实际选择:简单路由+限流+HTTPS → Nginx 够了;微服务需要动态路由+鉴权+协议转换 → 上 Spring Cloud Gateway 或 Kong。很多团队是 Nginx → API 网关 → 微服务 两层并存。

怎么平滑重启 / 热加载配置?会断请求吗?

不会断请求。nginx -s reload,过程是:

① master 进程收到 reload 信号 → ②启动新的 worker 进程加载新配置 → ③通知老 worker"处理完手头请求就退出" → ④老 worker 处理完正在进行的请求后优雅退出 → ⑤新 worker 接管。整个过程不丢请求、不停服。

生产标配流程:nginx -t(校验语法)→ nginx -s reload(热加载)。改配置永远先 -t 再 reload,避免语法错误导致整个 Nginx 挂掉。

升级 Nginx 版本用 kill -USR2 热升级,新老进程并存、逐步切换,也是零停机。

✅ Nginx 三句话速记

1. 定位:流量入口层,不是应用服务器。静态它吐、动态它转、HTTPS 它结、限流它挡。

2. 配置四层:main → events → http → server → location。location 优先级 = > ^~ > ~ > 前缀,记住能避 80% 配错。

3. 生产必做:静态资源剥离、反代透传三个头、worker_connections 调到 10240、改配置先 -t 再 reload。

相关专题:部署运维场景决策 · 日志收集方案详解 · Redis 专题

全栈资料库 · Nginx 能力与生产实战