为什么使用多个域名时 Nginx 不代理子域名?

为什么使用多个域名时 Nginx 不代理子域名?

我看到存在多个问题,但似乎都不起作用。

Nginx 多个域名和子域名的反向代理

当 nginx 中列出多个子域名时,$server_name 与域名不匹配

我有以下功能性的 nginx.conf...

  server {
      listen 80;
      listen 443 ssl;
      ssl_certificate /usr/src/b.pem;
      ssl_certificate_key /usr/src/b.key;
      server_name b.net www.b.net;
      if ($host = www.b.net) {
         rewrite ^/(.*)$ https://b.net/$1 permanent;
      }
      # include /usr/src/allow-cloudflare-only.conf;
      location / {
              proxy_pass  http://${HOST_IP}:8123/;
              proxy_set_header Upgrade $http_upgrade;
              proxy_set_header Connection "upgrade";
              proxy_set_header HOST $host;
              proxy_set_header X-Real-IP $remote_addr;
              proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      }
  }
  server {
    listen 80;
    listen 443 ssl;
    ssl_certificate /usr/src/site.crt;
    ssl_certificate_key /usr/src/site.key;
    server_name a.com www.a.com;
    if ($host = www.a.com) {
        rewrite ^/(.*)$ https://a.com/$1 permanent;
    }
    location /services/ {
        proxy_pass  http://be:8080/;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header HOST $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
    location / {
        proxy_pass  http://ui:3000/;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
  }

这很好用,我可以使用各自的域名访问这两个网站(a.com 和 b.net)。现在我想访问http://4.4.4.3/admin使用 pihole.b.net 所以我添加以下内容...

server {
      listen 80;
      server_name pihole.b.net;
      listen 443 ssl;
      ssl_certificate /usr/src/b.pem;
      ssl_certificate_key /usr/src/b.key;
      location / {
              proxy_pass  http://4.4.4.3/admin;
              proxy_set_header Upgrade $http_upgrade;
              proxy_set_header Connection "upgrade";
              proxy_set_header HOST $host;
              proxy_set_header X-Real-IP $remote_addr;
              proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      }
  }

我有一个指向 NGINX 的 IP 地址的 A DNS 记录

但是当我访问https://pihole.b.net它没有响应。如何使用 NGINX 转发带有其他转发域的子域?

问题

  • 为什么要为 HTTP 站点定义 SSL 证书?

我的理解是,我可以使用同一台服务器配置两者。当然,http 不需要证书,只有 https 才需要。我在多个示例中都看到过这种方法,我承认这是复制粘贴,但它似乎也有效,所以我不确定那里的问题。

  • 为什么使用无前缀的主机名作为网站的规范名称?

不确定这个,除了最后一个(pihole)之外,网站应该没有前缀,换句话说,应该有 3 个 url 指向 3 个不同的代理(a.com、b.net、pihole.b.net)

  • 为什么要使用‘if’来重定向?

这应该是重定向网址:p.net到 p.net

  • 你为什么不开始调查此事?

我按照我尝试提到的做了,但可能没有说清楚的是,当我在 conf 中没有第三个服务器时,URL pihole.b.net 可以工作。但是一旦我将其添加到其他位置的代理,它就会停止工作。这就是为什么我非常确信它不是 DNS 记录。另外要明确的是,如果我访问它应该直接代理的 ip,一切都会按预期工作。

我对 NGINX 还很陌生,所以如果有更有效的方法来构建配置,我完全赞成。

答案1

这应该是一个评论——但它有点长。

这个配置很乱。

为什么要为 HTTP 站点定义 SSL 证书?为什么要使用无前缀的主机名作为站点的规范名称?为什么要使用“if”进行重定向?也许没有 pihole 的配置可以工作,但这非常脆弱。至少将其拆分为 HTTP 和 HTTPS 的单独服务器块,并删除那些不使用 SSL 的站点的“if”语句和 SSL 定义。

但是当我访问https://pihole.b.net它没有回应

你为什么不开始调查这件事呢?我们没法帮你做这件事。

相关内容