Назад | Перейти на главную страницу

Запускать PHP-FPM с опцией root автоматически

Я пытался заставить PHP-FPM запускать пул как root, но я не могу настроить параметры запуска init.d.

Работает при запуске PHP-FPM из CLI (с sudo php-fpm7.0 -DRy /etc/php/7.0/fpm/php-fpm.conf, но я не могу заставить это работать с service команда (sudo service php7.0-fpm (re)start. Поэтому каждый раз, когда сервер перезагружается, PHP-FPM дает сбой, и мне придется запускать эту команду.

Я попытался разместить файл "php-fpm7.0" в /etc/default с линией DAEMON_ARGS="--daemonize --fpm-config $CONFFILE -R", и я даже попытался добавить -R параметр к do_start функционировать в /etc/init.d/php7.0-fpm прямо, но я продолжаю получать please specify user and group other than root ошибка.

Есть ли способ заставить это работать при запуске и с service команда?


Не по теме: Я знаю все риски и знаю, почему мне не следует этого делать, но я все равно хочу. Мне нужно запустить несколько сценариев для создания каталогов, выполнения команд chown и т. Д., И пул будет выделен для бэкэнда, используемого серверным блоком nginx, который доступен из частной сети 192.168.1.X только по одному определенному URL-пути.

В качестве альтернативы я мог бы настроить cron-скрипт, который запускает PHP-скрипт от имени пользователя root, но такой подход будет стоить мне намного больше часов.

В системах systemd вам может потребоваться настроить это с помощью systemd, а не сценариев инициализации системы V.

Следующие ниже шаги протестированы и работают в Ubuntu 16.04 LTS. И это ваш виновник перенаправленных сценариев инициализации:

/lib/lsb/init-functions.d/40-systemd

1. Редактировать конфигурация пула php-fpm, например /etc/php/7.0/fpm/pool.d/www.conf и настройте root как пользователя / группу как root

; Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user's group
;       will be used.
user = root
group = root

2. Изменить /lib/systemd/system/php7.0-fpm.service и добавьте -R к ExecStart переменная, позволяющая службе запускаться от имени пользователя root

ExecStart=/usr/sbin/php-fpm7.0 --nodaemonize --fpm-config /etc/php/7.0/fpm/php-fpm.conf -R

3. Перезагрузите конфигурацию.

$ systemctl daemon-reload

4. Запустите службу.

$ systemctl start php7.0-fpm

5. Проверьте это

$ ps auwx | grep php
root     32061  0.0  0.0 221680 26084 ?        Ss   16:59   0:00 php-fpm: master process (/etc/php/7.0/fpm/php-fpm.conf)
root     32063  0.0  0.0 221680  4992 ?        S    16:59   0:00 php-fpm: pool www
root     32064  0.0  0.0 221680  4992 ?        S    16:59   0:00 php-fpm: pool www

Наконец-то я нашел решение. Оказалось, что Ubuntu использует systemd для запуска и перезапуска PHP-FPM и поэтому игнорировал init.d файлы.

Если у вас возникли проблемы с настройкой init.d файлы игнорируются, и вы используете Ubuntu 15.04 или новее, велика вероятность, что у этой службы есть systemd служебный файл.


Итак, решение моей проблемы: в моей системе есть файл с именем /lib/systemd/system/php7.0-fpm.service, который используется systemd. С командой cat /lib/systemd/system/php7.0-fpm.service вы можете увидеть содержимое служебного файла. Вы заменяете php7.0-fpm.service с именем вашего служебного файла. Служебный файл PHP7.0-FPM выглядит так:

[Unit]
Description=The PHP 7.0 FastCGI Process Manager
Documentation=man:php-fpm7.0(8)
After=network.target

[Service]
Type=notify
PIDFile=/run/php/php7.0-fpm.pid
ExecStart=/usr/sbin/php-fpm7.0 --nodaemonize --fpm-config /etc/php/7.0/fpm/php-fpm.conf
ExecReload=/bin/kill -USR2 $MAINPID

[Install]
WantedBy=multi-user.target

В моем случае мне нужно было настроить ExecStart правило. Нам не нужно редактировать этот файл, потому что systemd предлагает способ переопределить определенные правила. Команда sudo systemctl edit php7.0-fpm.service откроется редактор, в котором вы можете ввести эти правила. Просто введите разделы правил, которые вы хотите изменить, и сохраните файл. В моем случае это выглядит так:

[Service]
ExecStart=
ExecStart=/usr/sbin/php-fpm7.0 --allow-to-run-as-root --nodaemonize --fpm-config /etc/php/7.0/fpm/php-fpm.conf

Обязательно сначала сбросьте правило, которое вы хотите отредактировать, иначе оба правила будут выполнены. Также не забудьте запустить sudo systemctl daemon-reload после сохранения этого файла. В моем случае запуск пулов с правами root теперь разрешен в Ubuntu 16.04.