Nginx

停止使用 PHP-FPM 對不同站點重用 PHP_VALUE

  • December 1, 2016

我注意到以下行為或 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的一樣。Offexample.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 腳本即可破壞使用同一工作程序的所有其他站點,而無需付出任何努力。

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