banner
约 600 字
2 分钟

Nginx 性能调优小记

-
-
无标签

摘要

整理了 10 个常用的 nginx 性能调优点:worker 连接数、缓冲区、gzip 压缩、静态缓存、open_file_cache、日志优化、keepalive、HTTP/2、TLS 配置等。

最近在折腾一台小机器的 nginx,整理几个常用的调优点。都是经过实测有效的,但不一定适合所有场景。先压测、再调优、再压测,永远别空想。

压测工具

推荐 wrk,比 ab 准、好用,能写 lua 脚本。

bash
# 简单跑
wrk -t4 -c100 -d30s https://example.com/
# 4 线程,100 并发,跑 30 秒

1. worker 数量和连接数

nginx
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. 缓冲区

nginx
http {
    client_body_buffer_size 16k;       # 请求体缓冲区(POST 数据)
    client_max_body_size 8m;           # 最大请求体(上传文件要调大)
    output_buffers 4 32k;              # 响应缓冲区
}

3. 压缩

nginx
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. 静态资源缓存

nginx
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

nginx
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. 日志优化

nginx
access_log /var/log/nginx/access.log combined buffer=32k flush=5s;
error_log /var/log/nginx/error.log warn;

7. keepalive

nginx
keepalive_timeout 65;
keepalive_requests 1000;       # 单连接最大请求数

upstream backend {
    keepalive 32;              # upstream 池里预留的 keepalive 连接
    server 10.0.0.1:8080;
}

8. HTTP/2

nginx
listen 443 ssl http2;          # HTTP/2

9. TLS 优化

nginx
ssl_protocols TLSv1.2 TLSv1.3;
ssl_session_cache shared:SSL:10m;
ssl_stapling on;
ssl_stapling_verify on;

10. 一些反直觉的坑

  1. worker_connections 不是越大越好。4096 已经是过剩。

  2. sendfile on 默认开着,和 gzip 不冲突。

  3. tcp_nodelay 别乱开,会和 keepalive 协同不好。

END

相关文章

暂无相关文章