Nginx 安全与性能优化 — 14 个关键要点

1. CPU 亲和性绑定(worker_cpu_affinity)

Nginx worker 进程绑定到特定 CPU 核心,减少上下文切换开销。配置示例:

worker_processes auto;
worker_cpu_affinity auto;

2. 使用 epoll 事件模型

Linux 下必须使用 epoll,比 select/poll 性能高一个数量级:

events {
    use epoll;
    worker_connections 65535;
    multi_accept on;
}

3. 启用 sendfile 零拷贝

直接在内核空间传输文件,绕过用户态拷贝:

sendfile on;
tcp_nopush on;

4. 开启 Gzip 压缩

压缩响应体,节省带宽。注意不要压缩图片/视频等已压缩资源:

gzip on;
gzip_min_length 1k;
gzip_comp_level 6;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
gzip_vary on;
gzip_disable "MSIE [1-6]\.";

5. 防盗链配置(valid_referers)

防止图片等资源被外部网站直接引用,消耗带宽:

location ~* \.(gif|jpg|jpeg|png|bmp|swf)$ {
    valid_referers none blocked chenganriji.xyz *.chenganriji.xyz;
    if ($invalid_referer) {
        return 403;
    }
}

6. HTTPS/TLS 优化配置

启用 HTTP/2、配置安全加密套件、开启 OCSP Stapling:

listen 443 ssl http2;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_stapling on;
ssl_stapling_verify on;

7. 连接数限制

防止单个 IP 占用过多连接资源,防御简单 DDoS:

limit_conn_zone $binary_remote_addr zone=addr:10m;
limit_conn addr 10;

8. 请求速率限制

防止暴力破解、接口刷量:

limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s;
limit_req zone=req_limit burst=20 nodelay;

9. 隐藏 Nginx 版本号

减少信息泄露,增加攻击者信息收集难度:

server_tokens off;

10. 配置超时参数

合理设置超时,防止慢速攻击和资源占用:

client_body_timeout 30;
client_header_timeout 30;
keepalive_timeout 65;
send_timeout 30;

11. 缓冲区大小优化

调整请求头和请求体的缓冲区大小:

client_body_buffer_size 128k;
client_header_buffer_size 4k;
large_client_header_buffers 4 32k;
client_max_body_size 100m;

12. 静态资源缓存策略

为静态资源设置长缓存时间,减少重复请求:

location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg|woff|woff2|ttf|eot)$ {
    expires 30d;
    add_header Cache-Control "public, immutable";
}

13. 反向代理安全头

作为反向代理时添加安全响应头:

add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;

14. 日志切割与轮转

生产环境必须配置日志切割,防止日志撑满磁盘:

# 借助 logrotate 或 crontab + 脚本
# 0 0 * * * /usr/bin/mv /var/log/nginx/access.log /var/log/nginx/access_$(date +\%Y\%m\%d).log && nginx -s reopen
滚动至顶部