Nginx worker 进程绑定到特定 CPU 核心,减少上下文切换开销。配置示例:
worker_processes auto; worker_cpu_affinity auto;
Linux 下必须使用 epoll,比 select/poll 性能高一个数量级:
events {
use epoll;
worker_connections 65535;
multi_accept on;
}直接在内核空间传输文件,绕过用户态拷贝:
sendfile on; tcp_nopush on;
压缩响应体,节省带宽。注意不要压缩图片/视频等已压缩资源:
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]\.";
防止图片等资源被外部网站直接引用,消耗带宽:
location ~* \.(gif|jpg|jpeg|png|bmp|swf)$ {
valid_referers none blocked chenganriji.xyz *.chenganriji.xyz;
if ($invalid_referer) {
return 403;
}
}启用 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;
防止单个 IP 占用过多连接资源,防御简单 DDoS:
limit_conn_zone $binary_remote_addr zone=addr:10m; limit_conn addr 10;
防止暴力破解、接口刷量:
limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s; limit_req zone=req_limit burst=20 nodelay;
减少信息泄露,增加攻击者信息收集难度:
server_tokens off;
合理设置超时,防止慢速攻击和资源占用:
client_body_timeout 30; client_header_timeout 30; keepalive_timeout 65; send_timeout 30;
调整请求头和请求体的缓冲区大小:
client_body_buffer_size 128k; client_header_buffer_size 4k; large_client_header_buffers 4 32k; client_max_body_size 100m;
为静态资源设置长缓存时间,减少重复请求:
location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg|woff|woff2|ttf|eot)$ {
expires 30d;
add_header Cache-Control "public, immutable";
}作为反向代理时添加安全响应头:
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;
生产环境必须配置日志切割,防止日志撑满磁盘:
# 借助 logrotate 或 crontab + 脚本 # 0 0 * * * /usr/bin/mv /var/log/nginx/access.log /var/log/nginx/access_$(date +\%Y\%m\%d).log && nginx -s reopen