Ubuntu系统下Nginx性能优化指南
worker_processes auto;让Nginx自动匹配服务器CPU核心数(如4核CPU则启动4个工作进程),最大化利用CPU资源;添加worker_cpu_affinity auto;实现CPU亲和性绑定,减少进程在不同核心间切换的开销;设置worker_rlimit_nofile 65535;突破默认文件描述符限制,避免“Too many open files”错误。events块中,设置worker_connections 4096;(每个工作进程最大并发连接数,可根据服务器内存调整,如16GB内存可设为8192);开启multi_accept on;让一个工作进程一次性接收所有新连接,提升高并发下的连接处理效率;使用use epoll;(Linux下高性能事件驱动模型),减少事件通知的系统调用次数。sendfile on;启用零拷贝技术,直接将磁盘文件通过内核空间发送到网卡,避免数据在用户态与内核态之间拷贝,降低CPU负载;设置tcp_nopush on;配合sendfile使用,在发送数据包前填充至最大传输单元(MTU),减少小包数量,提高网络利用率;调整客户端缓冲区:client_body_buffer_size 16k;(请求体缓冲区,处理POST数据)、client_header_buffer_size 4k;(请求头缓冲区)、large_client_header_buffers 4 32k;(超大请求头缓冲区,如包含大量参数的URL),避免因缓冲区不足导致请求被拒绝。gzip on;压缩响应内容,减少传输数据量;设置gzip_min_length 256;(仅压缩大于256字节的响应,避免小文件压缩反而增加CPU开销)、gzip_comp_level 5;(压缩级别,1-9,平衡压缩率与CPU消耗)、gzip_types text/plain text/css application/json application/javascript text/xml;(指定压缩的MIME类型,覆盖静态资源与动态API响应);添加gzip_vary on;兼容老旧代理服务器,确保缓存正确。location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ { expires 365d; add_header Cache-Control "public, max-age=31536000"; },设置浏览器缓存时间为1年,减少重复请求;开启内存缓存open_file_cache max=1000 inactive=20s;(缓存1000个常用文件句柄,20秒未访问则失效)、open_file_cache_valid 30s;(每30秒验证缓存文件有效性)、open_file_cache_min_uses 2;(文件被访问2次后才加入缓存),加速静态文件访问。proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m;(定义缓存路径、层级结构、共享内存区域及最大大小),在location块中添加proxy_cache my_cache; proxy_cache_valid 200 302 10m; proxy_cache_valid 404 1m; proxy_cache_use_stale error timeout updating;,缓存200/302响应10分钟、404响应1分钟,并在缓存失效时仍能提供旧数据,避免频繁访问后端。调整Ubuntu内核参数以适应高并发场景,编辑/etc/sysctl.conf文件,添加以下配置:
net.core.somaxconn = 65535;(监听队列最大长度,避免SYN洪水攻击导致连接被拒绝);net.ipv4.ip_local_port_range = 1024 65535;(客户端临时端口范围,扩大端口可用数量);net.ipv4.tcp_tw_reuse = 1;(快速回收TIME-WAIT状态的连接,减少端口耗尽风险);fs.file-max = 2097152;(系统最大文件描述符数,配合worker_rlimit_nofile使用)。
修改后执行sudo sysctl -p使配置生效。listen 443 ssl http2;,利用HTTP/2的多路复用(一个连接并行处理多个请求)、头部压缩(HPACK算法)特性,减少延迟,提升页面加载速度。ssl_protocols TLSv1.2 TLSv1.3;(禁用不安全的SSLv3、TLSv1.0/1.1),减少加密计算开销;配置会话复用ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m;(缓存SSL会话信息,避免重复握手),降低TLS协商延迟。keepalive_timeout 65;(保持连接超时时间,允许连接空闲65秒后关闭),减少TCP三次握手次数,提升长连接效率;调整keepalive_requests 1000;(单个连接最大请求数),避免长期占用连接。nginx -V查看编译时的模块列表,禁用未使用的模块(如autoindex、gzip_static),减少内存占用;重新编译Nginx时使用--without-http_autoindex_module等选项。error_log /var/log/nginx/error.log warn;),避免过多调试日志占用磁盘IO;使用监控工具(如Prometheus+Grafana、Zabbix)监控Nginx的请求速率、响应时间、连接数等指标,及时发现性能瓶颈。upstream backend { server backend1.example.com weight=3; server backend2.example.com; }(weight参数指定权重,权重越高分配的流量越多)。