Nginx性能优化实战:突破十万并发的核心技巧与配置
引言
Nginx作为高性能Web服务器和反向代理服务器,广泛应用于现代互联网架构中。然而,默认配置下的Nginx往往无法充分发挥硬件潜力,特别是在高并发场景下。本文将详细介绍Nginx性能优化的核心技巧与配置,帮助你突破十万并发的瓶颈。
一、系统层面优化
1.1 调整内核参数
修改/etc/sysctl.conf文件:
# 提高文件句柄限制
fs.file-max = 1000000
# 网络参数优化
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.netdev_max_backlog = 262144
net.core.somaxconn = 65535
# TCP参数优化
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.tcp_max_orphans = 262144使配置生效:
sysctl -p1.2 调整文件句柄限制
修改/etc/security/limits.conf文件:
* soft nofile 1000000
* hard nofile 1000000临时生效:
ulimit -n 1000000二、Nginx配置优化
2.1 基本配置优化
修改nginx.conf文件:
# 工作进 程数,建议等于CPU核心数
worker_processes auto;
# 绑定CPU核心
worker_cpu_affinity auto;
# 最大文件句柄数
worker_rlimit_nofile 1000000;
events {
# 使用epoll事件模型
use epoll;
# 单个工作进程最大连接数
worker_connections 100000;
# 允许同时接受多个连接
multi_accept on;
}
http {
# 隐藏Nginx版本号
server_tokens off;
# 开启gzip压缩
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.1;
gzip_comp_level 6;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml text/javascript;
# 开启keepalive
keepalive_timeout 65;
keepalive_requests 1000;
# 客户端请求头缓冲区大小
client_header_buffer_size 4k;
large_client_header_buffers 4 64k;
# 客户端请求体大小
client_max_body_size 8m;
# 开启TCP_NODELAY
tcp_nodelay on;
# 开启TCP_NOPUSH
tcp_nopush on;
}2.2 反向代理优化
在location或upstream中添加:
upstream backend {
server 127.0.0.1:8080 max_fails=3 fail_timeout=30s;
server 127.0.0.1:8081 max_fails=3 fail_timeout=30s;
# 负载均衡算法
least_conn;
# 开启keepalive
keepalive 32;
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend;
# 代理超时设置
proxy_connect_timeout 5s;
proxy_send_timeout 10s;
proxy_read_timeout 10s;
# 代理缓冲区设置
proxy_buffering on;
proxy_buffer_size 4k;
proxy_buffers 8 4k;
proxy_busy_buffers_size 32k;
# 代理头设置
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;
}
}2.3 静态资源优化
设置缓存头:
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {
expires 1y;
add_header Cache-Control "public, immutable";
access_log off;
}开启sendfile和aio:
http {
sendfile on;
aio on;
directio 512;
}三、性能测试
3.1 使用wrk进行压力测试
# 安装wrk
sudo apt-get install wrk
# 测试命令:1000个并发,持续30秒
wrk -c 10000 -d 30s http://localhost3.2 监控Nginx状态
开启status模块:
location /nginx_status {
stub_status on;
access_log off;
allow 127.0.0.1;
deny all;
}查看状态:
curl http://localhost/nginx_status四、常见问题与解决方案
4.1 连接数上不去
可能原因:
- ulimit限制过低
- 内核参数配置不足
- worker_connections设置过小
解决方案:
- 调整ulimit -n
- 修改sysctl.conf中的网络参数
- 增加worker_connections
4.2 CPU使用率过高
可能原因:
- gzip压缩级别过高
- 正则表达式匹配效率低
- 工作进程数过多
解决方案:
- 降低gzip_comp_level至4-5
- 优化正则表达式
- 调整worker_processes为CPU核心数
4.3 内存使用率过高
可能原因:
- 缓冲区设置过大
- 打开了不必要的模块
- 内存泄漏
解决方案:
- 调整缓 冲区大小
- 关闭不必要的模块
- 更新Nginx版本
结论
通过系统层面和Nginx配置层面的优化,我们可以充分发挥Nginx的性能潜力,轻松突破十万并发。需要注意的是,优化参数应根据实际硬件配置和业务场景进行调整,没有一劳永逸的配置方案。建议在优化前进行充分的性能测试,找出瓶颈所在,再针对性地进行优化。
(此内容由 AI 辅助生成,仅供参考)