Nginx 配置生成器

生成 Nginx 配置

从零手写 Nginx 配置,意味着要记住每一行 proxy_set_header、gzip 需要压缩的每一种 MIME 类型,还要分清 try_files $uri/ /index.php?$args 和那些会悄悄破坏路由的写法之间的差别。这个生成器只需要你填写域名、上游地址、PHP 处理方式和 SSL 证书路径,就能输出一个 server block,并为 TLS、HTTP/2、静态资源缓存和压缩配好合理的默认值。

如何生成你的 server block

  1. 1

    选择预设

    静态站点、PHP-FPM(Laravel、WordPress)、Node.js 反向代理,或一个纯粹的 301 跳转。

  2. 2

    填写域名

    写全 server_name 列表,通常包括带 www 和不带 www 两种形式。

  3. 3

    设置 SSL 信息

    指向你的 fullchain 与 privkey 文件;若只用 HTTP,可跳过此步。

  4. 4

    调整上游地址

    使用 proxy_pass 时填写端口、socket 路径或后端 URL。

  5. 5

    复制并部署

    把输出放进 /etc/nginx/sites-available,执行 nginx -t,然后重新加载 Nginx。

一个好的 server block 长什么样

现代的 Nginx 虚拟主机通常包含这些部分:

组成部分 作用
listen 443 ssl http2 接受 HTTPS 连接并启用 HTTP/2
ssl_certificate + ssl_certificate_key 指向 TLS 证书和私钥文件
ssl_protocols TLSv1.2 TLSv1.3 淘汰老旧的 TLS 版本
gzip on + 类型列表 在响应时实时压缩文本/HTML/JSON/JS/CSS
静态资源的 expires 响应头 减少回访用户的重复请求
try_files 转交给前端控制器(PHP、Laravel 等)
HSTS + 安全响应头 强制浏览器始终走 TLS

反向代理要点

对于运行在 Nginx 之后的 Node.js、Python、Ruby 应用:

location / {
    proxy_pass http://127.0.0.1:3000;
    proxy_http_version 1.1;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
}

漏掉 X-Forwarded-For,是应用日志里丢失真实客户端 IP 最典型的原因。

常见错误

  • 缺少 server_name 兜底块。 当没有任何域名匹配时,Nginx 会把第一个 server block 当作默认值。请加上一个返回 444 的通配 server_name _ 块,以防范 Host 头攻击。
  • 证书顺序错误。 ssl_certificate 文件必须是完整链(fullchain:站点证书 + 中间证书),而不是只有站点证书。
  • 缓存过于激进。/index.html 设置 expires 1y 会让后续发布失效。正确做法是给静态资源 URL 加上版本号。
  • 不测试就重载。 执行 systemctl reload nginx 之前请务必先跑 nginx -t;一处语法错误就足以让整个站点下线。

常见问题

HTTP/2 已经稳定,在 Nginx 1.25+ 中获得普遍支持。HTTP/3(QUIC)在 Nginx 1.25+ 中也可以使用,但仍属实验性功能。如果现在要上生产环境,请启用 HTTP/2,并可按需通过 http3quic 指令叠加 HTTP/3。

惯例是把公开证书链放在 /etc/ssl/certs/,私钥放在 /etc/ssl/private/。Let’s Encrypt 则把所有文件放在 /etc/letsencrypt/live/domain/ 下。按照你所用续期工具的约定来即可。

大多数站点都需要。单独加一个监听 80 端口的 server block,返回 301 https://$host$request_uri。再配合 HSTS,首次请求之后这个 HTTP 块几乎不会再被访问到。

运行 sudo nginx -t,它只解析配置而不重载。如果输出 “syntax is ok” 和 “test is successful”,再用 sudo systemctl reload nginx 重载。生产环境中千万不要用 restart,reload 不会中断服务。

相关工具

此工具还提供其他语言版本