Как отследить, откуда на Ubuntu поступают настройки umask для php5-fpm
Я бы очень признателен за помощь в поиске и диагностике проблем с Umasnt в Ubuntu:
я бегу php5-fpm
с помощью Apache через proxy_fcgi
, Процесс выполняется с umask 0022 (подтверждается тем, что PHP отправляет результаты umask()
в файл [результат "18" == 0022]). Я хотел бы изменить это на 0002, но не могу отследить, откуда исходит маска.
Apache установлен с umask 0002, и в качестве теста, если я отключу proxy_fcgi
и запустив мой тест выше, я получаю файл с u + g, имеющий доступ rw (и содержимое файла подтверждает umask как '2' == 0002).
Если я sudo -iu fpmuser
и беги umask
результаты 0002.
Системная информация:
- PHP: 5.5.3-1ubuntu2.1
- Apache: 2.4.6
- Убунту: 13.10
- PHP-PFM выводит список с использованием портов TCP (поскольку порты Unix еще не работают / не поддерживают)
До сих пор я пробовал следующее (каждый сопровождается перезапуском системы и повторным тестированием):
- добавление
umask 0002
к началу/etc/init.d/php5-fpm
- добавление
--umask 0002
вstart-stop-daemon
звонит в/etc/init.d/php5-fpm
- добавление
umask 0002
в.profile
в домеfpm
пользователь
Что-то явно настраивает umask процесса php-fpm - так, как я могу начать отслеживать то, что заставляет umask 0022 влиять на процесс php-fpm?
РЕДАКТИРОВАТЬ (1):
- Настройка системы Umask через
/etc/login.defs
(см. Как установить umask для всей системы?) влияет на umask в другом месте (например, через командыsudo
теперь имеет umask 0002), но php-fpm создает файлы с umask 0022. Обратите внимание, что я проверил, чтоsession optional pam_umask.so
также присутствовал в/etc/pam.d/common-session-noninteractive
и я проверил umasks 002 и 0002.
РЕДАКТИРОВАТЬ (2):
- Я смог повторить проблему, используя
nginx
а такжеphp5-fpm
(с использованием сокетов unix, установленных в режим прослушивания '0666'). - Я хотел бы проследить, откуда исходит маска, но я бы согласился найти способ заставить его достичь того, чего я хочу.
- Я должен добавить, что первый тест был сделан на образе Amazon Ubuntu 13.10. Мои тесты в "edit 2" были завершены с использованием копии ISO-установки сервера Ubuntu13.10 с нуля на виртуальной машине. Все установки были завершены с помощью apt-get, а не путем загрузки исходного кода и сборки.
РЕДАКТИРОВАТЬ (3):
Я подтвердил, что могу манипулировать umask вручную одним из следующих способов (проверено проверкой разрешений созданного тестового файла):
а. В оболочке установите umask и запустите
/usr/sbin/php-fpm
из скорлупыб. В оболочке запустите следующее с любым значением umask, которое мне нравится:
start-stop-daemon --start --quiet --umask 0002 --pidfile /var/run/php5-fpm.pid --exec /usr/sbin/php5-fpm -- --daemonize --fpm-config /etc/php5/fpm/php-fpm.conf
Однако эта точно такая же команда в
/etc/init.d/php5-fpm
файл не может настроить umask при запускеsudo service php5-fpm stop; sudo service php5-fpm start
или при перезагрузке.
4 ответа
Не решение для общего отслеживания того, откуда исходят настройки umask в ubuntu (единственный способ, который я нашел до сих пор, - это старый добрый трудоемкий подход к репликации проблемы, попытке изолировать ее от сценария или функции, а затем отступить через каждый скрипт / функцию, которая вызывается рекурсивно), но решение проблемы с php5-fpm umask. Я нашел много обращений в Google, Stackru и других местах для решения этой проблемы, но пока нет решения. Надеюсь, это полезно для людей.
редактировать /etc/init/php-fpm.conf
включить строку umask 0002
(или любой другой, по вашему желанию). Моя версия файла теперь выглядит так:
# php5-fpm - The PHP FastCGI Process Manager
description "The PHP FastCGI Process Manager"
author "Ondřej Surý <ondrej@debian.org>"
start on runlevel [2345]
stop on runlevel [016]
### my edit - change umask setting
umask 0002
pre-start exec /usr/lib/php5/php5-fpm-checkconf
respawn
exec /usr/sbin/php5-fpm --nodaemonize --fpm-config /etc/php5/fpm/php-fpm.conf
объяснение
Проследив через service
команда, которая запускает php5-fpm
при запуске он выполняет некоторые проверки (строка 118 на моей копии) для /etc/init/${SERVICE}.conf
вместе с проверкой initctl
присутствует и может сообщить о своей версии. Если эти тесты пройдены, то upstart
который используется в случае php5-fpm
использует /etc/init/php-fpm.conf
файл.
Сайт выскочки Ubuntu дает довольно четкие инструкции. В частности, вы можете проверить первоклассную кулинарную книгу на предмет особенностей, которые вам нужны.
Насколько я могу понять, это означает, что поэтому команда 'service' фактически никогда не выполняла start-stop-daemon …
команды найдены в /etc/init.d/php5-fpm
вот почему мои предыдущие правки не имели никакого эффекта. Вместо этого это проходит в upstart
(на самом деле initctl
) когда вы используете что-то вроде service php5-fpm start
, так далее.
Если вы используете systemd, в /etc/systemd/system
каталог, создайте новый каталог с именем php7.2-fpm.service.d
, Название этого каталога будет зависеть от вашего дистрибутива и версии PHP. Бежать systemctl list-units --type=service | grep --ignore-case php
чтобы узнать, как это назвать. Внутри этого каталога поместите файл с именем umask.conf
с содержанием:
# /etc/systemd/system/php7.2-fpm.service.d/umask.conf
[Service]
UMask=0002
Чтобы изменения вступили в силу, запустите:
systemctl daemon-reload && systemctl restart php7.2-fpm
Преимущество этого решения заключается в том, что ваши настройки не теряются при обновлении пакетов.
Объяснение того, как это работает, из руководства по systemd:
Наряду с модульным файлом foo.service может существовать "раскрывающийся" каталог foo.service.d /. Все файлы с суффиксом ".conf" из этого каталога будут проанализированы после анализа самого файла. Это полезно для изменения или добавления параметров конфигурации для устройства без необходимости изменения файлов модуля. Каждый файл должен иметь соответствующие заголовки разделов. Обратите внимание, что для созданных экземпляров модулей эта логика сначала ищет экземпляр подкаталога ".d /" и считывает его файлы ".conf", затем следует подкаталог шаблона ".d /" и файлы ".conf".
В дополнение к / etc / systemd / system раскрывающиеся каталоги ".d" для системных служб можно поместить в каталоги / usr / lib / systemd / system или / run / systemd / system. Добавленные в / etc файлы имеют приоритет над файлами в / run, которые, в свою очередь, имеют приоритет над файлами в / usr / lib. Вложенные файлы в любом из этих каталогов имеют приоритет над единичными файлами, где бы они ни находились. Несколько раскрывающихся файлов с разными именами применяются в лексикографическом порядке, независимо от того, в каких каталогах они находятся.
Лучше скопируйте скрипт systemd перед редактированием php5-fpm.service, иначе он будет перезаписан при следующем обновлении:
cp /lib/systemd/system/php5-fpm.service /etc/systemd/system/
vi /etc/systemd/system/php5-fpm.service
Add: UMask=0002 in [Service] section.
systemctl daemon-reload
systemctl restart php5-fpm
Источник: https://ispire.me/running-php-fpm-with-different-user-group-using-umask/
Хорошо, но это относится ко всем бассейнам. Было бы удобно иметь возможность установить что-то вроде
env[umask] = 0002 (шансов для этого нет)
гуглил, но не похоже на способ сделать это для каждого хоста.