nginx 的默认配置能跑,但直接上线等于裸奔。这份清单来自多次真实部署(包括本博客所在的那台二十几个服务共存的机器),按重要程度排序。
必做项
1. 压缩:开着,但默认只压 text/html
gzip on;
gzip_vary on;
gzip_min_length 1024;
gzip_comp_level 6;
gzip_types application/javascript text/css image/svg+xml
application/json text/plain application/xml;
一个大 JS 文件压缩前后差 3-4 倍,这是零成本的性能。检查:curl -sI -H "Accept-Encoding: gzip" URL | grep Content-Encoding。
2. 静态资源缓存头
location ~* \.(css|js|svg|woff2)$ {
expires 30d;
add_header Cache-Control "public, immutable";
}
Hugo/Vite 这类带内容哈希文件名的构建产物可以放心 immutable——文件名变了 URL 就变了。
3. 隐藏版本号:server_tokens off;——版本号是给攻击者的免费情报。
4. 请求体与超时限制
client_max_body_size 10m;
client_body_timeout 10s;
默认 body 1m,上传场景不够;超时不设,慢速攻击(loris)能挂住连接数。
应该做
5. 访问日志带上游耗时(排查慢接口的钥匙):
log_format main '$remote_addr "$request" $status ${body_bytes_sent} '
'rt=$request_time urt=$upstream_response_time';
urt 显著大于预期 → 问题在上游;rt 大但 urt 小 → 问题在 nginx 自己(buffer、带宽)。
6. 限流:登录、搜索这类端点至少加个简单漏斗:
limit_req_zone $binary_remote_addr zone=login:10m rate=5r/m;
location /login { limit_req zone=login burst=3 nodelay; ... }
7. TLS:用 certbot(参见本站部署实录),options-ssl-nginx.conf 的默认参数已经够好,别手搓加密套件。
多服务共存时的铁律
一台机器跑多个 server block 时:只新增,不修改。每个站点独立 sites-available/<域名> 文件 + 软链,改前 nginx -t,改后 reload。共享的全局参数(http 块)尽量不动——你永远不知道哪个服务依赖着某个"看起来没用"的配置。
上线前 30 秒自检
nginx -t # 语法
curl -sI https://domain | head -5 # 响应头:缓存、压缩、版本号
curl -s -o /dev/null -w "%{time_total}\n" https://domain # 延迟基线
nginx 的配置项有几百个,但 90% 的线上问题落在这份清单的范围里。先守住这些,再谈调优。