您的位置:

Nginx 优化指南

一、基础优化

1、调整 worker_processes

Nginx 的 worker_processes 参数决定了工作进程的数量,不宜设置过高,否则会占用大量的 CPU 和内存资源,每个进程一般占用 1MB 左右的内存。在大多数情况下,建议将 worker_processes 设置为 CPU 核心数的值,以提高 CPU 利用率和响应速度。

worker_processes 4;

2、调整 worker_connections

worker_connections 指定了每个 worker 进程所支持的最大连接数,过低的话会导致请求被拒绝的问题,过高则会导致服务质量下降,建议根据实际情况适当调整。

worker_connections 1024;

3、开启 sendfile

sendfile 可以提高文件传输效率,通过直接在内核空间和磁盘之间传输数据来实现服务端零拷贝。

sendfile on;

二、缓存优化

1、开启缓存

可以通过设置 proxy_cache_path 和 proxy_cache 启用 Nginx 的缓存功能,将一部分静态资源缓存到本地,避免多次请求带来的延迟。

proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m inactive=60m;
location / {
    proxy_cache my_cache;
    proxy_cache_valid 200 1h;
    proxy_cache_valid 403 404 1m;
    proxy_pass http://backend;
}

2、开启 gzip 压缩

启用 gzip 压缩可以减少传输数据的大小,加快响应速度,并节省带宽资源。

gzip on;
gzip_comp_level 2;
gzip_min_length 1000;
gzip_proxied any;
gzip_types text/plain text/css application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript;

三、安全优化

1、限制文件上传大小

在上传文件时,为了防止用户恶意上传过大的文件占用服务器空间,可以限制文件上传大小。

client_max_body_size 10m;

2、开启 SSL

如果网站需要加密传输,可以开启 SSL,通过 HTTPS 协议进行通信,增加数据传输的安全性。

server {
    listen 443 ssl;
    server_name example.com;
    ssl_certificate /path/to/cert.pem;
    ssl_certificate_key /path/to/key.pem;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256;
    ...
}

3、添加安全头部

通过添加安全头部,可以进一步加强网站的安全性,例如防止 XSS 攻击。

add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options nosniff;
add_header X-Frame-Options "SAMEORIGIN";

四、性能优化

1、使用反向代理

Nginx 可以通过反向代理的方式将请求转发到后端服务,提高服务响应速度和稳定性。

location / {
    proxy_pass http://backend;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
}

2、开启 TCP_NODELAY

TCP_NODELAY 参数可以减少 TCP 连接的延迟,提高数据传输的速度。

tcp_nopush on;
tcp_nodelay on;

3、使用 FastCGI 缓存

FastCGI 可以将请求转发到静态资源缓存服务器,将一部分请求缓存到磁盘上,减少后续请求的响应时间。

fastcgi_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m inactive=60m;
location / {
    fastcgi_cache my_cache;
    fastcgi_cache_valid 200 1h;
    fastcgi_cache_valid 403 404 1m;
    include fastcgi_params;
    fastcgi_pass backend;
}