4-nginx配置优化

nginx.jpg

nginx配置优化

性能优化

  • 工作进程配置:
    worker_processes:设置为与 CPU 核数相同,以充分利用多核处理器。
    worker_cpu_affinity:为每个工作进程绑定特定的 CPU 核心,减少上下文切换。
    worker_connections:设置每个工作进程的最大连接数,计算公式为 worker_processes * worker_connections。
    worker_rlimit_nofile:设置 Nginx 服务器的最大文件描述符数,避免 “too many opened files” 错误。
    事件处理模型:
    use epoll:在 Linux 系统中使用 epoll 事件模型,提高性能。
    accept_mutex:控制工作进程对新连接的竞争,避免惊群问题。
    accept_mutex_delay:设置工作进程等待锁的时间,平衡负载。
    multi_accept:让工作进程一次性接受所有待处理的连接,提高处理效率。

    日志和错误处理

    错误日志:
    error_log:设置错误日志的路径和日志级别,帮助诊断问题。
    log_format:自定义日志格式,记录更多有用的信息。
    access_log:设置访问日志的路径和格式,监控访问情况。

    静态文件处理

    缓存:
    sendfile:启用 sendfile,直接将文件从文件系统发送到客户端,减少内存拷贝。
    tcp_nopush:在所有数据准备完毕后一次性发送数据包,减少网络拥塞。
    open_file_cache:缓存打开的文件描述符,提高静态文件的访问速度。

    动态内容处理

    FastCGI 缓存:
    fastcgi_cache:启用 FastCGI 缓存,减少后端服务器的负载。
    fastcgi_cache_key:设置缓存键,确保缓存的唯一性。
    fastcgi_cache_valid:设置缓存的有效时间。

    安全性和防护

  • 限制请求速率:
    limit_req:限制客户端的请求速率,防止 DDoS 攻击。
    limit_conn:限制每个客户端的连接数,防止资源耗尽。
  • 隐藏版本信息:
    server_tokens off;:关闭服务器版本信息的显示,提高安全性。

    SSL/TLS 配置

  • SSL/TLS 协议和加密套件:
    ssl_protocols:指定支持的 SSL/TLS 协议版本。
    ssl_ciphers:指定支持的加密套件。
    ssl_prefer_server_ciphers on;:优先使用服务器的加密套件。
  • 证书和密钥:
    ssl_certificate:指定 SSL 证书文件路径。
    ssl_certificate_key:指定 SSL 密钥文件路径。

    负载均衡

    上游服务器配置:
    upstream:定义后端服务器池,实现负载均衡。
    least_conn:将请求分配给当前连接数最少的服务器。
    ip_hash:基于客户端 IP 地址进行会话保持。

    反向代理

    代理缓存:
    proxy_cache:启用代理缓存,减少后端服务器的负载。
    proxy_cache_key:设置缓存键,确保缓存的唯一性。
    proxy_cache_valid:设置缓存的有效时间。

    其他优化技巧

  • 压缩:
    gzip:启用 gzip 压缩,减少传输数据量。
    gzip_types:指定需要压缩的 MIME 类型。
    gzip_comp_level:设置压缩级别,平衡性能和压缩效果。
  • 超时设置:
    keepalive_timeout:设置长连接的超时时间,减少 TCP 握手次数。
    client_header_timeout:设置客户端头部的超时时间。
    client_body_timeout:设置客户端请求体的超时时间。

综合优化Nginx配置示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
user  nginx;  # 设置运行 Nginx 的用户为 nginx
worker_processes auto; # 自动设置工作进程数量,通常设置为 CPU 核心数

events {
worker_connections 1024; # 每个工作进程允许的最大连接数
use epoll; # 使用 epoll 事件模型,提高性能(适用于 Linux)
accept_mutex on; # 启用 accept_mutex,避免惊群问题
accept_mutex_delay 500ms; # 设置工作进程等待锁的时间,平衡负载
multi_accept on; # 让工作进程一次性接受所有待处理的连接,提高处理效率
}

http {
include mime.types; # 包含 MIME 类型配置文件
default_type application/octet-stream; # 默认 MIME 类型

sendfile on; # 启用 sendfile,直接将文件从文件系统发送到客户端,减少内存拷贝
tcp_nopush on; # 在所有数据准备完毕后一次性发送数据包,减少网络拥塞
tcp_nodelay on; # 启用 TCP_NODELAY,提高小数据包的传输效率

keepalive_timeout 65; # 设置长连接的超时时间,减少 TCP 握手次数
client_header_timeout 10s; # 设置客户端头部的超时时间
client_body_timeout 10s; # 设置客户端请求体的超时时间

gzip on; # 启用 gzip 压缩,减少传输数据量
gzip_types text/plain application/x-javascript text/css application/xml text/javascript application/json; # 指定需要压缩的 MIME 类型
gzip_comp_level 6; # 设置压缩级别,平衡性能和压缩效果

open_file_cache max=1000 inactive=20s; # 缓存打开的文件描述符,提高静态文件的访问速度
open_file_cache_valid 30s; # 设置缓存的有效时间
open_file_cache_min_uses 2; # 文件至少被使用的次数才被缓存
open_file_cache_errors on; # 缓存文件打开错误信息

access_log /var/log/nginx/access.log combined; # 设置访问日志的路径和格式,监控访问情况
error_log /var/log/nginx/error.log warn; # 设置错误日志的路径和日志级别,帮助诊断问题

server {
listen 80; # 监听 80 端口
server_name example.com; # 设置服务器名称

location / {
root /usr/share/nginx/html; # 设置根目录
index index.html index.htm; # 设置默认索引文件
}

location /api {
proxy_pass http://backend_server; # 将请求代理到后端服务器
proxy_set_header Host $host; # 设置代理请求头中的 Host 字段
proxy_set_header X-Real-IP $remote_addr; # 设置代理请求头中的 X-Real-IP 字段
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 设置代理请求头中的 X-Forwarded-For 字段
proxy_set_header X-Forwarded-Proto $scheme; # 设置代理请求头中的 X-Forwarded-Proto 字段
}

location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000; # 将 PHP 请求传递给 FastCGI 进程
fastcgi_index index.php; # 设置默认的 PHP 文件名
fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; # 设置脚本文件路径
include fastcgi_params; # 包含 FastCGI 参数配置文件
}

error_page 404 /404.html; # 设置 404 错误页面
error_page 500 502 503 504 /50x.html; # 设置 5xx 错误页面
location = /50x.html {
root /usr/share/nginx/html; # 设置 5xx 错误页面的根目录
}
}

upstream backend_server {
server 192.168.1.101; # 定义后端服务器地址
server 192.168.1.102; # 定义后端服务器地址
least_conn; # 使用最少连接数算法进行负载均衡
}

limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; # 限制每个客户端的请求速率,防止 DDoS 攻击
limit_conn_zone $binary_remote_addr zone=addr:10m; # 限制每个客户端的连接数,防止资源耗尽

ssl_protocols TLSv1.2 TLSv1.3; # 指定支持的 SSL/TLS 协议版本
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES256-GCM-SHA384'; # 指定支持的加密套件
ssl_prefer_server_ciphers on; # 优先使用服务器的加密套件

server {
listen 443 ssl; # 监听 443 端口,并启用 SSL
server_name example.com; # 设置服务器名称

ssl_certificate /etc/nginx/ssl/example.com.crt; # 指定 SSL 证书文件路径
ssl_certificate_key /etc/nginx/ssl/example.com.key; # 指定 SSL 密钥文件路径

location / {
root /usr/share/nginx/html; # 设置根目录
index index.html index.htm; # 设置默认索引文件
}
}
}