2013-04-03 86 views
13

我在一個nginx conf文件中有大約1300vhosts。全部使用以下佈局(它們在vhost文件中相互列出)。Nginx重定向到錯誤的虛擬主機

現在我的問題是,有時我的瀏覽器將site2重定向到site1。出於某種原因,雖然域名不匹配事件。

看起來nginx總是重定向到虛擬主機文件中的第一個站點。

有人知道這個問題可以是什麼?

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; 
    } 
} 

編輯 也許還有一點要提的是,我重裝這一切虛擬主機每2分鐘的nginx -s重裝。

在它看起來像只重定向重裝時發生的第一次測試...將做一些更多的測試,但是這可能會有所幫助..

回答

15

參考(如何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; 
} 

[UPDATE]當你在做nginx -s reload,你必須在nginx的的c​​onf文件,所以很多領域,以下是可能的:

一重裝是這樣的

出發具有新配置的新工作進程,優雅關閉老工作進程

所以老工人和新工人可以共存一段時間。例如,當您向配置文件添加一個新的服務器塊(使用新的域名)時,在重新加載期間,新工作人員將擁有新域,而舊域將不會。當請求恰巧由舊工作進程發送時,它將被視爲未知主機並由默認服務器提供服務。

你說它每2分鐘完成一次。你能跑

ps aux |grep nginx 

並檢查每個工人運行多久?如果超過2分鐘,重新加載可能無法按預期工作。

+1

這看起來是問題,但如何更改主機頭?這不是我們明確在我們網站上做的事情。 – 2013-04-04 06:16:44

+0

我將您的代碼添加到nginx虛擬主機文件的頂部。但仍然重定向到相同的虛擬主機(這是目前文件中的第二個)。 – 2013-04-04 06:53:02

+0

更新了我的答案。讓我知道它是否有幫助 – 2013-04-04 13:03:06