Nginx性能优化与监控笔记

Nginx性能优化与监控笔记 一、Nginx性能优化概述1.1 为什么需要性能优化Nginx作为高性能Web服务器和反向代理默认配置已经能够应对中等规模的并发访问。但在高并发、大流量场景下合理的优化配置可以带来显著的性能提升。根据实际测试经过全面优化的Nginx可以实现QPS提升233%从5,199 → 17,274 请求/秒延迟降低69.8%从192ms → 58ms并发能力提升6300%从1,024 → 65,535 连接CPU效率提升24.1%从95.2% → 72.3%1.2 性能优化层次Nginx性能优化可以分为以下几个层次优化层次主要内容影响程度系统层内核参数、文件描述符、网络栈★★★★★应用层Nginx核心配置、事件模型★★★★☆业务层缓存策略、压缩、静态资源★★★☆☆架构层负载均衡、集群部署★★★★☆二、性能瓶颈分析2.1 常见性能瓶颈在进行优化前需要识别系统的性能瓶颈。常见瓶颈包括bash# 1. CPU瓶颈查看CPU使用率 top -bn1 | grep Cpu(s) # 如果ussy接近100%说明CPU可能是瓶颈 # 2. 内存瓶颈查看内存使用 free -h # 如果available接近0说明内存不足 # 3. 磁盘I/O瓶颈查看磁盘读写 iostat -x 1 # 如果await 100msutil 80%说明磁盘是瓶颈 # 4. 网络瓶颈查看网络连接 netstat -s | grep -i retrans # 如果重传率过高说明网络可能是瓶颈 # 5. 文件描述符瓶颈 cat /proc/sys/fs/file-nr # 如果已分配接近最大值说明文件描述符不足2.2 使用stub_status模块监控基础指标nginx# 启用Nginx状态页 server { listen 80; server_name localhost; location /nginx_status { stub_status on; access_log off; allow 127.0.0.1; # 只允许本地访问 deny all; } }状态页输出示例textActive connections: 291 server accepts handled requests 16630948 16630948 31070465 Reading: 6 Writing: 179 Waiting: 106指标含义Active connections当前活跃连接数accepts已接受的连接总数handled已处理的连接总数requests总请求数Reading读取请求头的连接数Writing返回响应的连接数Waiting空闲keep-alive连接数三、系统级性能优化3.1 文件描述符限制Nginx每个连接都需要消耗一个文件描述符高并发场景下需要提高系统限制。bash# 1. 编辑系统限制 sudo vim /etc/security/limits.conf # 添加以下内容 * soft nofile 100000 * hard nofile 100000 * soft nproc 100000 * hard nproc 100000 # 2. 编辑sysctl配置 sudo vim /etc/sysctl.conf # 添加 fs.file-max 1000000 # 3. 应用配置 sudo sysctl -p # 4. 验证 ulimit -n3.2 TCP网络参数优化bash# 编辑sysctl配置 sudo vim /etc/sysctl.conf # 添加以下TCP优化参数 # 连接队列大小 net.core.somaxconn 65535 net.core.netdev_max_backlog 65535 net.ipv4.tcp_max_syn_backlog 65535 # TCP超时设置 net.ipv4.tcp_fin_timeout 30 net.ipv4.tcp_keepalive_time 1200 net.ipv4.tcp_tw_reuse 1 net.ipv4.tcp_tw_recycle 0 # 新内核已废弃设为0 # TCP内存优化单位页通常4KB/页 net.ipv4.tcp_rmem 4096 87380 16777216 net.ipv4.tcp_wmem 4096 65536 16777216 net.ipv4.tcp_mem 94500000 915000000 927000000 # BBR拥塞控制Linux 4.9 net.core.default_qdisc fq net.ipv4.tcp_congestion_control bbr # 应用配置 sudo sysctl -p # 验证BBR sysctl net.ipv4.tcp_congestion_control lsmod | grep bbr3.3 网卡队列优化对于多核CPU系统增加网卡队列数可以充分利用多核处理软中断。bash# 查看当前网卡队列数 ethtool -l enp4s0 # 设置网卡队列数根据CPU核心数调整 sudo ethtool -L enp4s0 combined 8 # 查看中断分布 cat /proc/interrupts | grep enp4s0四、Nginx核心配置优化4.1 基础优化配置nginx# /etc/nginx/nginx.conf user nginx; worker_processes auto; # 自动匹配CPU核心数 worker_cpu_affinity auto; # CPU亲和性绑定 worker_priority -10; # 提高进程优先级 worker_rlimit_nofile 100000; # worker进程文件描述符限制 error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; events { use epoll; # 使用epoll事件模型 worker_connections 65535; # 每个worker最大连接数 multi_accept on; # 一次接受所有新连接 accept_mutex off; # 关闭互斥锁 } http { include /etc/nginx/mime.types; default_type application/octet-stream; # 日志格式 log_format main $remote_addr - $remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for; # 访问日志使用缓冲 access_log /var/log/nginx/access.log main buffer32k flush5s; # 零拷贝优化 sendfile on; tcp_nopush on; # 优化数据包发送 tcp_nodelay on; # 禁用Nagle算法 # 长连接优化 keepalive_timeout 65; keepalive_requests 10000; # 每个连接最大请求数 # 缓冲区优化 client_header_buffer_size 4k; large_client_header_buffers 4 32k; client_body_buffer_size 128k; client_max_body_size 100m; # 文件缓存 open_file_cache max10000 inactive60s; open_file_cache_valid 80s; open_file_cache_min_uses 2; open_file_cache_errors on; # 隐藏版本号 server_tokens off; # Gzip压缩 gzip on; gzip_vary on; gzip_proxied any; gzip_comp_level 6; gzip_min_length 1024; gzip_types text/plain text/css text/xml text/javascript application/json application/javascript application/xmlrss application/rssxml image/svgxml; # 包含其他配置 include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*; }4.2 关键配置参数详解配置项推荐值说明worker_processesauto自动匹配CPU核心数充分利用多核worker_connections65535每个worker进程最大连接数受限于ulimit -nuse epollepollLinux高性能事件模型复杂度O(1)sendfileon零拷贝传输减少用户态/内核态切换tcp_nopushon优化数据包发送与sendfile配合使用tcp_nodelayon禁用Nagle算法降低延迟keepalive_timeout65长连接超时时间太短影响性能太长浪费资源keepalive_requests10000每个长连接最大请求数open_file_cachemax10000 inactive60s文件句柄缓存减少磁盘I/O4.3 允许多进程端口共享nginxserver { # 使用reuseport实现多进程负载均衡[citation:1] listen 80 reuseport; listen [::]:80 reuseport; server_name example.com; # ... 其他配置 }reuseport让内核能够将新连接均匀分配给各个工作进程避免某个工作进程负载过高。