我在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的调试模式下显示路由匹配逻辑,但是我不确定如何实现。
感谢您的帮助。
答案 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中已正确匹配。