Ubuntu 下应对 Nginx 访问量激增的实战方案
一 紧急止血与快速定位
- 快速限流与防护:在 Nginx 的 server 或 location 中加入基础限流,阻断异常来源并保护后端。
- 示例:limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s; limit_req zone=one burst=20 nodelay; 对特定路径可更严格。
- 对突发恶意来源可结合防火墙(如 UFW/iptables)做 IP 封禁或速率限制。
- 打开压缩与静态资源缓存:启用 gzip、设置 Cache-Control/Expires,对静态资源命中强缓存,显著降低带宽与时延。
- 立即观测与定位瓶颈:
- 实时查看错误日志:tail -f /var/log/nginx/error.log(关注如 too many open files 等关键字)。
- 连接与状态统计:ss -antp | grep nginx | awk ‘{print $1}’ | sort | uniq -c;必要时用 lsof -p <nginx_pid> | wc -l 查看进程打开 FD 数。
- 访问分析:使用 GoAccess 快速洞察热点与异常路径。以上措施能在分钟级缓解压力并给出明确优化方向。
二 系统资源与内核参数调优
- 文件描述符上限:
- 临时提升:sysctl -w fs.file-max=2000000;永久写入 /etc/sysctl.conf。
- 进程级限制(systemd 场景):创建 /etc/systemd/system/nginx.service.d/override.conf,设置 LimitNOFILE=65535,执行 systemctl daemon-reload && systemctl restart nginx。
- 典型 TCP/IP 栈优化(/etc/sysctl.conf,按业务压测微调):
- net.core.somaxconn=4096
- net.ipv4.tcp_max_syn_backlog=4096
- net.ipv4.ip_local_port_range=1024 65535
- net.ipv4.tcp_tw_reuse=1
- net.ipv4.tcp_fin_timeout=30
- 执行 sysctl -p 生效。以上能缓解连接队列溢出、端口耗尽与大量短连接带来的资源浪费。
三 Nginx 关键配置优化
- 并发模型与连接:
- worker_processes auto;(或设为 CPU 核心数)
- events { worker_connections 4096; multi_accept on; }
- 建议设置 worker_rlimit_nofile 与 events 的 worker_connections 匹配,确保 worker_connections * worker_processes 不超过进程可打开文件数上限。
- 传输与压缩:
- sendfile on; tcp_nopush on;(大文件传输更高效)
- gzip on; gzip_comp_level 5; gzip_min_length 256; gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; gzip_vary on;
- 长连接复用:
- keepalive_timeout 30s; keepalive_requests 100;
- 反向代理时启用 upstream keepalive:upstream backend { server 127.0.0.1:8080; keepalive 32; },减少频繁建连开销。
- 静态资源与缓存:
- 配置强缓存头(Cache-Control/Expires),对图片、字体、JS/CSS 等命中长缓存。
- 启用反向代理缓存:proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off; 并在 location 中使用 proxy_cache。以上配置能显著提升单机承载能力与稳定性。
四 架构扩展与长期治理
- 水平扩展与负载均衡:通过 LVS/HAProxy/Nginx 做流量分发,横向扩展到多台 Nginx 实例,降低单点压力。
- 缓存与内容分发:引入 CDN 缓存静态资源与可缓存的 API 响应,进一步减少源站压力与跨域时延。
- 后端优化与异步化:为动态站点优化应用与数据库(如启用 OPcache、优化查询、连接池、读写分离/分库分表),将耗时任务放入消息队列异步处理。
- 监控与压测:
- 监控:Prometheus + Grafana 采集系统/进程/连接指标,配置告警(如连接使用率 > 80%)。
- 压测:使用 wrk、ab、JMeter、Locust 等工具在峰值到来前验证配置与容量边界,回归优化。以上手段帮助将“临时扛住”转化为“长期稳态”。