Nginx 性能优化
掌握 Nginx 服务器性能优化的方法和技巧
Nginx 性能优化概述
Nginx 以其高性能著称,但通过合理的配置和优化,可以进一步提升其性能表现。性能优化主要涉及以下几个方面:
- 工作进程配置
- 连接处理优化
- 内存使用优化
- 文件传输优化
- 缓存优化
- SSL/TLS 优化
- 日志优化
工作进程配置优化
工作进程数量
# 主配置文件顶部
user nginx;
# 设置为 CPU 核心数
worker_processes auto;
# 绑定工作进程到特定 CPU 核心
worker_cpu_affinity auto;
# 最大打开文件数
worker_rlimit_nofile 65536;
事件模块配置
events {
# 每个工作进程的最大连接数
worker_connections 10240;
# 使用 epoll 事件模型(Linux)
use epoll;
# 允许多个连接同时接受
multi_accept on;
}
HTTP 核心优化
http {
# 隐藏 Nginx 版本号
server_tokens off;
# 启用 sendfile
sendfile on;
# 启用 tcp_nopush
tcp_nopush on;
# 启用 tcp_nodelay
tcp_nodelay on;
# 连接超时设置
keepalive_timeout 65;
keepalive_requests 100;
# 客户端请求体大小限制
client_max_body_size 1m;
# 缓冲区设置
client_body_buffer_size 16k;
client_header_buffer_size 1k;
large_client_header_buffers 4 8k;
# 压缩配置
gzip on;
gzip_comp_level 6;
gzip_min_length 1000;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
gzip_vary on;
# 其他配置...
}
静态文件优化
server {
listen 80;
server_name example.com;
root /var/www/html;
# 静态文件缓存
location ~* \.(jpg|jpeg|png|gif|css|js|ico|svg|woff|woff2|ttf|eot)$ {
expires 30d;
add_header Cache-Control "public, max-age=2592000";
add_header Last-Modified "$date_gmt";
add_header ETag "$etag";
try_files $uri =404;
}
# 其他配置...
}
代理性能优化
http {
# 代理缓存配置
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=proxy_cache:10m max_size=10g inactive=60m use_temp_path=off;
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend;
# 代理头设置
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# 代理超时设置
proxy_connect_timeout 10;
proxy_send_timeout 10;
proxy_read_timeout 10;
# 代理缓冲区设置
proxy_buffers 16 16k;
proxy_buffer_size 32k;
# 启用代理缓存
proxy_cache proxy_cache;
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
}
}
}
SSL/TLS 性能优化
server {
listen 443 ssl http2;
server_name example.com;
# SSL 证书配置
ssl_certificate /etc/nginx/ssl/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/privkey.pem;
# SSL 优化
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_session_tickets on;
ssl_session_ticket_key /etc/nginx/ssl/ticket.key;
# OCSP 装订
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
# 其他配置...
}
日志优化
访问日志优化
http {
# 访问日志格式
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 off;
# 或使用缓冲区
access_log /var/log/nginx/access.log main buffer=32k;
# 错误日志
error_log /var/log/nginx/error.log warn;
}
日志轮询
# 安装 logrotate
sudo apt install logrotate # Ubuntu/Debian
sudo yum install logrotate # CentOS/RHEL
# 配置文件:/etc/logrotate.d/nginx
/var/log/nginx/*.log {
daily
missingok
rotate 7
compress
delaycompress
notifempty
create 640 nginx nginx
postrotate
[ -f /var/run/nginx.pid ] && kill -USR1 $(cat /var/run/nginx.pid)
endscript
}
系统级优化
内核参数优化
# 编辑 /etc/sysctl.conf 文件
# 最大文件句柄数
fs.file-max = 65536
# TCP 优化
net.core.somaxconn = 65536
net.ipv4.tcp_max_syn_backlog = 65536
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 300
net.ipv4.tcp_keepalive_probes = 5
net.ipv4.tcp_keepalive_intvl = 15
net.ipv4.tcp_max_tw_buckets = 65536
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 0
net.ipv4.ip_local_port_range = 1024 65535
# 应用配置
sysctl -p
文件系统优化
# 使用 ext4 文件系统
# 挂载选项优化(/etc/fstab)
/dev/sda1 / ext4 defaults,noatime,nodiratime,errors=remount-ro 0 1
# 禁用不必要的服务
systemctl disable postfix
systemctl disable cups
systemctl disable avahi-daemon
性能监控
Nginx 状态监控
server {
listen 80;
server_name example.com;
# 状态监控
location /nginx_status {
stub_status on;
access_log off;
allow 127.0.0.1;
deny all;
}
# 其他配置...
}
使用 Prometheus + Grafana 监控
# 安装 nginx-prometheus-exporter
git clone https://github.com/nginxinc/nginx-prometheus-exporter.git
cd nginx-prometheus-exporter
make build
# 运行 exporter
./nginx-prometheus-exporter -nginx.scrape-uri=http://localhost/nginx_status
# 配置 Prometheus 抓取
sudo nano /etc/prometheus/prometheus.yml
# 添加以下内容
scrape_configs:
- job_name: 'nginx'
static_configs:
- targets: ['localhost:9113']
实践练习
练习1:基本性能优化
- 优化工作进程配置,设置为 CPU 核心数
- 调整事件模块配置,增加最大连接数
- 启用 sendfile、tcp_nopush 和 tcp_nodelay
- 测试优化前后的性能差异
练习2:静态文件优化
- 配置静态文件缓存
- 启用 gzip 压缩
- 测试静态文件加载速度
练习3:系统级优化
- 优化内核参数
- 配置日志轮询
- 监控系统资源使用情况
常见问题解答
Q: 如何测试 Nginx 性能?
A: 可以使用 ab(Apache Benchmark)、wrk 或 siege 等工具进行性能测试。
# 使用 ab 测试
ab -n 10000 -c 100 http://localhost/
# 使用 wrk 测试
wrk -t12 -c400 -d30s http://localhost/
Q: 如何确定最佳的工作进程数量?
A: 一般设置为 CPU 核心数,可以使用 auto 让 Nginx 自动检测。
Q: 如何处理高流量网站的性能问题?
A: 可以采用以下措施:
- 启用缓存
- 使用 CDN
- 优化静态文件服务
- 考虑使用负载均衡
- 关闭不必要的日志