Назад | Перейти на главную страницу

Сценарий инициализации и зеленый значок [OK]

Я пытаюсь установить 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

У меня сейчас проблема -

  1. service php-fcgi start держит оболочку заблокированной. Если я сбегу service php-fcgi start & а потом ps aux, Я вижу, что процесс php-cgi работает привязанным к сокету. Я вижу, что команда пуска останавливается, только когда выполняю service php-fcgi stop. Как решить эту проблему с блокировкой? Я пробовал добавить & в конце строки, порождающей демона. Но другие скрипты, похоже, этого не делают. Это самый сложный сценарий, который я пытаюсь изменить :-(
  2. Как заставить скрипт отображать зеленый [ OK ]? Я проверил такие скрипты, как httpd, и увидел, что все, что они делают, было примерно так, как показано ниже. Но я никогда не вижу зеленого [ OK ] когда я выполняю php-fcgi. Я также обнаружил, что установка echo_success с участием functions sourced отображает зеленый [ OK ] но я не вижу других скриптов в /etc/rc.d/init.d/ выполнение echo_success или echo_failure. Что я не так?
  3. Кроме того, как указать PHP_FCGI_CHILDREN с участием daemon?
echo
      [ $RETVAL -eq 0 ] && touch /var/lock/subsys/
  1. Изменить daemon строка к:

    daemon --user $USER --pidfile=$PIDFILE "$PHP_CGI -b $BIND &> /dev/null &"
    

    &> /dev/null равноценен >/dev/null 2>&1, означает перенаправление как stdout, так и stderr на /dev/null.

  2. Если это не показывает [ 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
    
  3. Вставьте 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, и все будет готово.