🟩 nginx.conf 生成器
输入主机名、根目录和 SSL 证书路径,勾选所需功能。实时生成生产级 server 块:HTTPS 重定向、HTTP/2、现代 TLS、HSTS、gzip / brotli、静态缓存、PHP-FPM、反向代理、WebSocket、try_files。
🔒 关于隐私
- ・所有生成均在浏览器中完成
- ・主机名、路径、设置不会发送到服务器
- ・无日志、无追踪、无数据库
🎛 预设
🧩 选择功能
📄 生成的 nginx.conf
📖 常见的坑
面向静态站点、反向代理、PHP-FPM 等架构,生成含 server 块的 nginx.conf,并可一并输出 SSL、gzip、缓存、安全响应头等指令。处理全部在浏览器内完成。但它能生成的是语法,而不是「在你的环境里能正确运行」的保证——证书路径是否存在、upstream 是否可达、文档根目录是否正确,它都无法验证。而在 nginx 上耗掉的时间,多半不是花在「写错了指令」上,而是花在「你以为写的意思,与 nginx 解释出来的意思不一样」上。
| 情形 | 会发生什么 | 怎么处理 |
|---|---|---|
location 不是按你书写的顺序求值的 |
nginx 并不是自上而下逐个尝试 location,而是按既定优先级选出一个。先是 = 的精确匹配,其次是最长前缀匹配(若带 ^~ 则当场定案),然后是按书写顺序的正则(~ / ~*),若都不匹配,则采用先前暂存的最长前缀匹配。也就是说,把块上下挪动往往什么也不会改变;反过来,只要添加一个正则块,就会悄悄抢走原本由前缀块处理的请求。典型症状是静态文件被交给了 PHP(或者反过来),通常发生在误解了 location ~ \.php$ 与 location /assets/ 之间关系的时候。 |
不要靠猜,请执行 nginx -T。它会打印把所有 include 展开之后的最终配置,因此「原来别的文件里也有一个同名 location」这类疏漏当场就能看见。就设计而言,先把静态文件定下来更稳妥——写成 location ^~ /assets/,正则的求值就在那里停住了。像首页、favicon.ico 这类唯一确定的 URL 请用 = 来写,既最快,意图也最明确。改动之后,请务必用 curl 请求具体 URL 加以确认——「读起来像是对的配置」与「nginx 实际选中了哪个块」,是两个不同的问题。 |
add_header 是被覆盖而不是被继承 |
nginx 的继承有一条反直觉的规则。只要子块写了哪怕一条同类指令,父级中同类的指令就全部作废——它是「替换」而不是「叠加」。危害最大的是 add_header:你在 server 块里写了五条安全响应头,只要在 location ~ \.php$ 里加一行缓存控制,PHP 响应中那五条安全响应头就全没了。既不报错也不警告——往往是被检测站点告知「缺少响应头」时才发觉。同样的规则也适用于 proxy_set_header——在 location 里加一条,上层设置的代理头就会全部消失。 |
请先用 curl -I 确认实际的响应头——配置里写了什么,和实际返回了什么,是两回事。补救办法有两种。把响应头集中在一处,子块里一律不写 add_header,这是最简单的。若做不到,就把这组响应头拆到单独文件,在每个需要的 location 里 include 一次——虽然重复,但比消失强太多了。另外,请给 add_header 加上 always——不加的话,4xx 与 5xx 响应上不会带这些头(而错误页恰恰常常是你最想保护的场景)。同样的提醒也适用于 proxy_set_header。 |
| 反向代理下坏掉的是头部与大小 | 只写一句 proxy_pass,应用并不知道自己是以哪个主机名、哪种协议被访问的。不传 Host 与 X-Forwarded-Proto,应用就会生成 http://localhost:3000/... 之类的 URL,重定向陷入死循环,Cookie 的域也会错位。proxy_pass 末尾的斜杠同样改变含义——proxy_pass http://app; 原样转发路径,而 proxy_pass http://app/; 会先剥掉 location 前缀。就这一个字符,决定了是正常还是 404。大小与时间的默认值也要留意:client_max_body_size 默认是 1MB——超过它的上传会在到达应用之前就被 413 挡掉。WebSocket 若不显式设置 Upgrade 与 Connection,是连不上的。 |
做代理的 location 里,至少要写这四行:proxy_set_header Host $host;、X-Real-IP $remote_addr;、X-Forwarded-For $proxy_add_x_forwarded_for;、X-Forwarded-Proto $scheme;。然后在应用侧启用「信任代理」的设置,让它采信这些头——只做一边是不生效的。若要处理上传,请把 client_max_body_size 与应用侧的上限对齐;若存在耗时较久的请求,也要一并调高 proxy_read_timeout(默认 60 秒)——只改其中一个,仍会被较短的那个掐断。生效请用 nginx -t && nginx -s reload;出现 502 时请去看 error.log 而不是 access.log——原因几乎必定写在那里。 |
光是编辑文件,什么都不会改变。nginx 在启动时读入配置,之后就一直保持,因此保存文件之后,在你执行 reload 之前行为不会有任何变化——当你觉得「明明改了却没好」时,请先确认自己是否重载过。顺序永远是先 nginx -t 检查语法,再 reload——不检查就 restart,一旦配置有误,nginx 起不来,整站彻底宕掉(而 reload 在新配置非法时会继续用旧配置提供服务)。关于证书补一句:ssl_certificate 请指向 fullchain.pem 而不是 cert.pem——缺少中间证书时,浏览器里看起来一切正常,curl、移动应用和较旧的环境却会校验失败。由于这个故障「在你自己的环境里复现不出来」,在有人报告之前你根本无从察觉。最后,配置文件请务必纳入版本管理——直接在生产服务器上改出来的变更,会在下一次部署时悄无声息地消失。
📖 使用方法
-
1
选择预设选择静态 / WordPress / Laravel / Next.js,推荐功能将自动勾选。
-
2
输入主机名和 SSL 路径输入 server_name、根目录及 Lets Encrypt fullchain.pem / privkey.pem 路径。
-
3
复制或下载使用右上方按钮复制或下载为 .conf 文件。
-
4
放入 nginx 并重载放入 /etc/nginx/sites-available/,在 sites-enabled 创建符号链接,运行 nginx -t 测试后 systemctl reload nginx。
❓ 常见问题
没有 SSL 证书怎么办?
nginx -t 报告错误
nginx 可用 Apache .htaccess 吗?
🔗 相关工具
🐛 此工具出现问题了吗?
免费、无需注册。仅提供复现步骤也有帮助。报告将直接发送给运营者并用于改进。
感谢您的反馈!
已送达运营者,将用于改进工具。