Nginx 的默认配置对于个人小博客来说绰绰有余,但一旦你的网站流量开始增长,如果不做调优,服务器很容易在并发高峰期出现 502 Bad Gateway。

今天翻看之前的运维笔记,整理了几个 Nginx 在生产环境中必须调整的关键参数。

1. 榨干 CPU:Worker 进程优化

Nginx 是基于事件驱动和异步非阻塞架构的。默认配置下,worker_processes 通常是 1。这完全浪费了现在的多核服务器。

打开你的 nginx.conf,将这个参数设置为 auto,让 Nginx 自动匹配 CPU 核心数:

1
2
3
worker_processes auto;
worker_cpu_affinity auto; # 绑定 CPU 核心,减少上下文切换
worker_rlimit_nofile 65535; # 每个 worker 能打开的最大文件描述符数

2. 突破连接数瓶颈

很多人发现网站卡顿,查了 CPU 和内存都没跑满,最后发现是连接数超了。在 events 块中,我们需要调整最大连接数,并开启 epoll 模式(Linux 环境下必开)。

1
2
3
4
5
events {
use epoll;
worker_connections 65535;
multi_accept on;
}

重要:调整这个参数的同时,记得去 Linux 系统层面修改 ulimit -n

1
2
3
# 在 /etc/security/limits.conf 添加
* soft nofile 65535
* hard nofile 65535

3. 开启 Gzip 压缩

现在的云服务器,带宽通常比 CPU 更昂贵。开启 Gzip 可以大幅压缩 HTML、CSS、JS 的体积,加快前端加载速度。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
http {
gzip on;
gzip_comp_level 5;
gzip_min_length 256;
gzip_proxied any;
gzip_vary on;
gzip_types
text/plain
text/css
text/xml
application/json
application/javascript
application/xml+rss
image/svg+xml;
}

如果你的用户主要使用现代浏览器,强烈建议同时开启 Brotli 压缩(需要额外安装 ngx_brotli 模块),压缩率比 Gzip 高 15-25%。

4. Buffer 缓冲区调优

当 Nginx 作为反向代理时,如果后端响应体积较大而 Buffer 配置太小,会导致临时文件频繁写入磁盘(I/O 瓶颈)。根据你的内存情况,合理增大 Buffer:

1
2
3
4
5
6
7
8
9
10
11
http {
client_body_buffer_size 128k;
client_max_body_size 100m;
client_header_buffer_size 4k;
large_client_header_buffers 4 16k;

proxy_buffer_size 4k;
proxy_buffers 8 64k;
proxy_busy_buffers_size 128k;
proxy_temp_file_write_size 128k;
}

5. Keepalive 长连接

HTTP 请求默认是短连接——每次请求完成后连接即断开。频繁的 TCP 握手是非常昂贵的。开启 Keepalive 可以极大减少延迟:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
http {
keepalive_timeout 65;
keepalive_requests 100;
}

# 反向代理到后端服务时也要加上 Keepalive
upstream backend {
server 127.0.0.1:3000;
keepalive 32;
}

server {
location /api/ {
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Connection "";
}
}

6. 开启反向代理缓存

如果你的博客是动态生成页面,每次请求都要查询数据库、渲染模板,压力很大。Nginx 的反向代理缓存可以将动态页面缓存到本地磁盘或内存中,后续请求直接返回缓存:

1
2
3
4
5
6
7
8
9
10
11
12
13
http {
proxy_cache_path /tmp/nginx_cache levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m;

server {
location / {
proxy_cache my_cache;
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
proxy_cache_key "$scheme$host$request_uri";
add_header X-Cache-Status $upstream_cache_status;
}
}
}

7. 开启 HTTP/2

HTTP/2 支持多路复用、头部压缩和服务端推送,能显著提升页面加载速度。前提是必须开启 HTTPS:

1
2
3
4
server {
listen 443 ssl http2;
http2_push_preload on; # 允许服务端推送关键资源
}

验证是否生效:curl -I --http2 https://yourdomain.com

踩坑总结

调优永远没有标准答案,所有的参数都要根据你的实际业务模型(IO 密集型还是计算密集型)来微调。建议每次修改配置后,都用 abwrk 命令压测一下,用数据说话:

1
2
3
4
5
# ab 压测
ab -n 10000 -c 100 https://yourdomain.com/

# wrk 压测(更现代)
wrk -t4 -c100 -d30s https://yourdomain.com/

调优的目的不是盲目追求高参数,而是让每一分硬件资源都用到刀刃上。