我正在使用 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 文件放在正确的位置,但我缺少 rcorder 用于识别实际服务的任何内容。
我需要更改什么才能告诉 FreeBSD php-fpm 是一个需要在重新启动时自动启动的服务?
更新#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 监狱
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 之间的功能差异与其服务控制脚本中的细节有关。分析这种差异超出了本问题的范围。