一、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)"
# 如果us+sy接近100%,说明CPU可能是瓶颈
# 2. 内存瓶颈:查看内存使用
free -h
# 如果available接近0,说明内存不足
# 3. 磁盘I/O瓶颈:查看磁盘读写
iostat -x 1
# 如果await > 100ms,util > 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;
}
}
状态页输出示例:
text
Active 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 -n
3.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 bbr
3.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 buffer=32k flush=5s;
# 零拷贝优化
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 max=10000 inactive=60s;
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/xml+rss application/rss+xml
image/svg+xml;
# 包含其他配置
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
4.2 关键配置参数详解
| 配置项 | 推荐值 | 说明 |
|---|---|---|
worker_processes |
auto | 自动匹配CPU核心数,充分利用多核 |
worker_connections |
65535 | 每个worker进程最大连接数,受限于ulimit -n |
use epoll |
epoll | Linux高性能事件模型,复杂度O(1) |
sendfile |
on | 零拷贝传输,减少用户态/内核态切换 |
tcp_nopush |
on | 优化数据包发送,与sendfile配合使用 |
tcp_nodelay |
on | 禁用Nagle算法,降低延迟 |
keepalive_timeout |
65 | 长连接超时时间,太短影响性能,太长浪费资源 |
keepalive_requests |
10000 | 每个长连接最大请求数 |
open_file_cache |
max=10000 inactive=60s | 文件句柄缓存,减少磁盘I/O |
4.3 允许多进程端口共享
nginx
server {
# 使用reuseport实现多进程负载均衡[citation:1]
listen 80 reuseport;
listen [::]:80 reuseport;
server_name example.com;
# ... 其他配置
}
reuseport让内核能够将新连接均匀分配给各个工作进程,避免某个工作进程负载过高。