Nginx

網路伺服器隨機服務不同的虛擬主機

  • October 23, 2017

我們已經在 Ubuntu Trusty 上執行了 nginx。它通過 https 為多個網站提供服務,在一個 IP 地址上執行。

隨機,雖然它似乎與工作負載略有相關,但有時單個請求會出現在錯誤的虛擬主機上。這導致請求lustrum.thalia.nu被服務,thalia.nu反之亦然。當使用者突然訪問不同的網站時,這會產生令人討厭的錯誤頁面。當您按下 時F5,使用者會再次到達原來的目標。

它似乎與瀏覽器或作業系統無關。已確認在 Firefox(Linux、Windows、Mac)、Edge(Windows)和 Chrome(Linux、Windows、Android)和 Safari(iOS)上發生。

當系統處於負載狀態時,該問題似乎更頻繁地發生,這表明存在某種競爭條件。

lustrum.thalia.nu

server {
       server_name lustrum.thalia.nu;

       listen 443 ssl;

       ssl on;
       ssl_certificate /etc/nginx/certs/lustrum.thalia.nu.crt;
       ssl_certificate_key /etc/nginx/certs/lustrum.thalia.nu.key;

       add_header Strict-Transport-Security "max-age=63072000; preload";

       root /var/www/thalia-lustrum/public_html;

       location / {
               index index.php;
               try_files $uri $uri/ /index.php?$args;
       }

       # Add trailing slash to */wp-admin requests.
       rewrite /wp-admin$ $scheme://$host$uri/ permanent;

       # Pass all .php files onto a php-fpm/php-fcgi server.
       location ~ [^/]\.php(/|$) {
               include         /etc/nginx/fastcgi_params;

               fastcgi_split_path_info ^(.+?\.php)(/.*)$;

               if (!-f $document_root$fastcgi_script_name) {
                       return 404;
               }

               fastcgi_pass    unix:/var/run/php5-fpm-thalia-lustrum.sock;
               fastcgi_index   index.php;
               fastcgi_param   SCRIPT_FILENAME  /public_html$fastcgi_script_name;
       }
}

thalia.nu

server {
       server_name thalia.nu;    
       listen 443 ssl;

       ssl on;
       ssl_certificate /etc/nginx/certs/www.thalia.nu.crt;
       ssl_certificate_key /etc/nginx/certs/www.thalia.nu.key;

       add_header Strict-Transport-Security "max-age=63072000; preload";

       root /var/www/thalia/public_html;

       location / {
               try_files $uri $uri/ /index.php/$request_uri;
               index index.php index.html index.htm;
       }

       location ~ \.php($|/) {
               include         /etc/nginx/fastcgi_params;
               set  $script     $uri;
               set  $path_info  "";
               if ($uri ~ "^(.+\.php)(/.+)") {
                               set  $script     $1;
                               set  $path_info  $2;
               }
               fastcgi_read_timeout    120;
               fastcgi_pass    unix:/var/run/php5-fpm-thalia-www.sock;
               fastcgi_index   index.php;
               fastcgi_param   SCRIPT_FILENAME  /public_html$fastcgi_script_name;
       }
}

如您所見,我們正在為這兩個域執行不同的 PHP5-FPM 池。這些池被 chroot 到不同的文件夾並以不同的使用者身份執行。據我所知,PHP-FPM 的配置是相當標準的。

我們已經嘗試過 nginx 1.4.6-ubuntu3 和 nginx 1.8.0-1+trusty。

日誌遙測

266.266.266.266 - - [25/Nov/2015:09:24:40 +0100] "GET /committees/175 HTTP/1.1" 302 5 "https://thalia.nu/committees" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:42.0) Gecko/20100101 Firefox/42.0" Host: "thalia.nu" Location: "https://thalia.nu/index.php//committees/wp-admin/setup-config.php"

在這一行中,您可以看到對頁面的請求/committees突然被重定向到wp-admin. 這似乎是由PHP-fpm 池/committees處理的請求……thalia-lustrum

DNS 區域文件

我們不知道這怎麼可能是相關的,但是……

;; MX Records
thalia.nu.    300    IN    MX    20    relay.transip.nl.
thalia.nu.    300    IN    MX    10    ivo.thalia.nu.

;; TXT Records
thalia.nu.    300    IN    TXT    "v=spf1 a mx a:mulgore.hexon-is.nl a:moonray.hexon-is.nl a:fred.thalia.nu a:ivo.thalia.nu ~all"

;; SPF Records (Sender Policy Framework)
thalia.nu.    300    IN    SPF    "v=spf1 a mx a:mulgore.hexon-is.nl a:moonray.hexon-is.nl a:fred.thalia.nu a:ivo.thalia.nu ~all"

;; CNAME Records
lustrum.thalia.nu.    300    IN    CNAME    thalia.nu.

;; A Records (IPv4 addresses)
thalia.nu.    300    IN    A    131.174.31.8
www.thalia.nu.    300    IN    A    131.174.31.8
ivo.thalia.nu.    300    IN    A    131.174.31.8

經過數小時的調試這個問題,我們終於能夠追踪它的原因。看來原因不是nginx,而是 PHP-fpm。我們正在執行php5-fpm版本5.5.9-1ubuntu4.14。似乎在派生新工人時,有時會出現問題,並且工人執行(部分?)不同工人的程式碼。

我們的解決方案是/etc/php5/fpm/php5-fpm.conf使用自己的pool.d文件夾複製到不同的副本,然後複製/etc/init.d/php5-fpm以使用新的配置文件啟動(也在 中創建文件/etc/init/)。這意味著我們現在php5-fpm每個池都有一個程序管理器。擁有單獨的 chroot 和套接字似乎並不能使事情保持足夠的獨立性。

引用自:https://serverfault.com/questions/737349