![为什么使用多个域名时 Nginx 不代理子域名?](https://linux22.com/image/791969/%E4%B8%BA%E4%BB%80%E4%B9%88%E4%BD%BF%E7%94%A8%E5%A4%9A%E4%B8%AA%E5%9F%9F%E5%90%8D%E6%97%B6%20Nginx%20%E4%B8%8D%E4%BB%A3%E7%90%86%E5%AD%90%E5%9F%9F%E5%90%8D%EF%BC%9F.png)
我看到存在多个问题,但似乎都不起作用。
当 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它没有回应
你为什么不开始调查这件事呢?我们没法帮你做这件事。