PHP -FPM не может получить доступ к файлам в домашнем каталоге - stat EACCES - "Файл не найден" - PullRequest
1 голос
/ 30 января 2020

Я недавно обновил 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 файлами, принадлежащими самому себе с соответствующими разрешениями?

1 Ответ

1 голос
/ 30 января 2020

Я выяснил причину сбоя, выполнив поиск в журнале изменений последних версий 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...