停止使用 PHP-FPM 對不同站點重用 PHP_VALUE
我注意到以下行為或 PHP-FPM:
看看這兩個 Nginx 配置:
server { listen 80; server_name example.com; location / { fastcgi_pass 127.0.0.1:9000; fastcgi_param SCRIPT_FILENAME /srv/www/i.php; fastcgi_param PHP_VALUE "display_errors=1"; include fastcgi_params; } } server { listen 80; server_name example.net; location / { fastcgi_pass 127.0.0.1:9000; fastcgi_param SCRIPT_FILENAME /srv/www/i.php; include fastcgi_params; } }
和
/srv/www/i.php
文件:<?php phpinfo();
如您所見,唯一的區別是
fastcgi_param PHP_VALUE "display_errors=1";
.現在如果你殺死所有的 FPM 工人,然後
example.net
先打開,你會看到和預期display_errors
的一樣。Off
你example.com
會看到display_errors
的是On
。但是如果你
example.net
再次訪問並且這個請求是由同一個工人進行的,你會display_errors
得到On
.所有 FPM 工作人員都在同一個池中工作。
**問題:**如何使
example.net
始終使用預設設置?可能的解決方案:
PHP_VALUE
也在配置中使用所需的設置進行定義example.net
。- 似乎是一個“正確”的解決方案 - 為每個站點創建單獨的工作人員池。
但是我們的伺服器上有很多網站,這兩種解決方案都意味著需要進行大量的日常工作。我想知道是否有更簡單的方法。
更新:
display_errors
選擇我的範例中的設置只是為了展示問題。任何設置都會發生相同的情況php.ini
。根據評論,在單個伺服器上混合生產和開發站點是一個壞主意。
發生這種情況的原因很可能是“使用 php_value 或 php_flag 傳遞的 PHP 設置將覆蓋其先前的值”,如PHP-FPM 文件所述。
我假設在您的 PHP 配置
display_errors
中被禁用。然後您訪問 .net 頁面,在該頁面中您phpinfo()
確認它已被禁用。然後您訪問 .com 頁面,Nginx 將傳遞
display_errors=1
給您在同一個池中的 PHP-FPM 工作人員。0
這會用新值覆蓋之前的值1
。您可以使用 來確認phpinfo()
。現在 PHP-FPM 池設置設置為
display_errors=1
.當您再次訪問 .net 頁面時,
phpinfo()
確實確認了這一點,display_errors=1
因為當 Nginx 將 的值傳遞1
給現在處理您的另一個網站的同一個池時,它被覆蓋了。解決方案是將開發轉移到另一台伺服器,如評論中所建議的那樣。或者為您的站點創建一個專用的 PHP-FPM 池,這是您至少應該做的。
獎金:
請不要在你的 Nginx 配置中這樣做:
fastcgi_param PHP_VALUE "display_errors=1";
這應該在 php 配置文件中,最好在站點自己的 fpm 池配置中。
但是我們的伺服器上有很多網站,這兩種解決方案都意味著需要進行大量的日常工作。我想知道是否有更簡單的方法。
您可以使用每個池前綴進行快速修復。在任何情況下,將多個站點放在一個工作程序池上是一個壞主意,因為我只需要讓您的一個站點執行我的惡意 php 腳本即可破壞使用同一工作程序的所有其他站點,而無需付出任何努力。