PHP-FPM 无法访问主目录中的文件 — stat EACCES — "找不到文件"



我最近将 PHP-FPM 更新到 7.4.2 版(在 Arch Linux 上(,并通过向所有客户端响应"找不到文件"来注意到它停止工作(之前一切都很好(。

该过程以及nginx在我的个人用户帐户(kevinUID 1000(下运行。Nginx从我的主目录中提供静态内容/home/kevin/.web很好,但是PHP-FPM无法在其中执行PHP脚本。

strace了PHP-FPM工作进程,这是有趣的部分:

lstat("/home/kevin/.web/test.php", 0x7ffe0d4bf1f0) = -1 EACCES (Permission denied)
stat("/home/kevin/.web", 0x7ffe0d4c1640) = -1 EACCES (Permission denied)
stat("/home/kevin", 0x7ffe0d4c1640)     = -1 EACCES (Permission denied)
stat("/home", {st_mode=S_IFDIR|000, st_size=40, ...}) = 0
stat("", 0x7ffe0d4c1640)                = -1 ENOENT (No such file or directory)

那里的文件权限(使用ls -l获得(:

drwxr-xr-x 1 root  root  /home
drwxrwx--- 1 kevin kevin /home/kevin
drwxr-xr-x 1 kevin kevin /home/kevin/.web
-rw-r--r-- 1 kevin kevin /home/kevin/.web/test.php

我 100% 肯定 PHP-FPM 工作进程在我的用户帐户下运行,其status文件显示在procfs下:

$ grep "[UG]id" /proc/{830,831}/status
/proc/830/status:Uid:   1000    1000    1000    1000
/proc/830/status:Gid:   1000    1000    1000    1000
/proc/831/status:Uid:   1000    1000    1000    1000
/proc/831/status:Gid:   1000    1000    1000    1000

顶:

PID    TGID USER       NI   RES MEM% S CPU% START   TIME+  Command
791     791 root        0 21752  0.1 S  0.0 17:49  0:00.26 ├─ php-fpm: master process (/etc/php/php-fpm.conf)
831     831 kevin       0 11336  0.1 S  0.0 17:49  0:00.00 │  ├─ php-fpm: pool www
830     830 kevin       0 11336  0.1 S  0.0 17:49  0:00.00 │  └─ php-fpm: pool www
813     813 root        0  1348  0.0 S  0.0 17:49  0:00.00 ├─ nginx: master process
814     814 kevin       0  6672  0.0 S  0.0 17:49  0:00.01 │  └─ nginx: worker process  

请注意,nginx可以完美地访问同一目录中具有相同权限的文件!

kevin下运行的进程如何失败(EACCES(以适当的权限stat自己拥有的文件?

我通过搜索最近 PHP 版本的更改日志发现了它失败的原因。

在版本 7.4.0 中,systemd 服务单元已更新为包含ProtectHome=true;我仍然很好奇这是如何工作的。将其设置为 false 解决了问题。

来源:
https://github.com/php/php-src/commit/40c4d7f1820df1872a71ab07fd26da45a203e37f#commitcomment-36536173
https://bbs.archlinux.org/viewtopic.php?id=251050

最新更新