潛在的單獨 PHP-FPM 池會話 ID 衝突

潛在的單獨 PHP-FPM 池會話 ID 衝突

我在 Debian 8.10 上運行帶有 nginx 1.12.2 和 PHP 7.0.27 的伺服器,我運行兩個網站,每個網站運行的每個單獨的 PHP 應用程式都有單獨的 PHP-FPM 池。每個 PHP-FPM 池以及每個 PHP 應用程式都在自己的用戶下運行,nginx 作為 www-data 運行。

有時(我認為是高負載的時候),我會從 PHP 中收到大量關於讀取和寫入會話檔案權限問題的錯誤,例如:

2018/02/21 02:07:19 [error] 11723#11723: *804992 FastCGI sent in stderr: "PHP message: PHP Warning: Unknown: open(/var/lib/php/sessions/sess_<session id here>, O_RDWR) failed: Permission denied (13) in Unknown on line 0 PHP message: PHP Warning: Unknown: Failed to write session data (files). Please verify that the current setting of session.save_path is correct (/var/lib/php/sessions) in Unknown on line 0" while reading upstream, client: 34.242.193.225, server: example.org, request: "GET /somepage HTTP/1.1", upstream: "fastcgi://unix:/run/php/php7.0-fpm-site-app.sock:", host: "example.org"

據我所知,權限是正確的,因為我在資料夾中看到了兩個 PHP 使用者的會話。

如果我在錯誤訊息中給出的檔案名稱出現在日誌檔案中後不久運行 ls -alF ,該檔案將在那裡,但由其他網站的使用者擁有(其內容表明該檔案用於來自另一個網站),這表明在不同網域上運行的兩個應用程式都產生了相同的會話ID,其中一個成功寫入其文件,而另一個則失敗,因為該文件由其他網站使用者擁有。據我了解,兩個網站產生相同會話 ID 的可能性幾乎是不可能的。

雖然我認為我可以透過為每個池設置單獨的會話路徑來解決這些症狀,但我認為這並不能解決潛在的問題,這可能會導致我尚未註意到的伺服器上的其他問題。

答案1

這實際上是一個軟體問題,而不是nginxphp-fpm,如果您在兩個進程中運行相同的軟體,那麼引起衝突並非不可能。快速瀏覽文件表明,雖然單一應用程式有碰撞檢測,但不同用戶空間中的兩個單獨的進程不會執行此操作。最簡單的修復方法是session.save_path為每個池進行不同的配置。

相關內容