跳到内容

🟩 nginx.conf 生成器

输入主机名、根目录和 SSL 证书路径,勾选所需功能。实时生成生产级 server 块:HTTPS 重定向、HTTP/2、现代 TLS、HSTS、gzip / brotli、静态缓存、PHP-FPM、反向代理、WebSocket、try_files。

完全免费 无需注册 浏览器内完成 5 种语言 深色模式

🔒 关于隐私

🎛 预设

🧩 选择功能

📄 生成的 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,这是最简单的。若做不到,就把这组响应头拆到单独文件,在每个需要的 locationinclude 一次——虽然重复,但比消失强太多了另外,请给 add_header 加上 always——不加的话,4xx 与 5xx 响应上不会带这些头而错误页恰恰常常是你最想保护的场景)。同样的提醒也适用于 proxy_set_header
反向代理下坏掉的是头部与大小 只写一句 proxy_pass应用并不知道自己是以哪个主机名、哪种协议被访问的不传 HostX-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 若不显式设置 UpgradeConnection,是连不上的。 做代理的 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. 1
    选择预设
    选择静态 / WordPress / Laravel / Next.js,推荐功能将自动勾选。
  2. 2
    输入主机名和 SSL 路径
    输入 server_name、根目录及 Lets Encrypt fullchain.pem / privkey.pem 路径。
  3. 3
    复制或下载
    使用右上方按钮复制或下载为 .conf 文件。
  4. 4
    放入 nginx 并重载
    放入 /etc/nginx/sites-available/,在 sites-enabled 创建符号链接,运行 nginx -t 测试后 systemctl reload nginx。

❓ 常见问题

没有 SSL 证书怎么办?
可用 Lets Encrypt certbot 免费签发。HTTPS 完全可用后再启用 HSTS。
nginx -t 报告错误
多为 SSL 路径或 PHP-FPM socket 路径错误。检查错误行号并运行 journalctl -u nginx。
nginx 可用 Apache .htaccess 吗?
不可。nginx 不读取 .htaccess。Apache 主机请使用 .htaccess 生成器。
🐛 此工具出现问题了吗?

免费、无需注册。仅提供复现步骤也有帮助。报告将直接发送给运营者并用于改进。

※ 为复现问题,浏览器信息 (UA / 屏幕 / 语言 / URL) 将自动发送