FreeBSDでphp-fpmサービスを有効にする

FreeBSDでphp-fpmサービスを有効にする

私はnginx(v1.24.0)とphp(v5.6 2)を使ってFreeBSDシステム1を設定しています。このシステムは、php-fpmを使用してnginxとphpの間で通信します。

php v5.6が出てきたので、適切なビルドパッケージがないので、最初から新しくビルドする必要がありました(php-fpmオプションを使用してビルドしました)。以下からソースコードを取得します。

https://www.php.net/distributions/php-5.6.40.tar.xz

最初から構築したので、php-fpm用のinitファイルを手動でインストールする必要がありましたが、何かが欠けていました。そしてphp-fpmサービスを手動で起動できるので(そしてnginxがPHPベースのファイルを正常に提供できるようにするため)、システムが起動したときにこのサービスを自動的に起動する魔法に何かがあります。

だから、次の実行可能なスクリプトファイルがあります。

/usr/local/etc/rc.d/nginx
/usr/local/etc/rc.d/php-fpm

/etc/rc.conf には以下が含まれます。

nginx_enable="yes"
php_fpm_enable="yes"

nginxサービスは自動的に開始されますが、次のようにphp-fpmサービスを手動で開始する必要があります。

service php-fpm start

以下を使用してサービスのリストを要求するとき:

service -e

nginx サービスはリストされますが、php-fpm サービスはリストされません。

検査中提供する文書。それは言う:

-e  List services that are enabled.  The list of scripts to check is
    compiled using  rcorder(8) the same way that it is done in rc(8),
    then that list of scripts is checked for an "rcvar" assignment.  If
    present the script is checked to see if it is enabled.

そのため、私の場合、initファイルは正しい場所にありましたが、実際のサービスを識別するための内容がありません。

php-fpmが再起動時に自動的に起動する必要があるサービスであることをFreeBSDに通知するには、何を変更する必要がありますか?

アップデート#1

私はnginxスクリプトをphp-fpmスクリプトと比較している間、nginxスクリプトに次のものがあることがわかりました。

. /etc/rc.subr
name="nginx"
rcvar=nginx_enable

そして、サービス文書はrcvarの割り当てを参照します。だからこれをphp-fpmスクリプトに追加しました:

. /etc/rc.subr
name="php-fpm"
rcvar=php_fpm_enable

ただし、再起動後も service -e は php-fpm を認識してサービスとして起動できません。

アップデート#2

Richardが要求した後、私のnginxスクリプトに次のものが含まれていることを確認しました。

# PROVIDE: nginx
# REQUIRE: LOGIN cleanvar
# KEYWORD: shutdown

しかし、私の元のphp-fpmスクリプトには次のものがあります。

### BEGIN INIT INFO
# Provides:          php-fpm
# Required-Start:    $remote_fs $network
# Required-Stop:     $remote_fs $network
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: starts php-fpm
# Description:       starts the PHP FastCGI Process Manager daemon
### END INIT INFO

このINIT INFOブロックを取り外し、次に交換しました。

# PROVIDE: php-fpm
# REQUIRE: nginx

service -eを実行すると、php-fpmスクリプトが有効になっていることが報告されます。ただし、システムを再起動してもサービスは自動的に起動しません。


1. 実際に最新の TrueNAS Core 13 で動作する FreeBSD Jail

2. はい、知っています。 v5.6は古いです。実際のアップグレードの前に、新しいプラットフォームでシステムを安定させようとしています。

答え1

リチャードのコメントに基づいて、私は見ました。https://cgit.freebsd.org/ports/tree/lang/php83/files/php-fpm.in

このファイルは、nginxサービス制御スクリプトで表示されるスタイルと一致します。

Nginx(一部):

#!/bin/sh

# PROVIDE: nginx
# REQUIRE: LOGIN cleanvar
# KEYWORD: shutdown

#
# Add the following lines to /etc/rc.conf to enable nginx:
# nginx_enable (bool):      Set to "NO" by default.
#               Set it to "YES" to enable nginx
# nginx_profiles (str):     Set to "" by default.
#               Define your profiles here.
# nginx_pid_prefix (str):   Set to "" by default.
#               When using profiles manually assign value to "nginx_"
#               for prevent collision with other PIDs names.
# nginxlimits_enable (bool):    Set to "NO" by default.
#               Set it to yes to run `limits $limits_args`
#               just before nginx starts.
# nginx_reload_quiet (bool):    Set to "NO" by default.
#               Set it to yes to suppress info output when testng config.
# nginx_flags (str):        Set to "" by default.
#               Extra flags passed to start command.
# nginxlimits_args (str):   Default to "-e -U www"
#               Arguments of pre-start limits run.
# nginx_http_accept_enable (bool): Set to "NO" by default.
#               Set to yes to check for accf_http kernel module
#               on start-up and load if not loaded.
# nginx_sig_stop (str):     Default to "TERM"

. /etc/rc.subr

name="nginx"
rcvar=nginx_enable

start_precmd="nginx_prestart"
stop_precmd="nginx_prestop"
restart_precmd="nginx_checkconfig"
reload_precmd="nginx_checkconfig"
configtest_cmd="nginx_checkconfig"
gracefulstop_cmd="nginx_gracefulstop"
upgrade_precmd="nginx_checkconfig"
upgrade_cmd="nginx_upgrade"
command="/usr/local/sbin/nginx"
_pidprefix="/var/run"
pidfile="${_pidprefix}/${name}.pid"
_tmpprefix="/var/tmp/nginx"
required_files=/usr/local/etc/nginx/nginx.conf
extra_commands="reload configtest upgrade gracefulstop"

php-fpm(部分):

#!/bin/sh

# PROVIDE: php-fpm
# REQUIRE: LOGIN
# KEYWORD: shutdown

#
# Add the following line to /etc/rc.conf to enable php-fpm:
# php-fpm_enable (bool):        Set to "NO" by default.
#                               Set it to "YES" to enable nginx
# php-fpm_profiles (str):       Set to "" by default.
#                               Define your profiles here.
# php_fpm_pid_prefix (str):     Set to "" by default.
#                               When using profiles manually assign value to "php_fpm_"
#                               for prevent collision with other PIDs names.

. /etc/rc.subr

name="php_fpm"
rcvar=php_fpm_enable

start_precmd="php_fpm_prestart"
restart_precmd="php_fpm_checkconfig"
reload_precmd="php_fpm_checkconfig"
command="%%PREFIX%%/sbin/php-fpm"
configtest_cmd="php_fpm_checkconfig"
_pidprefix="/var/run"
pidfile="${_pidprefix}/php-fpm.pid"
required_files="%%PREFIX%%/etc/php-fpm.conf"

load_rc_config "${name}"

このファイルを自分のシステムにコピーすると(そして%%PREFIX%%が絶対パスに置き換えられるため)、service -eはphp-fpmが有効になっていることを報告します。

再起動すると、php-fpmサービスが実行されます。

# ps -aux
USER    PID %CPU %MEM    VSZ    RSS TT  STAT STARTED    TIME COMMAND
root  53435  0.0  0.0  26876  10016  -  SsJ  09:33   0:00.01 php-fpm: master process (/usr/local/etc/php-fpm.conf) (php-fpm)
www   53436  0.0  0.0  26876  10224  -  IJ   09:33   0:00.00 php-fpm: pool www (php-fpm)
www   53437  0.0  0.0  26876  10024  -  IJ   09:33   0:00.00 php-fpm: pool www (php-fpm)

再起動後すぐにnginxからPHPベースのファイルにアクセスできます。

ただし、サービスの状態を確認すると混乱が加わります。

# service php-fpm status
php_fpm is not running.

今確認してみると、サービスの状態が次の場所にあるpidファイルによって異なります。

/var/run/php-fpm.pid

しかし、これは私のシステムには存在しません。 Richardの他のコメントで述べたように、php-fpmの場合、このファイルの場所はphp-fpm.confで定義する必要があります(すでにphp-fpmサービススクリプトファイルで定義されており、nginxはそのファイルでのみこれを行います)。 nginx.confの代わりにサービススクリプトファイル)。

これをphp-fpm.confに追加すると:

pid = /var/run/php-fpm.pid

次に、php-fpmサービスのステータスが正常であることを確認します。

php-fpmとnginxの機能的な違いは、サービス制御スクリプトの詳細に関連していると仮定できます。この違いを分析することは、この質問の範囲外です。

関連情報