Nginx作为高性能的HTTP和反向代理服务器 广泛应用于生产环境 但默认配置无法充分发挥其硬件潜力 且缺乏完善的监控会导致故障排查滞后 本笔记聚焦Nginx性能调优的核心配置的优化思路 以及深度监控的指标 工具和实战方法 适用于生产环境的性能优化与运维监控场景 兼顾理论与实操 方便后续查阅和落地
Nginx性能调优核心(从配置入手 优先解决瓶颈)
核心配置调优(nginx.conf核心参数)
工作进程与连接数优化(最基础 最关键)
Nginx的工作进程数和连接数直接决定并发处理能力 需结合服务器CPU核心数 内存合理配置 避免资源浪费或瓶颈
-
worker_processes :工作进程数 建议设置为服务器CPU核心数(或核心数+1)充分利用多核CPU 查看CPU核心数命令:
grep ^processor /proc/cpuinfo | wc -l示例:worker_processes 4;(4核CPU) -
worker_connections :单个工作进程允许同时建立的最大连接数 需结合系统打开文件数限制 示例:
worker_connections 10240;(单个进程最大连接10000+ 需同步优化系统参数) -
worker_rlimit_nofile :设置单个工作进程的最大文件打开数 需大于等于worker_connections 避免"too many open files"错误 示例:
worker_rlimit_nofile 65535;
事件模型优化
Nginx支持多种事件模型 不同系统适配不同模型 优化后可提升连接处理效率
-
Linux系统优先使用
epoll模型(高效的I/O多路复用模型)避免使用poll select 示例:events { use epoll; worker_connections 10240; } -
开启连接复用:
multi_accept on;(允许单个工作进程同时接受多个连接 提升并发接收效率)
HTTP核心配置优化
针对HTTP请求的处理流程 缓存 连接超时等配置 减少不必要的开销 提升响应速度
-
连接超时设置 :避免连接长时间占用资源 合理设置超时时间 示例:
`` http { `` keepalive_timeout 65; # 长连接超时时间 单位秒(客户端与服务器保持连接的时间) `` keepalive_requests 100; # 单个长连接允许处理的最大请求数 `` client_header_timeout 10; # 等待客户端发送请求头的超时时间 `` client_body_timeout 10; # 等待客户端发送请求体的超时时间 `` send_timeout 10; # 服务器发送响应的超时时间 `` } -
缓冲区优化 :合理设置请求/响应缓冲区 减少磁盘I/O(避免频繁读写临时文件)示例:
`` client_body_buffer_size 10M; # 客户端请求体缓冲区大小 小于该值直接存内存 大于则存磁盘 `` client_header_buffer_size 16k; # 请求头缓冲区大小 `` large_client_header_buffers 4 64k; # 大请求头缓冲区(如cookie较多时)output_buffers 4 32k; # 响应输出缓冲区`` -
压缩优化 :开启Gzip压缩 减少传输数据量 提升响应速度(适合文本类资源:HTML CSS JS JSON)示例:
`` gzip on; `` gzip_min_length 1k; # 最小压缩文件大小(小于1k不压缩 避免浪费资源) `` gzip_types text/plain text/css application/json application/javascript text/xml; # 需压缩的文件类型 `` gzip_comp_level 6; # 压缩级别(1-9 级别越高压缩率越高 CPU消耗越大 建议6)gzip_vary on; # 告诉客户端服务器支持压缩 提升兼容性`` -
静态资源优化 :Nginx擅长处理静态资源 通过配置缓存 expires 头 减少重复请求 示例:
`` location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ { `` root /usr/share/nginx/html; # 静态资源目录 `` expires 7d; # 缓存时间(7天 静态资源不变时可设置更长) `` add_header Cache-Control "public, max-age=604800"; # 缓存控制头 `` etag on; # 开启ETag 用于资源缓存校验(避免重复下载) `` gzip on; # 静态资源开启压缩}``
反向代理与 upstream 优化(若用Nginx做反向代理)
当Nginx作为反向代理 转发请求到后端服务(如Tomcat Node.js)时 需优化代理配置 减少转发开销
-
upstream 连接池优化 :开启长连接 避免频繁建立/关闭与后端的连接示例:
`` upstream backend { `` server 192.168.1.100:8080; `` server 192.168.1.101:8080; `` keepalive 32; # 与后端保持的长连接数 `` keepalive_timeout 60s; # 后端长连接超时时间 `` keepalive_requests 100; # 单个后端长连接处理的最大请求数 `` } `` location /api { `` proxy_pass http://backend; `` proxy_http_version 1.1; # 必须使用HTTP/1.1才能开启长连接 `` proxy_set_header Connection ""; # 清除客户端Connection头,避免干扰 `` proxy_set_header Host $host; # 传递客户端Host头 `` proxy_set_header X-Real-IP $remote_addr; # 传递客户端真实IP}`` -
代理缓冲区优化 :避免后端响应过大导致Nginx频繁读写磁盘 示例:
`` proxy_buffering on; `` proxy_buffer_size 16k; # 代理缓冲区初始大小 `` proxy_buffers 4 64k; # 代理缓冲区数量和单个大小proxy_busy_buffers_size 128k; # 忙碌时的缓冲区大小``
系统层面辅助调优(配合Nginx配置,解决系统瓶颈)
Nginx的性能受系统参数限制,仅优化Nginx配置不够,需同步调整系统内核参数(/etc/sysctl.conf)。
-
提高文件打开数限制 :
`` # /etc/sysctl.conf 新增 `` fs.file-max = 655350 # 系统全局最大文件打开数 `` # 生效命令:sysctl -p `` `` # 同时修改用户级限制(/etc/security/limits.conf) `` * soft nofile 65535 `` * hard nofile 65535 `` -
TCP连接优化 :减少TCP连接的建立/关闭开销,提升并发连接处理能力。
`` # 开启TCP连接复用(TIME-WAIT状态的连接复用) `` net.ipv4.tcp_tw_reuse = 1 `` # 快速回收TIME-WAIT状态的连接 `` net.ipv4.tcp_tw_recycle = 1 `` # TIME-WAIT状态连接的超时时间(默认60s,可缩短至30s) `` net.ipv4.tcp_fin_timeout = 30 `` # 系统最大TCP连接数 `` net.ipv4.tcp_max_syn_backlog = 10240 `` # 允许的最大半连接数 `` net.ipv4.tcp_max_syn_backlog = 20480 `` -
内存分配优化 :避免内存交换(swap),提升Nginx响应速度(内存交换会严重降低性能)。
`` vm.swappiness = 0 # 关闭内存交换(仅当内存充足时,若内存不足可设为10-20) ``
调优验证方法
调优后需验证效果,避免盲目优化,常用工具如下:
-
ab(Apache Bench) :压力测试工具,测试Nginx的并发处理能力和响应时间。 示例:
ab -n 10000 -c 100 http://localhost/(10000个请求,并发100) -
ss :查看Nginx的连接状态,确认连接数、TIME-WAIT状态等。 示例:
ss -tulnp | grep nginx(查看Nginx监听端口和连接)、ss -s(查看系统整体连接统计) -
top/htop:查看Nginx进程的CPU、内存占用,确认是否充分利用资源(无空闲CPU、内存无浪费)。
Nginx深度监控(实时监控+故障排查+性能分析)
监控的核心目标:实时掌握Nginx运行状态、快速定位故障、发现性能瓶颈,需覆盖"基础监控+深度指标+日志分析"三个层面。
基础监控(必做,掌握Nginx运行状态)
Nginx自带状态页(ngx_http_stub_status_module)
Nginx内置模块,无需额外安装,配置后可查看核心运行指标,适合快速排查基础问题。
-
配置状态页(在nginx.conf的http或server块中添加):
`` location /nginx_status { `` stub_status on; # 开启状态页 `` allow 127.0.0.1; # 仅允许本地访问(安全起见) `` deny all; # 拒绝其他IP访问 `` } `` -
重启Nginx:
systemctl restart nginx -
访问状态页:
curl http://localhost/nginx_status,输出结果解读:-
Active connections:当前活跃的连接数(包含等待连接的连接)
-
server accepts handled requests:累计接受的连接数、处理的连接数、处理的请求数(若accepts > handled,说明有连接被拒绝,需优化worker_connections)
-
Reading:正在读取客户端请求头的连接数
-
Writing:正在向客户端发送响应的连接数
-
Waiting:等待客户端请求的连接数(长连接的空闲状态)
-
进程与端口监控(系统工具)
-
查看Nginx进程是否存活:
ps -ef | grep nginx(确保有master进程和worker进程) -
查看Nginx监听端口:
netstat -tulnp | grep nginx(确认80、443等端口正常监听) -
监控进程资源:
top -p $(pidof nginx)(实时查看Nginx进程的CPU、内存占用)
深度监控(进阶,覆盖性能与故障指标)
仅靠自带状态页无法满足生产环境需求,需结合第三方工具,实现指标可视化、告警等功能,常用工具:Prometheus + Grafana(主流方案)、Zabbix。
Prometheus + Grafana 监控方案(推荐)
核心逻辑:通过nginx-prometheus-exporter采集Nginx的详细指标,Prometheus存储指标,Grafana可视化展示,支持告警配置。
-
安装nginx-prometheus-exporter(采集Nginx指标):
-
启动命令:
./nginx-prometheus-exporter -nginx.scrape-uri http://localhost/nginx_status(指定Nginx状态页地址) -
验证采集:
curl http://localhost:9113/metrics(查看采集到的指标,如nginx_connections_active、nginx_requests_total等)
-
配置Prometheus(存储指标): 在Prometheus配置文件(prometheus.yml)中添加Nginx采集任务:
`` scrape_configs: `` - job_name: 'nginx' `` static_configs: `` - targets: ['localhost:9113'] # exporter的地址和端口 `` scrape_interval: 15s # 采集间隔(15秒一次) `` -
配置Grafana(可视化):
-
添加Prometheus数据源:Grafana后台 → Configuration → Data Sources → Add data source → Prometheus,填写Prometheus地址(如http://localhost:9090)。
-
导入Nginx监控面板:Grafana → Dashboards → Import,输入面板ID(推荐11199,Nginx官方推荐面板),选择Prometheus数据源,完成导入。
-
核心监控指标(面板中重点关注):
-
连接数:活跃连接、等待连接、读取/写入连接数
-
请求指标:总请求数、QPS(每秒请求数)、请求成功率
-
响应时间:P95、P99响应时间(排查慢请求)
-
错误指标:4xx、5xx状态码数量(定位异常请求)
-
-
-
配置告警(可选,关键指标异常提醒):在Grafana中设置告警规则,如:活跃连接数超过阈值、5xx错误率超过1%、QPS突降等,告警方式支持邮件、钉钉、企业微信等。
Zabbix监控方案(适合已有Zabbix运维体系)
-
安装Zabbix Agent:在Nginx服务器上安装Zabbix Agent,确保能与Zabbix Server通信。
-
导入Nginx模板:Zabbix后台 → 配置 → 模板 → 导入,选择Nginx相关模板(如Template App Nginx)。
-
配置监控项:通过Zabbix Agent采集Nginx状态页指标、进程状态、端口状态等,支持自定义监控项(如日志中的错误率)。
-
设置告警:针对关键指标(如Nginx进程宕机、连接数过高、错误码激增)设置告警阈值,及时提醒运维人员。
日志深度分析(排查故障、定位性能瓶颈)
Nginx日志包含大量请求细节,通过分析日志可定位慢请求、异常请求、客户端来源等,是深度监控的重要补充。
Nginx日志配置优化(确保日志包含关键信息)
默认日志格式较简单,需优化日志格式,增加响应时间、请求方法、状态码等关键信息。
http { # 定义日志格式(main为自定义名称) log_format main '$remote_addr [$time_local] "$request_method $request_uri $server_protocol" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for" ' '$request_time $upstream_response_time'; # 访问日志(记录所有请求) access_log /var/log/nginx/access.log main; # 错误日志(记录Nginx自身错误,如连接失败、配置错误) error_log /var/log/nginx/error.log warn; }
日志字段解读:
-
$remote_addr:客户端IP
-
$request_time:Nginx处理整个请求的时间(从接收请求到发送完响应)
-
$upstream_response_time:后端服务处理请求的时间(若为反向代理)
-
$status:HTTP状态码(200成功、404找不到、502后端错误等)
-
$request_uri:请求路径(可定位频繁请求或异常路径)
日志分析工具(快速提取关键信息)
-
awk/sed(基础工具) :快速筛选特定日志,如慢请求、5xx错误。 示例1:筛选响应时间超过1秒的慢请求:
awk '$12 > 1 {print $0}' /var/log/nginx/access.log示例2:统计5xx错误数量:grep -c ' 5.. ' /var/log/nginx/access.log示例3:统计Top10请求路径:awk '{print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -10 -
ELK Stack(进阶,大规模日志分析):当日志量较大(如每天GB级),需用ELK(Elasticsearch + Logstash + Kibana)进行日志收集、分析、可视化。 核心流程:Logstash采集Nginx日志 → Elasticsearch存储日志 → Kibana可视化(筛选、统计、图表展示),支持按时间范围、状态码、请求路径等维度分析。
常见问题与排查思路
-
问题1:Nginx启动失败,提示"too many open files" 排查:系统文件打开数限制不足,或Nginx的worker_rlimit_nofile配置过小。 解决:优化系统fs.file-max、limits.conf,调整worker_rlimit_nofile大于等于worker_connections。
-
问题2:并发请求时,响应变慢,CPU利用率低 排查:worker_processes设置过小,未充分利用多核CPU;或事件模型未使用epoll。 解决:将worker_processes设为CPU核心数,开启epoll模型。
-
问题3:反向代理时,出现502 Bad Gateway 排查:后端服务宕机、端口未监听;或Nginx与后端的连接数不足、超时时间过短。 解决:检查后端服务状态,优化upstream的keepalive配置,调整proxy_connect_timeout(代理连接超时)。
-
问题4:日志中出现大量404错误 排查:请求路径错误、静态资源路径配置错误;或客户端请求了不存在的资源。 解决:检查location配置,确认root/alias路径正确;排查客户端请求地址是否有误。
-
问题5:慢请求过多(request_time过大) 排查:静态资源未开启缓存、未压缩;或后端服务响应慢(upstream_response_time过大);或缓冲区配置不合理。 解决:开启静态资源缓存和Gzip压缩,优化后端服务性能,调整缓冲区配置。