LNMP中Nginx如何优化
小樊
34
2025-12-21 23:16:08
LNMP中Nginx优化要点
一 基础并发与进程模型
- 设置工作进程数与CPU亲和:将worker_processes设为auto或匹配CPU核心数;启用worker_cpu_affinity auto减少上下文切换与核间竞争。
- 提升文件描述符限制:设置worker_rlimit_nofile 65535(并在系统层放宽nofile上限),避免“too many open files”。
- 高效事件模型与连接:Linux使用use epoll;根据内存与负载调大worker_connections(如16384/32768);开启multi_accept on提升accept效率。
- 连接复用:开启keepalive,如keepalive_timeout 65、keepalive_requests 100000,降低握手开销。
- 传输层优化:启用sendfile on与tcp_nopush on;按需开启tcp_nodelay on减少Nagle延迟。
- 典型计算:最大并发连接数≈worker_processes × worker_connections(再受限于系统fd与内核backlog)。
二 静态资源与缓存策略
- 静态资源长缓存:对图片、CSS、JS等设置expires 30d与Cache-Control “public”,减少重复请求与回源。
- 开启压缩:启用gzip on,设置gzip_types(如text/css、application/javascript等),常用gzip_comp_level 2~6平衡CPU与体积。
- 访问日志缓冲:使用缓冲与周期刷写降低I/O抖动,例如:
access_log /var/log/nginx/access.log combined buffer=32k flush=300s;
- 文件句柄与元数据缓存:启用open_file_cache,如:
open_file_cache max=65535 inactive=60s; open_file_cache_valid 80s; open_file_cache_min_uses 1;
- 反向代理/动态内容缓存:配置proxy_cache_path与fastcgi_cache_path,示例:
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m use_temp_path=off;
fastcgi_cache_path /var/cache/nginx levels=1:2 keys_zone=fcgi:10m max_size=1g inactive=5m;
并在对应location启用缓存与合适的缓存键/有效期策略。
三 反向代理与FastCGI关键参数
- 上游与连接复用:为后端设置合理keepalive(如keepalive 32),复用后端连接,降低握手与TIME_WAIT。
- 超时与缓冲:为代理与FastCGI设置匹配业务的超时,如fastcgi_read_timeout 300s;按并发调大fastcgi_buffers与fastcgi_busy_buffers_size,减少磁盘临时文件与阻塞。
- 头部与缓冲:合理设置client_header_buffer_size 4k/8k、large_client_header_buffers 4 4k、client_max_body_size 8m/50m(视业务上传而定)。
- 典型片段:
fastcgi_connect_timeout 300; fastcgi_send_timeout 300; fastcgi_read_timeout 300;
fastcgi_buffer_size 4k; fastcgi_buffers 8 4k; fastcgi_busy_buffers_size 8k;
client_max_body_size 50m;
- 负载均衡(如有多台后端):使用upstream定义后端组,结合权重/健康检查与回退策略,提升可用性与吞吐。
四 安全与可观测性
- 隐藏版本与降噪:设置server_tokens off减少信息泄露;错误日志级别按环境设为error/warn,避免高开销的debug在生产常开。
- 加密与协议:启用TLSv1.2/TLSv1.3,使用强套件与ssl_prefer_server_ciphers on,并开启HSTS(如需要)。
- 访问控制与防火墙:仅开放80/443与必要管理端口;使用ufw/iptables限制来源与速率。
- 监控与压测:部署Prometheus + Grafana监控连接、请求耗时、缓存命中率、5xx比例等;定期ab/wrk压测验证配置变更效果。
五 系统层面与验证
- 文件句柄与进程限制:在**/etc/security/limits.conf**放宽:
- soft nofile 65535; * hard nofile 65535;
并确保服务启动会话继承该限制(如systemd服务设置LimitNOFILE)。
- 内核网络参数(示例,按带宽与并发调优):
net.core.somaxconn 65535; net.ipv4.ip_local_port_range 1024 65535;
net.ipv4.tcp_fin_timeout 30; net.ipv4.tcp_slow_start_after_idle 0;
net.ipv4.tcp_fastopen 3; net.ipv4.tcp_syncookies 1;
net.core.netdev_max_backlog 65535;
- 验证与回滚:每次变更执行nginx -t检查语法,使用nginx -s reload平滑生效;变更前备份配置,分阶段灰度与压测,观察错误日志与监控指标再扩大范围。