LNMP环境下如何优化Nginx配置
小樊
45
2025-12-14 01:54:13
LNMP环境下Nginx配置优化实战
一 基础与连接优化
- 进程与文件句柄
- 设置工作进程数为CPU核心数(或设为auto),提升多核利用率;提升单进程可打开文件数,避免“too many open files”。
- 建议:worker_processes auto; worker_rlimit_nofile 65535;
- 事件模型与连接复用
- Linux优先使用epoll;开启multi_accept与accept_mutex以优化新连接分配;开启sendfile减少用户态/内核态拷贝;与sendfile配合开启tcp_nopush,在长连接下开启tcp_nodelay提升小包实时性;适度提高keepalive_timeout与keepalive_requests复用连接,降低握手开销。
- 建议:events { use epoll; multi_accept on; accept_mutex on; worker_connections 16384; };http { sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; keepalive_requests 100000; }
- 系统层面配合
- 提高进程文件句柄上限:ulimit -n 65535;必要时在systemd服务中设置 LimitNOFILE=65535。
二 静态资源与压缩
- 启用压缩
- 开启Gzip并限制压缩级别与类型,兼顾压缩率与CPU;若环境支持,可叠加Brotli获得更高压缩率(需模块)。
- 建议:gzip on; gzip_vary on; gzip_comp_level 6; gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
- 静态资源缓存
- 对图片、字体、CSS、JS设置长期Cache-Control/Expires,并使用ETag与Last-Modified配合协商缓存;启用gzip_static(存在预压缩文件时直接发送)减少CPU实时压缩。
- 建议:location ~* .(jpg|jpeg|png|gif|ico|svg|css|js|woff2)$ { expires 1y; add_header Cache-Control “public, immutable”; gzip_static on; }
三 反向代理与负载均衡
- 反向代理常用头
- 传递Host、X-Real-IP、X-Forwarded-For等请求头,确保后端获取真实客户端信息;按需设置缓冲与超时,避免慢客户端拖垮后端。
- 建议:location / { proxy_pass http://backend; 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_read_timeout 300s; }
- 负载均衡策略
- 默认轮询(round-robin);可按权重(weight)、ip_hash(会话保持)、backup(热备)等策略组合使用,提升可用性与吞吐。
四 安全与可观测性
- 安全加固
- 隐藏版本信息:在http段设置server_tokens off;;为Worker指定非root专用用户(如创建nginx用户并配置user指令),降低风险。
- 日志与监控
- 合理设置error_log级别(如notice/warn)减少磁盘IO;按需采集access_log并结合监控/可视化(如Prometheus + Grafana)观察QPS、延迟、5xx比例与带宽,结合日志定位瓶颈。
五 变更流程与PHP协同优化
- 变更流程
- 任何调整前先备份:cp /etc/nginx/nginx.conf{,.bak};修改后用nginx -t校验语法,再systemctl reload nginx平滑生效,确保线上稳定。
- 与PHP-FPM协同
- 启用并调优OPcache(生产建议开启JIT),减少PHP编译开销;根据内存与并发调pm.max_children、request_terminate_timeout等;Nginx侧为PHP location设置fastcgi_read_timeout(如300s)避免长任务被中断。
- 示例片段:location ~ .php$ { include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_pass 127.0.0.1:9000; fastcgi_read_timeout 300s; }