web-dev-qa-db-ja.com

PHP-FPMをrootオプションで自動的に起動します

PHP-FPMでプールをrootとして実行しようとしましたが、init.d起動パラメーターを調整できないようです。

これは、CLIからPHP-FPMを起動するときに機能します(Sudo php-fpm7.0 -DRy /etc/php/7.0/fpm/php-fpm.confを使用しますが、serviceコマンド(Sudo service php7.0-fpm (re)start)を使用してこれを機能させることはできません。そのため、サーバーが再起動するたびに、PHP-FPM失敗し、このコマンドを実行する必要があります。

/etc/defaultの行にDAEMON_ARGS="--daemonize --fpm-config $CONFFILE -R"でファイル「php-fpm7.0」を配置しようとしました。また、-Rパラメータをdo_start/etc/init.d/php7.0-fpm関数に直接追加しようとしましたが、please specify user and group other than rootエラーが発生し続けます。

起動時およびserviceコマンドでこれを機能させる方法はありますか?


オフトピック:私はすべてのリスクを知っており、なぜそれをすべきでないのかを知っていますが、とにかくやりたいのです。ディレクトリを作成したり、chownコマンドを実行したりするためにいくつかのスクリプトを実行する必要があります。プールは、特定の1つのURLパスでのみプライベート192.168.1.Xネットワーク内から到達可能なnginxサーバーブロックによって使用されるバックエンド専用になります。

別の方法として、PHPスクリプトをrootとして実行するcronスクリプトを設定することもできますが、この方法ではさらに多くの時間がかかります。

5
redelschaap

ようやく解決策を見つけました。 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を実行してください。私の場合、Ubuntu 16.04ではrootとしてプールを実行できるようになりました。

3
redelschaap

systemdシステムでは、system V initスクリプトではなくsystemdを使用してこれを構成する必要がある場合があります

以下の手順は、Ubuntu 16.04 LTSでテストされ、動作しています。そして、これはリダイレクトされたinitスクリプトの犯人です:

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

1。Edit php-fpmプール構成。 /etc/php/7.0/fpm/pool.d/www.confおよびrootをユーザー/グループとしてrootを構成します

; Unixユーザー/プロセスグループ
;注:ユーザーは必須です。グループが設定されていない場合、デフォルトのユーザーのグループ
;使用されます。
 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 

。設定を再読み込み

 $ 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:マスタープロセス(/etc/php/7.0/fpm/php-fpm.conf)
root 32063 0.0 0.0 221680 4992? S 16:59 0:00 php-fpm:プールwww 
 root 32064 0.0 0.0 221680 4992? S 16:59 0:00 php-fpm:プールwww 
7
Ryan Babchishin