Nginx 虚拟主机未按预期工作

Nginx 虚拟主机未按预期工作

我有一个 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
}

相关内容