Nginx 性能调优小记

最近在折腾一台小机器的 nginx，整理几个常用的调优点。都是经过实测有效的，但不一定适合所有场景。先压测、再调优、再压测，永远别空想。压测工具推荐 wrk，比 ab 准、好用，能写 lua 脚本。 # 简单跑 wrk -t4 -c100 -d30s https://example.com/ # 4 线程，100 并发，跑 30 秒 1. worker 数量和连接数 worker_processes auto; # 自动 = CPU 核数 worker_rlimit_nofile 65535; # 每个 worker 能打开的最大文件数 events { worker_connections 4096; # 每个 worker 最大并发连接 multi_accept on; # 一次性 accept 所有新连接 use epoll; # Linux 用 epoll，BSD/macOS 用 kqueue } 2. 缓冲区 http { client_body_buffer_size 16k; # 请求体缓冲区（POST 数据） client_max_body_size 8m; # 最大请求体（上传文件要调大） output_buffers 4 32k; # 响应缓冲区 } 3. 压缩 gzip on; gzip_vary on; # 给 Vary: Accept-Encoding 头 gzip_min_length 1024; # 小于 1KB 不压 gzip_comp_level 5; # 1-9，5 是速度和压缩比平衡 gzip_proxied any; # 后端响应不论带不带 Vary 都压 gzip_types text/plain text/css application/json application/javascript image/svg+xml; gzip_vary on 一定要开，否则 CDN 会缓存错版本。 4. 静态资源缓存 location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg|woff2?)$ { expires 1y; add_header Cache-Control "public, immutable"; access_log off; # 静态资源不打日志，省 IO } 5. open_file_cache http { open_file_cache max=1000 inactive=20s; open_file_cache_valid 30s; open_file_cache_min_uses 2; open_file_cache_errors on; } 6. 日志优化 access_log /var/log/nginx/access.log combined buffer=32k flush=5s; error_log /var/log/nginx/error.log warn; 7. keepalive keepalive_timeout 65; keepalive_requests 1000; # 单连接最大请求数 upstream backend { keepalive 32; # upstream 池里预留的 keepalive 连接 server 10.0.0.1:8080; } 8. HTTP/2 listen 443 ssl http2; # HTTP/2 9. TLS 优化 ssl_protocols TLSv1.2 TLSv1.3; ssl_session_cache shared:SSL:10m; ssl_stapling on; ssl_stapling_verify on; 10. 一些反直觉的坑 worker_connections 不是越大越好。4096 已经是过剩。 sendfile on 默认开着，和 gzip 不冲突。 tcp_nodelay 别乱开，会和 keepalive 协同不好。