저는 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
Richard의 의견을 바탕으로 나는 보았습니다.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의 기능적 차이점은 서비스 제어 스크립트의 세부 사항과 관련이 있다고 가정할 수 있습니다. 이 차이점을 분석하는 것은 이 질문의 범위를 벗어납니다.