如何使用子域服务器名配置代理

How to configure a proxy with a subdomain servername

我在 nginx 中有以下 vhost 配置:

upstream mybackendsrv {
    server backend:5432;
}

server {
    listen 80;
    server_name sub.domain.org;

    location / {
        proxy_pass http://mybackendsrv;
    }
}

当我使用像 sub.domain.org 这样的 server_name 时,我得到了默认的 nginx 回退并且我的服务器不匹配。

当我使用像 customroute 这样的 server_name 时,我得到了正确的行为并且我的服务器匹配。

我用谷歌搜索了一下这个问题,我相信 nginx 支持子域匹配,所以我不确定哪里出了问题。我检查了 access.log 和 error.log,但没有得到相关日志。

知道如何诊断吗?

我应该可以在 nginx 的调试模式下显示路由匹配逻辑,但我不知道如何实现。

感谢任何帮助。

经过调查,问题似乎与我们的 URL 是一个子域这一事实无关。

为了调试这种情况,在 /etc/nginx/nginx.conf 中的 log_format 指令中引入了一个 $host 变量:

log_format  main  '$remote_addr - $host - $remote_user [$time_local] "$request" '
                  '$status $body_bytes_sent "$http_referer" '
                  '"$http_user_agent" "$http_x_forwarded_for"';

这个$host变量可以理解sub.domain.org有问题:当我们访问sub.domain.org时,主机被更改为NGINX服务器的主机名,与[=相反16=] 哪个主机没有改变。

看来 sub.domain.org 不是简单的 DNS 配置,而是 Apache 代理传递配置。 Apache 在传递请求时更改了主机名,导致 NGINX 与重写的主机不匹配,因为它在请求主机中接收到它自己的主机而不是目标主机。

要纠正此行为,我们必须在 Apache 中添加以下配置:ProxyPreserveHost on

一旦我们重新启动 Apache,它的主机就会被保留,我们的 server_name sub.domain.org 在 NGINX 中正确匹配。