我在 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
这实际上是一个软件问题,而不是nginx
或php-fpm
,如果您在两个进程中运行相同的软件,那么发生冲突并非不可能。快速查看文档表明,虽然单个应用程序有冲突检测,但不同用户空间中的两个独立进程不会这样做。最简单的解决方法是session.save_path
针对每个池进行不同的配置。