后端

Nginx性能优化实战:突破十万并发的核心技巧与配置

TRAE AI 编程助手

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 -p

1.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 反向代理优化

locationupstream中添加

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://localhost

3.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 辅助生成,仅供参考)