Nginx作为当前最流行的Web服务器和反向代理服务器之一,以其卓越的性能和灵活的配置体系被广泛应用于各类生产环境。然而,默认安装的Nginx配置往往无法发挥其全部性能潜力。本文将从实际运维角度出发,系统讲解Nginx在高并发场景下的配置优化策略。
一、worker进程与连接数优化
Nginx采用多进程架构,由一个master进程和多个worker进程组成。worker进程数量的设置直接影响并发处理能力。
worker_processes auto;
worker_rlimit_nofile 65535;
events {
worker_connections 10240;
use epoll;
multi_accept on;
}
worker_processes设为auto可以让Nginx自动检测CPU核心数并创建对应数量的worker进程。在高并发场景下,worker_connections建议设置为10240或更高。需要注意的是,Nginx的最大连接数等于worker_processes乘以worker_connections,同时还要确保系统的文件描述符限制(ulimit -n)足够大。
二、反向代理配置与超时调优
反向代理是Nginx最常见的使用场景之一。在配置反向代理时,超时参数的设置至关重要,不合理超时会导致请求堆积或后端服务雪崩。
http {
upstream backend {
server 192.168.1.10:8080 weight=3 max_fails=3 fail_timeout=30s;
server 192.168.1.11:8080 weight=2 max_fails=3 fail_timeout=30s;
server 192.168.1.12:8080 backup;
keepalive 32;
}
server {
listen 80;
server_name api.example.com;
location / {
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Connection "";
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_connect_timeout 5s;
proxy_send_timeout 30s;
proxy_read_timeout 60s;
proxy_buffering on;
proxy_buffer_size 16k;
proxy_buffers 8 32k;
proxy_busy_buffers_size 64k;
}
}
}
其中proxy_connect_timeout不宜设置过长,一般5秒即可,避免后端故障时请求长时间等待。proxy_read_timeout根据后端接口的响应时间合理设置,API接口建议60秒以内。启用keepalive可以显著减少与后端服务器建立TCP连接的开销。
三、负载均衡策略选择
Nginx支持多种负载均衡策略,根据业务场景选择合适的策略至关重要:
轮询(默认):按顺序依次分配请求,适用于后端服务器性能相近的场景。
权重(weight):按权重比例分配请求,适用于后端服务器性能不均的场景。
IP哈希(ip_hash):根据客户端IP分配到固定后端,适用于需要会话保持的场景:
upstream backend {
ip_hash;
server 192.168.1.10:8080;
server 192.168.1.11:8080;
}
最少连接(least_conn):将请求分配给当前连接数最少的后端服务器,适用于请求处理时间差异较大的场景:
upstream backend {
least_conn;
server 192.168.1.10:8080;
server 192.168.1.11:8080;
}
四、Gzip压缩与缓存优化
启用Gzip压缩可以显著减少网络传输量,提升页面加载速度。同时,合理的缓存配置可以减轻后端压力。
http {
gzip on;
gzip_min_length 1k;
gzip_comp_level 6;
gzip_types text/plain text/css application/json
application/javascript text/xml application/xml
application/xml+rss text/javascript image/svg+xml;
gzip_vary on;
gzip_proxied any;
proxy_cache_path /var/cache/nginx levels=1:2
keys_zone=api_cache:100m
max_size=1g inactive=30m
use_temp_path=off;
server {
location /api/ {
proxy_pass http://backend;
proxy_cache api_cache;
proxy_cache_key "$scheme$request_method$host$request_uri";
proxy_cache_valid 200 304 10m;
proxy_cache_valid 404 1m;
proxy_cache_use_stale error timeout updating;
add_header X-Cache-Status $upstream_cache_status;
}
}
}
gzip_comp_level设为6是一个性能与压缩比的平衡点。缓存配置中,keys_zone定义了缓存共享内存区域的大小,max_size定义了缓存文件在磁盘上的最大占用空间。proxy_cache_use_stale允许在后端故障时使用过期缓存,提高系统容错能力。
五、安全加固配置
生产环境下的Nginx还需要进行安全加固,防止常见攻击:
server {
server_tokens off;
if ($request_method !~ ^(GET|POST|HEAD|PUT|DELETE)$ ) {
return 405;
}
location ~ /\. {
deny all;
}
client_max_body_size 10m;
limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s;
location /api/ {
limit_req zone=api_limit burst=20 nodelay;
proxy_pass http://backend;
}
}
limit_req_zone定义了基于客户端IP的限流策略,rate=10r/s表示每秒允许10个请求,burst=20允许突发20个请求排队。这套配置能有效防止恶意请求对后端造成冲击。
总结
Nginx的性能优化是一个系统工程,涉及进程模型、网络配置、缓存策略和安全加固等多个层面。在实际运维中,建议使用nginx -t验证配置语法,使用ab或wrk工具进行压力测试,根据实际测试结果逐步调整参数。同时,关注Nginx的error.log和access.log日志,通过日志分析发现性能瓶颈,持续优化服务器配置。