Я недавно обновил PHP -FPM до версии 7.4.2 (на Arch Linux) и заметил, что он перестал работать (раньше все было хорошо), ответив «Файл не найден» всем клиентам.
Процесс, а также nginx, выполняются под моей личной учетной записью (kevin
UID 1000). Nginx обслуживает данные c из моего домашнего каталога /home/kevin/.web
просто отлично, но PHP -FPM не может выполнить в нем PHP сценариев.
I strace
d the 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
htop:
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
файлами, принадлежащими самому себе с соответствующими разрешениями?