網路伺服器隨機服務不同的虛擬主機
我們已經在 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 和套接字似乎並不能使事情保持足夠的獨立性。