我有一个VPS,我一直在使用Web服务器设置进行实验。 我目前的设置是Apache监听端口80服务几个站点,并代理其他一些端口8080上运行的Nginx。
我正在运行最新更新的Ubuntu 10.04,但是自己编译了Nginx v0.7.67,并且支持uWSGI。
摘自我的Nginxconfiguration:
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托pipe静态文件,这就是为什么我不使用location index 。
为了完整起见,我提到了Apache的代理,但是由于我看到一个Nginx正在服务的站点,我认为问题在于此。 我在这里错过了什么?
编辑:
结果我丢失的是我的Apacheconfiguration中的ProxyPreserveHost On命令,默认closures。
Nginx似乎无法确定哪个虚拟主机应该为您的传入请求提供服务。 就个人而言,我会查看由Apache转发到Nginx的请求,并检查主机头(因为Apache必须将原始主机头转发到Nginx)。
尝试两个之间的tcpdump,像这样的东西:
tcpdump -s 16436 -SvnXi lo tcp and port 8080
在Apache中,您还可以configuration自定义日志以logging主机标头值。 试试这个(没有testing,从这里的 Apache文档)
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Host}i\" " combined CustomLog log/header_log combined
Nginx对大多数东西的工作特异性,这意味着它将散列所有服务器块,并尝试find最合适的一个。 如果找不到匹配的服务器块,将使用第一个定义的服务器块。
其中,就像Julien在写完之前偷偷摸摸的一样,可能意味着Apache不能正确代理HOST头。
除此之外,你可以使你的configuration文件更清洁。
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 }