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

时间:2019-07-17 13:43:35

标签: nginx subdomain server-name

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

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的调试模式下显示路由匹配逻辑,但是我不确定如何实现。

感谢您的帮助。

1 个答案:

答案 0 :(得分: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服务器的主机名,与{{1} }哪个主机没有更改。

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

为纠正此行为,我们必须在Apache中添加以下配置:sub.domain.org

一旦重新启动Apache,它将保留主机,并且我们的server_name ProxyPreserveHost on在NGINX中已正确匹配。