【问题标题】:How to configure a proxy with a subdomain servername如何使用子域服务器名配置代理
【发布时间】:2019-07-17 13:43:35
【问题描述】:

我在 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 这样的服务器名称时,我会得到正确的行为并且我的服务器是匹配的。

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

知道如何诊断吗?

我应该能够在 nginx 的调试模式下显示路由匹配逻辑,但我不确定如何完成。

感谢任何帮助。

【问题讨论】:

    标签: nginx subdomain server-name


    【解决方案1】:

    经过调查,问题似乎与我们的 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服务器的主机名,相反customroute哪个主机没有被更改。

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

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

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

    【讨论】:

      猜你喜欢
      • 2014-05-14
      • 2013-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多