Nginx 配置生成
选静态站点或反向代理,填域名和端口,生成可直接粘贴的 server 块,HTTPS 跳转、HTTP/2、Gzip 和缓存一起带上。
需要注意
- http2 on; 需要 nginx 1.25.1 及以上;旧版本要改回 listen 443 ssl http2; 的写法。
- WebSocket 的 map 片段要单独贴进 http {},只把下面的 server 块贴进 conf.d 还不够。
怎么用
把生成的 server 块存成 /etc/nginx/conf.d/域名.conf,先执行 sudo nginx -t 检查语法,通过后再 sudo systemctl reload nginx。reload 是平滑重载,已经建立的连接不会断;直接 restart 会短暂拒掉新请求。
反向代理会补上 Host、X-Real-IP、X-Forwarded-For 和 X-Forwarded-Proto 四个头。后端要拿真实访客 IP、或者要判断请求是不是走的 HTTPS,靠的就是这几项;少了 X-Forwarded-Proto,很多框架会把请求当成 HTTP 而生成错误的跳转地址。
HTTPS 那几行是最小可用集:TLS 1.2/1.3、共享会话缓存、关闭会话票据。证书用 Let's Encrypt 时路径通常是 /etc/letsencrypt/live/域名/fullchain.pem 和 privkey.pem,续期后 reload 一次即可生效。
需要查请求头和状态码含义,用HTTP 响应头检查;想确认证书链和有效期,用SSL 证书检查。
常见问题
生成的是完整的 nginx.conf 吗?
不是。这里只生成一个 server 块,外围的 user、worker_processes、http {} 都不在里面。实际用法是新建 /etc/nginx/conf.d/你的域名.conf 把内容贴进去,那个目录已经被主配置的 include 收在 http {} 里了。
为什么 WebSocket 要额外贴一段 map?
反向代理转发 WebSocket 时需要把 Connection 头改成 upgrade,而判断「要不要改」的 $connection_upgrade 变量必须由 http 层的 map 定义。map 不能写在 server 里,所以它单独列在输出下面,要和 server 块一起用,否则 nginx -t 会报 unknown variable。
静态资源那段为什么没有 add_header Cache-Control?
因为 location 里只要出现一条 add_header,父级 server 上的 add_header 就会整组失效,包括 HSTS 和安全响应头,这是 nginx 的继承规则。expires 指令已经能同时写出 Expires 和 Cache-Control 的 max-age,不触发这个规则。
http2 on 和 listen 443 ssl http2 有什么区别?
http2 on; 是 nginx 1.25.1 引入的新写法,旧的 listen ... http2 写法在新版本里已经废弃。老版本不认 http2 指令,会把启动直接拦下来,遇到报错就改回旧写法。
上传文件报 413 怎么办?
请求体超过了 client_max_body_size。把它调到比最大上传文件稍大一点,比如 50m;改完 nginx -t 检查语法再 reload。只调前端限制不够,这一项是网关层先拦下来的。
HSTS 为什么默认不打开?
HSTS 一旦下发,浏览器在 max-age 期内会强制用 HTTPS 访问,用户没法点「继续访问 HTTP」,撤回也只能等过期。等全站和所有子域都确认能走 HTTPS 再打开,第一次可以先设一个很短的 max-age 试水。