Как отследить, откуда берутся настройки umask php5-fpm в Ubuntu

Я был бы очень признателен за любую помощь в отслеживании и диагностике проблемы с umask в Ubuntu:

Я запускаю php5-fpm с Apache через proxy_fcgi. Процесс выполняется с umask 0022 (подтверждается тем, что PHP отправляет результаты umask() в файл [результат '18' == 0022]). Я хотел бы изменить это на 0002, но не могу отследить, откуда берется umask.

Apache установлен с umask 0002, и в качестве теста, если я отключу proxy_fcgi и запущу мой тест выше, я получу файл с u+g, имеющим доступ rw (и содержимое файла подтверждает umask как «2» == 0002).

Если я sudo -iu fpmuser запущу umask, результат будет 0002.

Системная информация:

  • PHP: 5.5.3-1ubuntu2.1
  • Апач: 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, и я протестировал umask. 002 и 0002.

ИЗМЕНИТЬ (2):

  • Мне удалось воспроизвести проблему, используя nginx и php5-fpm (используя сокеты unix, настроенные на режим прослушивания «0666»).
  • Я хотел бы проследить, откуда берется umask, но я бы согласился на какой-то способ заставить его делать то, что я хочу.
  • Должен добавить, что первый тест был проведен на образе Amazon Ubuntu 13.10. Мои тесты в «редактировании 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 или при перезагрузке.


person danielmerriott    schedule 21.01.2014    source источник


Ответы (4)


Не является решением для общего отслеживания того, откуда берутся настройки umask в Ubuntu (единственный способ, который я нашел до сих пор, — это старый добрый трудоемкий подход к воспроизведению проблемы, попытка изолировать ее в сценарии или функции, а затем отступить) через каждый скрипт/функцию, которая вызывается рекурсивно), но решение проблемы umask php5-fpm. Я нашел много ссылок на google, stackoverflow и в других местах по этой проблеме, но до сих пор не нашел решения. Надеюсь, это полезно для людей.

Отредактируйте /etc/init/php-fpm.conf, чтобы включить строку umask 0002 (или любой другой umask по вашему желанию). Моя версия файла теперь выглядит так:

# php5-fpm - The PHP FastCGI Process Manager

description "The PHP FastCGI Process Manager"
author "Ondřej Surý <[email protected]>"

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 upstart даны довольно четкие инструкции. В частности, вы можете ознакомиться с поваренной книгой upstart, чтобы узнать, что вам нужно.

Насколько я могу понять, это означает, что поэтому команда «service» никогда фактически не запускала команды start-stop-daemon …, найденные в /etc/init.d/php5-fpm, поэтому мои предыдущие изменения не имели никакого эффекта. Вместо этого он переходит на upstart (на самом деле initctl), когда вы используете что-то вроде service php5-fpm start и т. д.

person danielmerriott    schedule 23.01.2014
comment
Это не та проблема, которую я пытался решить, но мне понравился хорошо документированный вопрос и ответ. - person berbt; 21.02.2016
comment
Я борюсь с той же проблемой для Debian 8, однако он не использует выскочку. Какие-нибудь советы по настройке umask для php-fpm, работающего в Debian? - person SiliconMind; 07.03.2016
comment
@SiliconMind То же самое здесь. Вы уже нашли решение? - person balu; 28.03.2016
comment
Неважно, я только что наткнулся на ваш отдельный вопрос stackoverflow.com/q/35851049/36253 . - person balu; 28.03.2016
comment
Вы не должны не редактировать сценарий инициализации, он может быть перезаписан последующими обновлениями. вместо этого вы должны поместить umask 002 строфу в файл /etc/init/php-fpm.override - person chiborg; 11.08.2016
comment
If I sudo -iu fpmuser and run umask the results are 0002. -- разве вам не понадобится '-l' (нижняя буква L), чтобы получить новую среду входа в систему, в которой будут реализованы ваши изменения? (Спасибо, что поделились своей работой.) - person Ricalsin; 04.09.2016

Если вы используете 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. Встраиваемые файлы в любом из этих каталогов имеют приоритет над файлами модулей, где бы они ни находились. Несколько вставных файлов с разными именами применяются в лексикографическом порядке, независимо от того, в каком из каталогов они находятся.

person Алексей Присяжный    schedule 18.05.2016
comment
Следует отметить, что все директивы чувствительны к регистру: Umask не сработает. - person Martin; 11.08.2017
comment
Это прекрасно работало и в PHP 7 FPM (конечно, редактируемый файл /lib/systemd/system/php7.0-fpm.service - person lucaferrario; 09.03.2018
comment
Я хотел бы предложить вам рыцарское звание за этот ответ - person JoshGeake; 22.05.2020

лучше скопировать скрипт 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-other-user-group-using-umask/

person Irie    schedule 06.09.2016
comment
Это правильно для систем на основе systemd, таких как Ubuntu 16.04. Для более старых версий Ubuntu, таких как 14.04, Upstart является системой инициализации по умолчанию. Несмотря на то, что вышеуказанные файлы иногда присутствуют на диске, они фактически не используются. - person Martijn Heemels; 09.03.2017

хорошо, но это относится ко всем пулам. Было бы удобно иметь возможность установить его с помощью чего-то вроде

env[umask] = 0002 (нет шансов, что это сработает)

гуглил, но, похоже, это не способ сделать это для каждого хоста.

person Antony Gibbs    schedule 24.02.2014