Я пытаюсь установить fast-cgi для nginx на инстансе EC2. Я выполнил объясненные шаги Вот, но это предназначено для Debian и не работает из коробки для систем на основе красной шляпы. Я немного изменил сценарий, чтобы он выглядел так -
#!/bin/bash
### BEGIN INIT INFO
# Provides: php-fcgi
# Required-Start: $nginx
# Required-Stop: $nginx
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: starts php over fcgi
# Description: starts php over fcgi
### END INIT INFO
. /etc/rc.d/init.d/functions
(( EUID )) && echo .You need to have root priviliges.. && exit 1
BIND=/tmp/php.socket
USER=nginx
PHP_FCGI_CHILDREN=15
PHP_FCGI_MAX_REQUESTS=1000
PHP_CGI=/usr/bin/php-cgi
PHP_CGI_NAME=`basename $PHP_CGI`
PHP_CGI_ARGS="- USER=$USER PATH=/usr/bin PHP_FCGI_CHILDREN=$PHP_FCGI_CHILDREN PHP_FCGI_MAX_REQUESTS=$PHP_FCGI_MAX_REQUESTS $PHP_CGI -b $BIND"
RETVAL=0
start() {
echo -n "Starting PHP FastCGI: "
#ORIGINAL LINE
#daemon $PHP_CGI --quiet --start --background --chuid "$USER" --exec /usr/bin/env -- $PHP_CGI_ARGS
#MODIFIED LINE
daemon --user=$USER $PHP_CGI -b $BIND&
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/php-fcgi
#echo "$PHP_CGI_NAME."
}
stop() {
echo -n "Stopping PHP FastCGI: "
killall -q -w -u $USER $PHP_CGI
RETVAL=$?
echo "$PHP_CGI_NAME."
rm /var/lock/subsys/php-fcgi
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
*)
echo "Usage: php-fastcgi {start|stop|restart}"
exit 1
;;
esac
exit $RETVAL
У меня сейчас проблема -
service php-fcgi start
держит оболочку заблокированной. Если я сбегу service php-fcgi start &
а потом ps aux
, Я вижу, что процесс php-cgi работает привязанным к сокету. Я вижу, что команда пуска останавливается, только когда выполняю service php-fcgi stop
. Как решить эту проблему с блокировкой? Я пробовал добавить &
в конце строки, порождающей демона. Но другие скрипты, похоже, этого не делают. Это самый сложный сценарий, который я пытаюсь изменить :-([ OK ]
? Я проверил такие скрипты, как httpd, и увидел, что все, что они делают, было примерно так, как показано ниже. Но я никогда не вижу зеленого [ OK ]
когда я выполняю php-fcgi
. Я также обнаружил, что установка echo_success
с участием functions
sourced отображает зеленый [ OK ]
но я не вижу других скриптов в /etc/rc.d/init.d/
выполнение echo_success
или echo_failure
. Что я не так?PHP_FCGI_CHILDREN
с участием daemon
?echo [ $RETVAL -eq 0 ] && touch /var/lock/subsys/
Изменить daemon
строка к:
daemon --user $USER --pidfile=$PIDFILE "$PHP_CGI -b $BIND &> /dev/null &"
&> /dev/null
равноценен >/dev/null 2>&1
, означает перенаправление как stdout, так и stderr на /dev/null
.
Если это не показывает [ OK ]
флаг, попробуйте это:
if [ -n "$pid" ]; then
echo $pid > $PIDFILE
success "Starting php-cgi service"
else
failure "Starting php-cgi service"
fi
Взгляните на success
функция в /etc/init.d/functions
Больше подробностей.
В stop
функция должна измениться на:
killproc -p $PIDFILE $PHP_CGI_NAME
Вставьте PHP_CGI_ARGS
в качестве переменной среды для daemon
функция:
daemon --user $USER --pidfile=$PIDFILE "env - $PHP_CGI_ARGS
$PHP_CGI -b $BIND &> /dev/null &"
Более того, чтобы он запускался автоматически при загрузке, вы должны изменить информацию об инициализации в стиле Red Hat:
# chkconfig: 345 85 15
# description: Running php-cgi
# processname: php-cgi
# config: /etc/sysconfig/php-cgi
Итак, вы используете систему на основе redhat и хотите версию PHP, которая поставляется с FPM (лучший способ сделать cgi на PHP> = 5.3)? Почему бы вам просто не установить пакеты откуда-нибудь вроде IUS: http://iuscommunity.org/ а не пытаться заставить работать специальную версию? Репозиторий позволит вам оставаться в курсе событий намного проще и, как правило, упростит вашу жизнь.
После установки репо это все, что вам нужно сделать: chkconfig php-fpm start; service php-fpm start
, и все будет готово.