Nginx 是一个高性能的 HTTP 服务器和反向代理服务器,广泛用于处理高并发请求。然而,默认配置并不一定适合所有场景,尤其是在高流量或复杂业务逻辑的情况下。

一、Nginx基础配置优化

1. 调整woker_processes和woker_connections

Nginx 使用多进程模型来处理请求。worker_processes 定义了 Nginx 使用的工作进程数,而 worker_connections 定义了每个工作进程可以处理的最大连接数。


worker_processes auto;  # 自动根据CPU核心数设置工作进程数
events {
    worker_connections 1024;  # 每个工作进程的最大连接数
}
  • worker_processes:设置为 auto 可以让 Nginx 自动根据 CPU 核心数来分配工作进程数。如果你的服务器有 4 个 CPU 核心,Nginx 会启动 4 个工作进程。
  • worker_connections:这个值决定了每个工作进程可以处理的最大连接数。通常,你可以根据服务器的内存和网络带宽来调整这个值。1024 是一个常见的起点,你可以调整到2048。

2. 启用keepalive连接

HTTP 协议中的 keepalive 机制允许客户端和服务器在同一个连接上发送多个请求,减少了 TCP 连接的建立和关闭开销。

http {
    keepalive_timeout 65;  # 保持连接的超时时间
    keepalive_requests 100;  # 单个连接上允许的最大请求数
}
  • keepalive_timeout:定义了客户端与服务器保持连接的时间。设置为 65 秒意味着如果客户端在 65 秒内没有发送新的请求,连接将被关闭。
  • keepalive_requests:定义了单个连接上允许的最大请求数。设置为 100 意味着一个连接可以处理 100 个请求后关闭。

3. 调整buffer大小

Nginx 使用缓冲区来存储请求和响应数据。如果缓冲区设置过小,Nginx 可能会频繁地进行磁盘 I/O 操作,影响性能。

http {
    client_body_buffer_size 10K;  # 客户端请求体缓冲区大小
    client_header_buffer_size 1k;  # 客户端请求头缓冲区大小
    large_client_header_buffers 48k;  # 大型请求头的缓冲区
}
  • client_body_buffer_size:定义了用于存储客户端请求体的缓冲区大小。如果请求体超过这个大小,Nginx 会将数据写入磁盘。
  • client_header_buffer_size:定义了用于存储客户端请求头的缓冲区大小。
  • large_client_header_buffers:定义了用于存储大型请求头的缓冲区数量和大小。

二、使用缓存提升Nginx性能

1. 启动静态资源缓存

对于静态资源(如图片、CSSJavaScript 文件),启用缓存可以显著减少服务器的负载。

location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
    expires 30d;  # 缓存30天
    add_header Cache-Control "public, no-transform";
}
  • expires:定义了资源的缓存时间。30d 表示资源将被缓存 30 天。
  • Cache-Controlpublic 表示资源可以被任何缓存(如浏览器、CDN)缓存,no-transform 表示不允许代理服务器对资源进行转换(如压缩)。

2. 使用代理缓存

如果你使用 Nginx 作为反向代理,可以启用代理缓存来缓存后端服务器的响应。

proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g inactive=60m use_temp_path=off;

server {
    location / {
        proxy_cache my_cache;
        proxy_pass http://backend;
        proxy_cache_valid 200 302 10m;  # 缓存200和302状态码的响应10分钟
        proxy_cache_valid 404 1m;  # 缓存404状态码的响应1分钟
    }
}
  • proxy_cache_path:定义了缓存存储的路径、缓存键的存储区域(keys_zone)、缓存的最大大小(max_size)以及缓存的有效期(inactive)。
  • proxy_cache:启用缓存并使用指定的缓存区域。
  • proxy_cache_valid:定义了不同状态码的缓存时间。

3. 使用gzip压缩减少网络传输量

gzip 压缩可以显著减少传输的数据量,从而加快页面加载速度。

http {
    gzip on;  # 启用gzip压缩
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;  # 压缩的文件类型
    gzip_comp_level 6;  # 压缩级别,1-9,6是默认值
    gzip_min_length 256;  # 最小压缩文件大小
    gzip_proxied any;  # 对所有代理请求启用压缩
    gzip_vary on;  # 添加Vary: Accept-Encoding响应头
}
  • gzip:启用 gzip 压缩。
  • gzip_types:定义了需要压缩的文件类型。通常包括文本文件、CSSJavaScriptXML 等。
  • gzip_comp_level:定义了压缩级别,范围是 1 到 9。1 是最低压缩率,9 是最高压缩率。默认值为 6。
  • gzip_min_length:定义了最小压缩文件大小。小于这个大小的文件不会被压缩。
  • gzip_proxied:定义了是否对代理请求启用压缩。any 表示对所有代理请求启用压缩。
  • gzip_vary:添加 Vary: Accept-Encoding 响应头,确保代理服务器正确处理缓存。

三、其它优化技巧

1. 使用HTTP/2

HTTP/2 提供了多路复用、头部压缩等特性,可以显著提升性能。

server {
    listen 443 ssl http2;  # 启用HTTP/2
    ssl_certificate /path/to/cert.pem;
    ssl_certificate_key /path/to/key.pem;
}
  • http2:在 listen 指令中添加 http2 参数即可启用 HTTP/2

2. 限制请求速率

为了防止恶意请求或突发流量导致服务器过载,可以使用 limit_req 模块限制请求速率。

http {
    limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;  # 定义限流区域

    server {
        location / {
            limit_req zone=one burst=5;  # 应用限流
        }
    }
}
  • limit_req_zone:定义了限流区域。$binary_remote_addr 表示根据客户端 IP 地址进行限流,rate=1r/s 表示每秒允许 1 个请求。
  • limit_req:在指定的位置应用限流。burst=5 表示允许突发 5 个请求。

3. 负载均衡

通过 upstream 模块可以将请求分发到多个后端服务器,提高并发处理能力。例如:

upstream backend {
    server 192.168.1.1:8080;
    server 192.168.1.2:8080;
}

server {
    location / {
        proxy_pass http://backend;
    }
}

4. 日志优化

调整日志级别可以减少日志输出量,提升性能。例如:

access_log /var/log/nginx/access.log main buffer=16k;
error_log /var/log/nginx/error.log warn;

这表示将访问日志的缓冲区大小设置为 16KB,并将错误日志级别设置为 warn

四、总结

通过优化 Nginx 配置参数、使用缓存、启用 Gzip 压缩以及限制请求速率等手段,可以显著提升 Nginx 的性能和响应速度。在实际应用中,需要根据服务器的硬件配置和业务需求进行调整和优化。同时,建议定期监控 Nginx 的性能指标,并进行压力测试,以验证优化效果并进一步调整。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐