Nginxredirect到错误的虚拟主机

我有一个nginx conf文件中的1300vhosts。 全部使用以下布局(它们在vhost文件中相互列出)。

现在我的问题是,有时我的浏览器将site2redirect到site1。 出于某种原因,而域名不会事件匹配。

看起来nginx总是redirect到vhosts文件中的第一个站点。

有人知道这个问题可以是什么?

server { listen 80; server_name site1.com; rewrite ^(.*) http://www.site1.com$1 permanent; } server { listen 80; root /srv/www/site/public_html/src/public/; error_log /srv/www/site/logs/error.log; index index.php; server_name www.site1.com; location / { if (!-e $request_filename) { rewrite ^.*$ /index.php last; } } location ~ .(php|phtml)$ { try_files $uri $uri/ /index.php; fastcgi_param SCRIPT_FILENAME /srv/www/site/public_html/src/public$fastcgi_script_name; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi_params; } } server { listen 80; server_name site2.com; rewrite ^(.*) http://www.site2.com$1 permanent; } server { listen 80; root /srv/www/site/public_html/src/public/; error_log /srv/www/site/logs/error.log; index index.php; server_name www.site2.com; location / { if (!-e $request_filename) { rewrite ^.*$ /index.php last; } } location ~ .(php|phtml)$ { try_files $uri $uri/ /index.php; fastcgi_param SCRIPT_FILENAME /srv/www/site/public_html/src/public$fastcgi_script_name; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi_params; } } 

编辑也许还有一件事要提的是,我用nginx -s重新加载每2分钟重新加载所有这些虚拟主机。

在第一次testing中,它看起来像重新定向只发生在重新加载时…去做一些更多的testing,但这可能会有所帮助。

参考(nginx如何处理请求): http : //nginx.org/en/docs/http/request_processing.html

在这个配置中,nginx只测试请求的头部字段“主机”,以确定请求应该被路由到哪个服务器。 如果它的值不匹配任何服务器名称,或者请求根本不包含这个头域,那么nginx会将请求路由到这个端口的默认服务器。

默认服务器是第一个 – 这是nginx的标准默认行为

你能检查那些不好的请求的主机头?

您也可以创建一个显式的默认服务器来捕获所有这些错误的请求,并将请求信息(即$ http_host)记录到不同的错误日志文件中以供调查。

 server { listen 80 default_server; server_name _; error_log /path/to/the/default_server_error.log; return 444; } 

[ 更新 ]当你在做nginx -s reload并且你在那个nginx conf文件中有很多域时,以下是可能的:

重新加载就像这样

使用新配置启动新的工作进程,正常关闭旧的工作进程

所以老工人和新工人可以共存一段时间。 例如,当你添加一个新的服务器块(带有新的域名)到你的配置文件中,在重新加载的时候,新的工作者将有新的域名,而旧的域名不会。 当这个请求恰好是由老工作进程发送的时候,它将被当作未知的主机,并被默认的服务器处理。

你说每两分钟就完成一次 你能跑吗?

 ps aux |grep nginx 

并检查每个工人正在运行多久? 如果超过2分钟,重装可能无法按预期工作。