0

我在 nginx 中有以下虚拟主机配置:

upstream mybackendsrv {
    server backend:5432;
}

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

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

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

当我使用类似的 server_name 时customroute,我会得到正确的行为并且我的服务器是匹配的。

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

知道如何诊断吗?

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

任何帮助表示赞赏。

4

1 回答 1

0

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

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

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 服务器的主机名,customroute而主机没有被更改。

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

为了纠正这种行为,我们必须在 Apache 中添加以下配置:ProxyPreserveHost on.

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

于 2019-07-19T06:42:12.560 回答