我最近将 PHP-FPM 更新到 7.4.2 版(在 Arch Linux 上(,并通过向所有客户端响应"找不到文件"来注意到它停止工作(之前一切都很好(。
该过程以及nginx在我的个人用户帐户(kevin
UID 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