Ubuntu上Nginx性能优化技巧
Nginx的进程模型是其高性能的核心基础,需合理配置以充分利用服务器CPU资源。
auto,让Nginx自动检测服务器CPU核心数(如4核服务器会启动4个工作进程),避免手动配置的资源浪费或不足。auto使用,将每个工作进程绑定到独立的CPU核心,减少进程切换的开销,提升CPU缓存命中率。worker_connections 4096:每个工作进程的最大并发连接数(需根据服务器内存调整,每连接约消耗2-4KB内存);multi_accept on:让工作进程一次性接受所有新连接,减少accept系统调用的次数;use epoll:采用Linux高效的epoll事件驱动模型(适用于高并发场景),替代传统的select/poll模型。通过优化传输层的配置,降低网络延迟和带宽占用。
sendfile配合使用,仅在数据包填满时才发送,避免小数据包的频繁传输,提高网络利用率。通过缓存静态资源和代理响应,降低后端服务器的压力。
expires和Cache-Control头部,让浏览器缓存文件,减少重复请求。示例:location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 365d; # 浏览器缓存1年
add_header Cache-Control "public, max-age=31536000";
}
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; # 200/302状态码缓存10分钟
proxy_cache_valid 404 1m; # 404状态码缓存1分钟
proxy_cache_use_stale error timeout updating; # 缓存过期或更新时仍可使用旧缓存
}
调整Ubuntu内核参数,优化TCP连接管理和文件系统性能。
/etc/security/limits.conf,添加以下内容,提升用户和root的最大文件描述符数:* soft nofile 65535
* hard nofile 65535
root soft nofile 65535
root hard nofile 65535
/etc/sysctl.conf,添加以下配置并执行sudo sysctl -p生效:net.core.somaxconn = 65535 # 监听队列的最大长度(避免SYN洪水攻击导致连接被拒绝)
net.ipv4.ip_local_port_range = 1024 65535 # 临时端口范围(扩大端口可用数量)
net.ipv4.tcp_tw_reuse = 1 # 快速回收TIME-WAIT状态的连接(提升TCP连接复用率)
net.ipv4.tcp_fin_timeout = 30 # TIME-WAIT状态的超时时间(默认60秒,缩短减少资源占用)
HTTP/2相比HTTP/1.1支持多路复用、头部压缩等特性,能显著提升页面加载速度。
server块中修改listen指令,添加http2参数:listen 443 ssl http2; # 必须配合SSL证书使用(HTTP/2通常在加密连接上运行)
ssl_protocols TLSv1.2 TLSv1.3; # 仅使用TLS 1.2及以上安全协议
ssl_session_cache shared:SSL:10m; # 会话缓存(10MB),存储SSL会话信息
ssl_session_timeout 10m; # 会话超时时间(10分钟)
Keepalive通过保持客户端与服务器的连接,避免频繁的TCP三次握手和四次挥手,提升并发性能。
http {
keepalive_timeout 65;
keepalive_requests 100;
}
对于高流量场景,通过Nginx的反向代理功能将请求分发到多个后端服务器,提升整体处理能力。
http {
upstream backend {
server backend1.example.com weight=3; # 权重3,处理更多请求
server backend2.example.com;
server backend3.example.com;
}
server {
listen 80;
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
}