我有一个 VPS,一直用来试验 Web 服务器设置。我当前的设置是 Apache 监听端口 80 来为几个站点提供服务,并将其他几个站点代理到端口 8080 上运行的 Nginx。
我正在运行带有最新更新的 Ubuntu 10.04,但是自己编译了支持 uWSGI 的 Nginx v0.7.67。
摘自我的 Nginx 配置:
server {
listen 127.0.0.1:8080;
server_name sub1.primary.com;
access_log /srv/www/sub1.primary.com/logs/access.log;
error_log /srv/www/sub1.primary.com/logs/error.log;
location /site_media/static/ {
alias /srv/www/sub1.primary.com/site_media/static/;
}
location / {
include uwsgi_params;
uwsgi_pass 127.0.0.1:9001;
}
}
server {
listen 127.0.0.1:8080;
server_name .secondary.com;
access_log /srv/www/secondary.com/site_media/logs/access.log;
error_log /srv/www/secondary.com/site_media/logs/error.log;
location / {
alias /srv/www/secondary.com/site_media/static/;
}
}
当我只有第一个server
指令时,一切都按预期工作。当我添加第二个指令时,第一个指令继续按原样工作,但 secondary.com 的域名会调出我在 sub1.primary.com 上运行的网站。如果我禁用第一个指令,我就可以访问 secondary.com 上的内容。
我只在 secondary.com 上托管静态文件,这就是我不使用的index
原因location
。
为了完整起见,我提到了从 Apache 进行代理,但由于我看到的是 Nginx 正在提供服务的站点,所以我假设问题就在那里。我在这里遗漏了什么?
编辑:
事实证明我所缺少的是ProxyPreserveHost On
我的 Apache 配置中的命令,默认情况下它是关闭的。
答案1
Nginx 似乎无法确定哪个虚拟主机应该为您的传入请求提供服务。就我个人而言,我会查看 apache 转发到 nginx 的请求并检查 Host 标头(因为 apache 必须将原始主机标头转发到 nginx)。
在两者之间尝试 tcpdump,如下所示:
tcpdump -s 16436 -SvnXi lo tcp and port 8080
在 Apache 中,您还可以配置自定义日志来记录 Host 标头值。试试这个(未经测试,来自 apache 文档这里)
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Host}i\" " combined
CustomLog log/header_log combined
答案2
Nginx 在大多数情况下都是通过特异性来工作的,这意味着它将散列所有服务器块并尝试找到最合适的服务器块。如果找不到匹配的服务器块,它将使用定义的第一个服务器块。
在我写完这篇文章之前,Julien 就偷偷溜进来了,这可能意味着 Apache 没有正确代理 HOST 标头。
另外,您可以使您的配置文件更简洁一些。
server {
listen 127.0.0.1:8080;
server_name sub1.primary.com;
access_log /srv/www/sub1.primary.com/logs/access.log;
error_log /srv/www/sub1.primary.com/logs/error.log;
root /srv/www/sub1.primary.com;
try_files $uri $uri/ @backend;
location @backend {
include uwsgi_params;
uwsgi_pass 127.0.0.1:9001;
}
}
server {
listen 127.0.0.1:8080;
server_name .secondary.com;
access_log /srv/www/secondary.com/site_media/logs/access.log;
error_log /srv/www/secondary.com/site_media/logs/error.log;
root /srv/www/secondary.com/site_media/static
}