Я пытался заставить 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.