Nginx 配置
反向代理、静态站点与 HTTPS 三套表单生成可粘贴回的 server 块。
这个工具按三种模式生成可直接贴进 http{} 的配置片段:反向代理(含 upstream 池)、静态站点(含 expires/try_files/SPA 回退)、HTTPS 跳转与终结(80 端口 301/308 跳转 + 一台 TLS 服务器,SSL 端口默认 443、可改)。表单字段都是实名的,而且只出现在它真正生效的那一行。
它不做的事同样明确:不执行 `nginx -t`,不连服务器,也不校验你的指令拼写是否在当前编译参数下可用(比如 brotli 需要第三方 ngx_brotli 模块,官方发行版没有)。TLS 段取自 Mozilla ssl-config-generator Guideline 5.7 的 intermediate 与 recommended 两档现值(协议、密码套件、会话缓存、HSTS max-age),生成器页面标注了它们的目标 nginx/OpenSSL 版本,上线前请回原站重新生成核对。gzip 段是固定写进输出的(`gzip on` 加 comp_level/min_length/vary/proxied/types 五行),本页没有给它开关。
Nginx 配置怎么用
- 先选模式再填占位符:三种模式各自只露出自己用得上的行:静态模式是公共三样(域名、监听端口、client_max_body_size)加站点根目录、SPA 回退与缓存天数,location 前缀/匹配方式/转发路径这三个控件在静态模式下不出现;代理模式填上游列表与负载方式,超时和 proxy_buffering 要点开「高级:超时与缓冲」才看得到;HTTPS 模式在 TLS 行填 SSL 端口、证书目录、TLS 档位与 HSTS/OCSP 开关。折叠收起或切走模式再切回来,填过的值都不丢(控件只是看不见,没有被卸载)。所有小输入框都会把域名、目录、上游列表渲染进输出文本,拿到的是具体配置而不是占位符。
- 对比 proxy_pass 两种写法:「转发路径」下拉切换带斜杠(剥掉 location 前缀)与不带斜杠(原样转发完整路径)两种渲染,输出里的注释直接写明 /api/user 各会被转发成什么;选中正则匹配时工具会警告并退化 proxy_pass,这正是 nginx -t 的报错点。
- 上线三步:把片段放进 http 层对应 server 文件 → 本机 nginx -t 验证(工具不替你校验)→ reload。HTTPS 模式请确认证书路径存在、80 端口的 /.well-known/acme-challenge/ 没被跳转吃掉,再开 HSTS:它一旦下发就按 max-age 缓存在浏览器里,撤销不了。
- 每种模式露出哪些行:公共行三样——域名、监听端口、client_max_body_size;代理行有 location 前缀与匹配方式(前缀、`= 精确、^~ 优先、~ 与 ~* 正则)、转发路径(剥前缀/原样)、负载方式(轮询/ip_hash/least_conn)与 keepalive 池、WebSocket 升级、上游列表(一行一个);TLS 行有 SSL 端口、证书目录、TLS 档位、重定向与 HSTS/OCSP、新老 http2 写法;静态行是站点根目录、SPA 回退与缓存天数。连接/读/发超时与 proxy_buffering 收在代理行下面的「高级:超时与缓冲」折叠里,默认收起但值一直保留。
- 输出与「上线前检查」折叠:输出 pane 全宽、最高 620px 内滚,它下面默认折着一条「上线前检查」折叠,展开就是那份自检清单,讲的都是最容易翻车的顺序与层级问题:location 匹配优先级(= 先停 → ^~ 最长前缀跳过正则 → 正则按配置先后 → 回落最长前缀)、proxy_pass 结尾带不带斜杠对转发路径的两种渲染结果对照(正则 location 里带 URI 更是直接报错)、root 与 alias 的拼路径区别、try_files $uri $uri/ =404 为什么必要、client_max_body_size 加在错误层级导致 413、以及 worker_connections 与文件描述符上限 nofile 的乘法关系。
常见问题
proxy_pass 结尾的斜杠到底改了什么?
规则出自官方 proxy 模块文档:proxy_pass 不带 URI 时,请求路径原样转发(location /api/ + http://backend → /api/user 仍转成 /api/user);一旦带了 URI(哪怕只有斜杠 http://backend/),命中的 location 前缀会被替换成该 URI(/api/user → /user)。同一段后端代码到底该配哪种,取决于后端自己认不认 /api 前缀。正则 location(~/~*)里禁止带 URI,写了 nginx -t 直接报 "URI is not supported"。
root 和 alias 有什么区别?
root 是把整个 URI 拼到指令值后面:location /i/ + root /data/w3,请求 /i/top.gif 读 /data/w3/i/top.gif;alias 是把 location 前缀替换成给定路径:同样请求读 /data/w3/images/top.gif(alias /data/w3/images/)。需要改写路径用 alias,location 恰好是路径末段时(如 ^~ /assets/)用 root 更稳,alias 少写收尾斜杠会拼出粘连路径。
location 的匹配优先级是怎么排的?
按 nginx 文档的顺序:先查所有前缀 location 并记住最长匹配;`=` 精确命中立即结束;若最长前缀带 `^~` 则跳过正则直接用它;否则按配置文件里出现的先后逐条试正则,第一条命中即定;正则都不中就回落到此前记住的最长前缀。所以「正则写在前面还是后面」是有语义的,而 ^~ 是用来「让某条前缀赢过所有正则」的开关。
为什么要用 map 写 WebSocket 升级?
WebSocket 升级块采用 `map $http_upgrade $connection_upgrade` 写法——Connection 头的值必须随请求变化(普通请求要 close/复用、升级请求要 upgrade),而只有 map 能在 http 层按 $http_upgrade 条件赋值,这就是「为什么要 map」。
http2 与 OCSP 那几行是按哪个版本写的?
http2 自 nginx 1.25.1 起改为独立指令 `http2 on;`(listen 的 http2 参数成了废弃写法,工具给了切换开关兼容老版本);OCSP stapling 附了证书链与 resolver 的注意点。
对应功能编号 #118无需安装,手机端同样可用按 Ctrl + K 换工具