一、Nginx性能优化核心思路
Nginx性能优化的核心目标:提升并发处理能力、降低响应延迟、减少资源占用(CPU、内存、IO),同时保证服务稳定性。优化需结合服务器硬件配置、业务场景(静态资源、反向代理、API网关等),避免盲目调优,优先解决瓶颈问题。
二、具体优化配置
(一)核心连接与进程配置(nginx.conf全局块)
Nginx的进程模型由主进程(管理配置、启动子进程)和子进程(处理请求)组成,合理配置进程数和连接数是基础。
1. 工作进程数:建议设置为CPU核心数(或核心数*2),避免过多进程抢占资源 worker_processes auto; # auto会自动识别CPU核心数,推荐使用 # 2. 每个工作进程的最大连接数(关键) worker_connections 10240; # 单个worker进程可同时处理的连接数,默认1024,根据内存调整 # 注意:实际并发数 = worker_processes * worker_connections / 2(HTTP1.1协议,每个请求占2个连接) # 3. 连接超时配置(避免连接占用资源) keepalive_timeout 65; # 长连接超时时间,单位秒,一般设置60-120s keepalive_requests 100; # 单个长连接可处理的最大请求数,避免长连接长期占用
(二)HTTP核心配置(http块)
1. 缓存优化(静态资源缓存,减轻后端压力)
开启gzip压缩(减少传输体积,提升加载速度) gzip on; gzip_min_length 1k; # 小于1k的文件不压缩,避免浪费CPU gzip_types text/plain text/css application/json application/javascript image/jpeg; # 需压缩的文件类型 gzip_comp_level 6; # 压缩级别(1-9),级别越高压缩率越高,CPU消耗越大,推荐6 gzip_vary on; # 告诉浏览器当前请求支持gzip,避免缓存错乱 # 静态资源缓存(浏览器端缓存,减少重复请求) location ~* \.(jpg|jpeg|png|gif|css|js)$ { root /usr/share/nginx/html; # 静态资源路径 expires 7d; # 缓存7天,根据资源更新频率调整(如js/css可设1d,图片可设30d) add_header Cache-Control "public, max-age=604800"; # 配合expires,增强缓存效果 etag on; # 开启ETag,基于文件内容生成标识,避免缓存失效误判 }
2. 连接与请求优化
关闭不必要的日志(减少IO开销,生产环境推荐) access_log off; # 完全关闭访问日志,或指定日志路径并开启缓冲 # access_log /var/log/nginx/access.log main buffer=16k; # 开启日志缓冲,减少磁盘IO # 限制请求体大小(避免大请求占用资源) client_max_body_size 10m; # 根据业务调整,如文件上传场景可设50m-100m # 开启TCP_NODELAY(减少延迟,适合小数据包场景) tcp_nodelay on; # 开启TCP_CORK(合并小包,适合大文件传输,减少网络开销) tcp_cork on;
(三)反向代理优化(若用作反向代理/网关)
后端服务连接池配置(避免频繁建立TCP连接) upstream backend_server { server 192.168.1.100:8080; server 192.168.1.101:8080; keepalive 32; # 后端长连接数,保持与后端的持久连接,减少握手开销 proxy_connect_timeout 5s; # 与后端连接超时时间 proxy_read_timeout 10s; # 读取后端响应超时时间 proxy_send_timeout 10s; # 向后端发送请求超时时间 } location /api { proxy_pass http://backend_server; proxy_set_header Host host; # 传递客户端Host头,避免后端获取错误 proxy_set_header X-Real-IP remote_addr; # 传递客户端真实IP proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }
(四)硬件与系统层面辅助优化
调整系统文件描述符限制:Nginx处理连接依赖文件描述符,需修改系统配置(/etc/security/limits.conf),添加 nginx soft nofile 65535、nginx hard nofile 65535,重启Nginx生效。
关闭SELinux(生产环境可根据安全需求调整,避免其限制Nginx资源访问)。
使用SSD存储静态资源,提升磁盘IO速度;若静态资源量大,可搭配CDN加速。
三、Nginx监控核心要点
监控目标:实时掌握Nginx运行状态、请求情况、资源占用,及时发现异常(如连接数过高、响应延迟、错误率飙升),为优化和故障排查提供依据。
(一)基础监控
1. Nginx内置状态监控
开启status模块,可查看连接数、请求数、处理状态等核心指标,无需额外安装工具。
在http块或server块中添加状态监控配置 location /nginx_status { stub_status on; # 开启状态监控 allow 192.168.1.0/24; # 允许访问的IP段(安全限制,避免公网访问) deny all; # 拒绝其他IP访问 }
访问 http://IP/nginx_status,返回结果解读:
Active connections:当前活跃的连接数(包含等待连接的连接)。
accepts:总接受的连接数。
handled:总处理的连接数(一般与accepts一致,若不一致说明有连接拒绝)。
requests:总处理的请求数。
Reading:正在读取客户端请求头的连接数。
Writing:正在向客户端发送响应的连接数。
Waiting:等待客户端请求的空闲连接数(长连接场景下会较多)。
2. 系统命令监控(快速排查)
1. 查看Nginx进程状态(是否正常运行) ps -ef | grep nginx # 2. 查看Nginx占用的端口(确认监听端口是否正常) netstat -tlnp | grep nginx # 3. 查看Nginx资源占用(CPU、内存) top -p $(pgrep nginx) # 查看Nginx进程的CPU和内存占用 ps aux | grep nginx # 查看详细资源占用 # 4. 查看请求日志(排查异常请求) tail -f /var/log/nginx/access.log # 实时查看访问日志 tail -f /var/log/nginx/error.log # 实时查看错误日志(关键,排查故障)
(二)高级监控(第三方工具)
1. Prometheus + Grafana
实现Nginx指标的可视化监控、告警,支持长期数据存储和趋势分析。
部署流程:安装Prometheus → 安装Nginx_exporter(采集Nginx指标) → 配置Prometheus抓取指标 → 部署Grafana → 导入Nginx监控模板(推荐模板ID:12708)。
核心监控指标:请求量(QPS)、响应时间、错误率(4xx/5xx)、连接数、CPU/内存占用、缓存命中率。
2. Zabbix(企业级监控)
适合已有Zabbix监控体系的场景,通过Zabbix Agent采集Nginx指标,配置告警规则(如连接数过高、错误率超标时触发告警)。
四、优化与监控注意事项
调优前先测试基准性能:使用ab(Apache Bench)、wrk等工具压测,确定当前瓶颈(如连接数不足、CPU占用过高、IO瓶颈),再针对性优化。
配置修改后,需平滑重启Nginx(nginx -s reload),避免服务中断。
监控需设置合理告警阈值:如活跃连接数超过80%、错误率超过1%、响应时间超过500ms时触发告警,及时处理异常。
避免过度优化:如gzip压缩级别过高会占用大量CPU,需在压缩率和CPU消耗之间找平衡;长连接超时时间过长会占用过多连接资源。
生产环境建议开启日志轮转(logrotate),避免日志文件过大占用磁盘空间。
五、常用压测工具
1. ab工具(简单易用,适合快速压测) ab -n 10000 -c 100 http://IP/ # 发起10000个请求,并发100个 # 2. wrk工具(性能更好,支持更多参数) wrk -t 4 -c 100 -d 30s http://IP/ # 4个线程,100个并发,压测30秒
压测重点关注:QPS(每秒处理请求数)、平均响应时间、95%响应时间、错误率,优化后对比压测结果,验证优化效果。