【问题标题】:(NGINX) NodeJS Reverse Proxy Subdomain(NGINX) NodeJS 反向代理子域
【发布时间】:2021-12-18 17:40:24
【问题描述】:

这个问题可能已经被问了很多,但我似乎无法找到一个真正有效的简单解决方案。我需要帮助来进行设置。

我将列出我当前的环境,以便您快速了解一下:

  • 服务器主机:HETZNER 云服务器
  • 域主机:Webhuset.no(DNS 记录在这里)
  • 操作系统:CentOS 7 (Hetzner)
  • 网站:使用 NodeJS 反向代理运行 NGINX
  • DNS:我没有在我的 DNS 记录中添加 *.domain.example,因为我不希望每个子主机都连接到我的服务器。
  • SSL:已启用,使用 Let's Encrypt Certbot。

我只运行一个站点,当然,不同的页面用于不同的内容(不是多个站点)

我的目标是拥有类似于 CPanel 子域的东西。我可以在其中添加 admin.domain.example 并将其设置为例如 domain.example/admin 而无需重定向。

但是我发现这比预期的要难,因为我现在已经阅读了很多论坛帖子和文档,但我无法让它发挥作用。

我已经足够了解必须在 Nginx 中配置子域。在此之前,我一直尝试在 nodejs 配置中执行此操作。

我当前的 nginx.conf 使我的域 example.domain 使用 SSL 直接进入我网站的根文件夹。这很好用。

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

http {
    server {
        server_name example.domain www.example.domain;
        include /etc/nginx/default.d/*.conf;

        location / {
            proxy_pass http://127.0.0.1:3000;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection 'upgrade';
            proxy_set_header Host $host;
            proxy_cache_bypass $http_upgrade;
        }

        listen [::]:443 ssl ipv6only=on;
        listen 443 ssl;
        ssl_certificate /etc/letsencrypt/live/example.domain/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/example.domain/privkey.pem;
        include /etc/letsencrypt/options-ssl-nginx.conf;
        ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
    }
}

这里我假设我必须添加一个服务器块才能使 admin.example.domain 路由到 example.domain/admin

我怎样才能做到这一点并仍然保持 SSL?我需要 SSL 才能渲染图像。 我试过像这样添加一个服务器块:

 server {
    server_name admin.example.domain

    location / {
        proxy_pass http://127.0.0.1:3000/admin;
    }

    listen [::]:443 ssl ipv6only=on;
    listen 443 ssl;
    ssl_certificate /etc/letsencrypt/live/example.domain/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.domain/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}

如果这可行(除非我监听端口 80 并使用 http://),它只会将我重定向到 (UNSECURE)https://admin.example.domain/admin

每个和我刚才做的一样的人,都能让它发挥作用。但我没有。有什么不同,我该如何解决?

【问题讨论】:

  • 您知道admin.example.domainexample.domain 需要不同的证书(除非您有通配符证书)...?
  • 该死的,这实际上解决了一切。我记得尝试过这个,它给了我一个我不理解的错误,但在再做一次之后,我就明白了。在运行 certbot 之前,我必须添加一个服务器块。现在它在 URL 中显示 admin.domain.example 并完美呈现 /admin 页面。唯一的缺点是由于标题错误而无法加载字体,但我只是直接从 Google Fonts 添加了字体,它解决了这个问题。谢谢!

标签: node.js nginx web nginx-reverse-proxy


【解决方案1】:

解决方案

  • 为我想要的每个子域创建一个服务器块并将目录放在 proxy_pass 中(保存并重新启动/重新加载 nginx 配置)
  • 运行 certbot --nginx
  • 从 certbot 列表中选择子域
  • 完成配置并使其按预期工作。

【讨论】:

  • 你能分享一个文档的参考链接吗?
  • 我在上面@slauth 的评论的帮助下自己解决了这个问题。我不理解这些文档,所以我几乎没有阅读它们,因为我无法在自己的代码中与之相关。