服务器Nginx性能调优:从连接数到缓存的实操配置
服务器Nginx性能调优不是把参数改大就完事,而是先搞清楚瓶颈在连接数、进程数还是资源传输。
对零基础用户来说,最稳妥的做法是先备份配置,再按进程、连接、压缩、缓存四个方向逐步调整,每改一步用 nginx -t 校验并重载,最后用压测工具确认效果。
调优前先确认环境和备份
动手前先确认 Nginx 的安装方式和配置文件位置,不同系统的路径不一样。
用下面命令查看:
nginx -v
nginx -t
ps -ef | grep nginx
常见配置目录:
- 宝塔面板:
/www/server/nginx/conf/nginx.conf - 源码编译:通常是
/usr/local/nginx/conf/nginx.conf - apt/yum 安装:
/etc/nginx/nginx.conf
改任何配置前先备份,出问题能快速回滚:
cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak
如果用的是宝塔,也可以在面板「软件商店」找到 Nginx,点「配置修改」后再操作,改完点「重载配置」即可。
进程与连接数:别只盯一个参数
Nginx 的并发能力主要由 worker_processes 和 worker_connections 决定。
前者是工作进程数,后者是每个进程能处理的连接数。
在 nginx.conf 顶部调整:
worker_processes auto;
worker_rlimit_nofile 65535;
events {
worker_connections 10240;
multi_accept on;
use epoll;
}
说明几点:
worker_processes auto让 Nginx 按 CPU 核心数自动分配,比手写固定值更省心。worker_rlimit_nofile提高单进程可打开文件数,需要系统ulimit -n也放开,否则不生效。use epoll是 Linux 下的高效事件模型,现代版本一般已默认。
改完执行:
nginx -t && nginx -s reload
看到 syntax is ok 和 test is successful 才算通过。
开启Gzip和连接复用减少传输开销
文本类内容开启 Gzip 能明显降低传输体积。
在 http 块中加入:
gzip on;
gzip_min_length 1k;
gzip_comp_level 5;
gzip_types text/plain text/css application/json application/javascript text/xml;
gzip_vary on;
gzip_comp_level 不建议拉到 9,压缩率提升有限但更耗 CPU,5 左右比较均衡。
连接复用方面,保持长连接可以省去频繁握手:
keepalive_timeout 65;
keepalive_requests 1000;
另外,静态资源建议设置缓存头,让浏览器少发请求:
location ~* \.(jpg|jpeg|png|gif|css|js|ico)$ {
expires 7d;
add_header Cache-Control "public";
}
常见坑:改完没生效或服务起不来
调优过程中最容易踩的几个问题:
- 只改 Nginx 没改系统限制。
worker_rlimit_nofile要配合/etc/security/limits.conf里的nofile一起放开,否则连接数上不去。 - 直接
nginx -s reload前没做语法检查,配置写错会导致重载失败,线上最好先nginx -t。 - 把
worker_connections设得过大,超过系统文件描述符上限,反而出现too many open files报错。 - Gzip 对图片、视频无效,重复压缩只是浪费 CPU。
- 改了配置忘记重载,一直以为没生效。
如果重载后服务异常,用备份文件覆盖回去再重载即可恢复。
怎么验证调优有没有效果
配置生效后,用压测工具对比调整前后的表现。
安装 ApacheBench:
ab -n 1000 -c 100 http://你的域名/
重点看两个指标:
Requests per second:每秒处理请求数,越高越好。Failed requests:失败请求数,理想为 0。
同时观察服务器负载:
top
ss -s
如果 CPU 没打满但 QPS 上不去,瓶颈可能在磁盘或后端应用;
如果 CPU 打满,再考虑是否继续加进程或换更强的机器。
调优是逐步验证的过程,不要一次改一堆参数。
几个新手常问的问题
改完配置需要重启还是重载?
用 nginx -s reload 即可,它会平滑加载新配置,不中断已有连接。
只有改动监听端口等少数情况才需要重启。
worker_connections 设多大合适?
没有万能值。
先看服务器内存和 ulimit -n,一般从 10240 起步,压测时观察是否出现连接拒绝,再逐步调整。
开了缓存会不会导致更新不生效?
浏览器缓存时间设太长时,用户可能看到旧文件。
发布新版本时可以用文件名加哈希,或在面板手动刷新 CDN 和浏览器缓存来解决。