【问题标题】:How to setup multiple PHP-FPM masters on ubuntu 14.04?如何在 ubuntu 14.04 上设置多个 PHP-FPM 主机?
【发布时间】:2016-09-19 00:54:46
【问题描述】:

我一直关注this tutorial 为我的每个 wordpress 多站点安装设置多个 PHP-FPM 主服务器,以便它们可以在 APC 缓存和其他选项方面相互独立运行。

按照信中的说明进行操作后,每个新的 php5-fpm init.d 脚本实际上不会初始化或执行任何操作。
/var/run/php5-fpm-master2.pidphp5-fpm-master2.sock 也没有被创建。考虑到我已经按照指示进行操作,我假设他的 distro/package 版本不同,或者我在字里行间遗漏了一些东西。

有人愿意分享如何在 Ubuntu 14.04 上正确设置多个 PHP-FPM 主机(来自 apt-get 的标准 php5-fpm)吗?

【问题讨论】:

    标签: php nginx ubuntu-14.04 unix-socket


    【解决方案1】:

    我用的不是 Ubuntu,而是 Debian Jessie,这里应该是一样的。

    首先,转到/etc/php5/fpm/pool.d

    在那里你必须创建你的池,例如。 G。一个文件名为www1.conf:

    [www1]
    user = www1
    group = www1
    
    listen = /var/run/php5-fpm-www1.sock
    listen.owner = www1
    listen.group = www1
    listen.allowed_clients = 127.0.0.1
    
    pm = ondemand
    pm.max_children = 100
    pm.process_idle_timeout = 5s;
    chdir = /
    

    创建第二个,例如。 G。文件名www2.conf:

    [www2]
    user = www2
    group = www2
    
    listen = /var/run/php5-fpm-www2.sock
    listen.owner = www2
    listen.group = www2
    listen.allowed_clients = 127.0.0.1
    
    pm = ondemand
    pm.max_children = 100
    pm.process_idle_timeout = 5s;
    chdir = /
    

    现在转到/etc/php5/fpm 并删除其中的php-fpm.conf(在单独的目录中备份会很有用)。现在创建文件php-fpm-www1.conf,内容如下:

    [global]
    pid = /var/run/php5-fpm-www1.pid
    error_log = /var/log/php5-fpm-www1.log
    syslog.ident = php-fpm-www1
    log_level = notice
    emergency_restart_threshold = 10
    emergency_restart_interval = 1m
    include=/etc/php5/fpm/pool.d/www1.conf
    

    与此类似,创建文件php-fpm-www2.conf

    [global]
    pid = /var/run/php5-fpm-www2.pid
    error_log = /var/log/php5-fpm-www2.log
    syslog.ident = php-fpm-www2
    log_level = notice
    emergency_restart_threshold = 10
    emergency_restart_interval = 1m
    include=/etc/php5/fpm/pool.d/www2.conf
    

    这就是您需要的完整配置。最重要的部分是正确的初始化脚本。在 Debian 上,我只是复制了默认的 /etc/init.d/php5-fpm

    文件/etc/init.d/php5-fpm-www1

    #!/bin/sh
    ### BEGIN INIT INFO
    # Provides:          php5-fpm-www1
    # Required-Start:    $remote_fs $network
    # Required-Stop:     $remote_fs $network
    # Default-Start:     2 3 4 5
    # Default-Stop:      0 1 6  
    # Short-Description: starts php5-fpm-www1
    # Description:       Starts The PHP FastCGI Process Manager Daemon
    ### END INIT INFO
    
    # Author: Ondrej Sury <ondrej@debian.org>
    
    PATH=/sbin:/usr/sbin:/bin:/usr/bin
    DESC="PHP5 FastCGI Process Manager"
    NAME=php5-fpm-www1
    BIN=php5-fpm
    DAEMON=/usr/sbin/$BIN
    DAEMON_ARGS="--daemonize --fpm-config /etc/php5/fpm/php-fpm-www1.conf"
    CONF_PIDFILE=$(sed -n 's/^pid\s*=\s*//p' /etc/php5/fpm/php-fpm-www1.conf)
    PIDFILE=${CONF_PIDFILE:-/run/php5-fpm-www1.pid}
    TIMEOUT=30
    SCRIPTNAME=/etc/init.d/$NAME
    
    # Exit if the package is not installed
    [ -x "$DAEMON" ] || exit 0
    
    # Read configuration variable file if it is present
    [ -r /etc/default/$NAME ] && . /etc/default/$NAME
    
    # Load the VERBOSE setting and other rcS variables
    . /lib/init/vars.sh
    
    # Define LSB log_* functions.
    # Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
    . /lib/lsb/init-functions
    
    # Don't run if we are running upstart
    if init_is_upstart; then
        exit 1
    fi
    
    #
    # Function to check the correctness of the config file
    #
    do_check()
    {
        /usr/lib/php5/php5-fpm-checkconf || return 1
        return 0
    }
    
    #
    # Function that starts the daemon/service
    #
    do_start()
    {
        # Return
        #   0 if daemon has been started
        #   1 if daemon was already running
        #   2 if daemon could not be started
        start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \
            || return 1
        start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- \
            $DAEMON_ARGS 2>/dev/null \
            || return 2
        # Add code here, if necessary, that waits for the process to be ready
        # to handle requests from services started subsequently which depend
        # on this one.  As a last resort, sleep for some time.
    }
    
    #
    # Function that stops the daemon/service
    #
    do_stop()
    {
        # Return
        #   0 if daemon has been stopped
        #   1 if daemon was already stopped
        #   2 if daemon could not be stopped
        #   other if a failure occurred
        start-stop-daemon --stop --quiet --retry=QUIT/$TIMEOUT/TERM/5/KILL/5 --pidfile $PIDFILE --name $NAME
        RETVAL="$?"
        [ "$RETVAL" = 2 ] && return 2
        # Wait for children to finish too if this is a daemon that forks
        # and if the daemon is only ever run from this initscript.
        # If the above conditions are not satisfied then add some other code
        # that waits for the process to drop all resources that could be
        # needed by services started subsequently.  A last resort is to
        # sleep for some time.
        start-stop-daemon --stop --quiet --oknodo --retry=0/30/TERM/5/KILL/5 --name $NAME --exec $DAEMON
        [ "$?" = 2 ] && return 2
        # Many daemons don't delete their pidfiles when they exit.
        rm -f $PIDFILE
        return "$RETVAL"
    }
    
    #
    # Function that sends a SIGHUP to the daemon/service
    #
    do_reload() {
        #
        # If the daemon can reload its configuration without
        # restarting (for example, when it is sent a SIGHUP),
        # then implement that here.
        #
        start-stop-daemon --stop --signal USR2 --quiet --pidfile $PIDFILE --name $NAME
        return 0
    }
    
    case "$1" in
        start)
        [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
        do_check $VERBOSE
        case "$?" in
            0)
            do_start
            case "$?" in
                0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
                2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
            esac
            ;;
            1) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
        esac
        ;;
        stop)
        [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
        do_stop
        case "$?" in
            0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
            2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
        esac
        ;;
        status)
            status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
            ;;
        check)
            do_check yes
        ;;
        reload|force-reload)
        log_daemon_msg "Reloading $DESC" "$NAME"
        do_reload
        log_end_msg $?
        ;;
        reopen-logs)
        log_daemon_msg "Reopening $DESC logs" $NAME
        if start-stop-daemon --stop --signal USR1 --oknodo --quiet \
            --pidfile $PIDFILE --exec $DAEMON
        then
            log_end_msg 0
        else
            log_end_msg 1
        fi
        ;;
        restart)
        log_daemon_msg "Restarting $DESC" "$NAME"
        do_stop
        case "$?" in
          0|1)
            do_start
            case "$?" in
                0) log_end_msg 0 ;;
                1) log_end_msg 1 ;; # Old process is still running
                *) log_end_msg 1 ;; # Failed to start
            esac
            ;;
          *)
            # Failed to stop
            log_end_msg 1
            ;;
        esac
        ;;
        *)
        echo "Usage: $SCRIPTNAME {start|stop|status|restart|reload|force-reload}" >&2
        exit 1
        ;;
    esac
    
    :
    

    默认初始化脚本的变化是:

    评论:

    ### BEGIN INIT INFO
    # Provides:          php5-fpm-www1
    # Required-Start:    $remote_fs $network
    # Required-Stop:     $remote_fs $network
    # Default-Start:     2 3 4 5
    # Default-Stop:      0 1 6  
    # Short-Description: starts php5-fpm-www1
    # Description:       Starts The PHP FastCGI Process Manager Daemon
    ### END INIT INFO
    

    在这里您必须将第 2 行和第 7 行更改为您的脚本名称。

    配置:

    PATH=/sbin:/usr/sbin:/bin:/usr/bin
    DESC="PHP5 FastCGI Process Manager"
    NAME=php5-fpm-www1
    BIN=php5-fpm
    DAEMON=/usr/sbin/$BIN
    DAEMON_ARGS="--daemonize --fpm-config /etc/php5/fpm/php-fpm-www1.conf"
    CONF_PIDFILE=$(sed -n 's/^pid\s*=\s*//p' /etc/php5/fpm/php-fpm-www1.conf)
    PIDFILE=${CONF_PIDFILE:-/run/php5-fpm-www1.pid}
    TIMEOUT=30
    SCRIPTNAME=/etc/init.d/$NAME
    

    NAME 变量更改为您的脚本名称,并将BIN 变量添加为您的bin 文件的名称。此外,编辑 DAEMON 以匹配 $BIN 而不是 $NAMEDAEMON:ARGSCONF_PIDFILEPIDFILE 必须进行编辑以匹配您在 /etc/php5/fpm 中的配置。

    现在脚本应该已经启动了特定的 PHP5-FPM master。

    我的问题是/etc/init.d/php5-fpm-www1 stop 也确实阻止了www2 的主人。

    要解决这个问题,您必须在 init 脚本中编辑 do_stop() 函数:

    do_stop()
    {
        # Return
        #   0 if daemon has been stopped
        #   1 if daemon was already stopped
        #   2 if daemon could not be stopped
        #   other if a failure occurred
        start-stop-daemon --stop --quiet --retry=QUIT/$TIMEOUT/TERM/5/KILL/5 --pidfile $PIDFILE --name $NAME
        RETVAL="$?"
        [ "$RETVAL" = 2 ] && return 2
        # Wait for children to finish too if this is a daemon that forks
        # and if the daemon is only ever run from this initscript.
        # If the above conditions are not satisfied then add some other code
        # that waits for the process to drop all resources that could be
        # needed by services started subsequently.  A last resort is to
        # sleep for some time.
        start-stop-daemon --stop --quiet --oknodo --retry=0/30/TERM/5/KILL/5 --name $NAME --exec $DAEMON
        [ "$?" = 2 ] && return 2
        # Many daemons don't delete their pidfiles when they exit.
        rm -f $PIDFILE
        return "$RETVAL"
    }
    

    这里我必须将--name $NAME 添加到第 17 行的第二个start-stop-daemon 命令中。

    与您的/etc/init.d/php5-fpm-www2 文件一样:

    #!/bin/sh
    ### BEGIN INIT INFO
    # Provides:          php5-fpm-www2
    # Required-Start:    $remote_fs $network
    # Required-Stop:     $remote_fs $network
    # Default-Start:     2 3 4 5
    # Default-Stop:      0 1 6  
    # Short-Description: starts php5-fpm-www2
    # Description:       Starts The PHP FastCGI Process Manager Daemon
    ### END INIT INFO
    
    # Author: Ondrej Sury <ondrej@debian.org>
    
    PATH=/sbin:/usr/sbin:/bin:/usr/bin
    DESC="PHP5 FastCGI Process Manager"
    NAME=php5-fpm-www2
    BIN=php5-fpm
    DAEMON=/usr/sbin/$BIN
    DAEMON_ARGS="--daemonize --fpm-config /etc/php5/fpm/php-fpm-www2.conf"
    CONF_PIDFILE=$(sed -n 's/^pid\s*=\s*//p' /etc/php5/fpm/php-fpm-www2.conf)
    PIDFILE=${CONF_PIDFILE:-/run/php5-fpm-www2.pid}
    TIMEOUT=30
    SCRIPTNAME=/etc/init.d/$NAME
    
    # Exit if the package is not installed
    [ -x "$DAEMON" ] || exit 0
    
    # Read configuration variable file if it is present
    [ -r /etc/default/$NAME ] && . /etc/default/$NAME
    
    # Load the VERBOSE setting and other rcS variables
    . /lib/init/vars.sh
    
    # Define LSB log_* functions.
    # Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
    . /lib/lsb/init-functions
    
    # Don't run if we are running upstart
    if init_is_upstart; then
        exit 1
    fi
    
    #
    # Function to check the correctness of the config file
    #
    do_check()
    {
        /usr/lib/php5/php5-fpm-checkconf || return 1
        return 0
    }
    
    #
    # Function that starts the daemon/service
    #
    do_start()
    {
        # Return
        #   0 if daemon has been started
        #   1 if daemon was already running
        #   2 if daemon could not be started
        start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \
            || return 1
        start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- \
            $DAEMON_ARGS 2>/dev/null \
            || return 2
        # Add code here, if necessary, that waits for the process to be ready
        # to handle requests from services started subsequently which depend
        # on this one.  As a last resort, sleep for some time.
    }
    
    #
    # Function that stops the daemon/service
    #
    do_stop()
    {
        # Return
        #   0 if daemon has been stopped
        #   1 if daemon was already stopped
        #   2 if daemon could not be stopped
        #   other if a failure occurred
        start-stop-daemon --stop --quiet --retry=QUIT/$TIMEOUT/TERM/5/KILL/5 --pidfile $PIDFILE --name $NAME
        RETVAL="$?"
        [ "$RETVAL" = 2 ] && return 2
        # Wait for children to finish too if this is a daemon that forks
        # and if the daemon is only ever run from this initscript.
        # If the above conditions are not satisfied then add some other code
        # that waits for the process to drop all resources that could be
        # needed by services started subsequently.  A last resort is to
        # sleep for some time.
        start-stop-daemon --stop --quiet --oknodo --retry=0/30/TERM/5/KILL/5 --name $NAME --exec $DAEMON
        [ "$?" = 2 ] && return 2
        # Many daemons don't delete their pidfiles when they exit.
        rm -f $PIDFILE
        return "$RETVAL"
    }
    
    #
    # Function that sends a SIGHUP to the daemon/service
    #
    do_reload() {
        #
        # If the daemon can reload its configuration without
        # restarting (for example, when it is sent a SIGHUP),
        # then implement that here.
        #
        start-stop-daemon --stop --signal USR2 --quiet --pidfile $PIDFILE --name $NAME
        return 0
    }
    
    case "$1" in
        start)
        [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
        do_check $VERBOSE
        case "$?" in
            0)
            do_start
            case "$?" in
                0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
                2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
            esac
            ;;
            1) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
        esac
        ;;
        stop)
        [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
        do_stop
        case "$?" in
            0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
            2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
        esac
        ;;
        status)
            status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
            ;;
        check)
            do_check yes
        ;;
        reload|force-reload)
        log_daemon_msg "Reloading $DESC" "$NAME"
        do_reload
        log_end_msg $?
        ;;
        reopen-logs)
        log_daemon_msg "Reopening $DESC logs" $NAME
        if start-stop-daemon --stop --signal USR1 --oknodo --quiet \
            --pidfile $PIDFILE --exec $DAEMON
        then
            log_end_msg 0
        else
            log_end_msg 1
        fi
        ;;
        restart)
        log_daemon_msg "Restarting $DESC" "$NAME"
        do_stop
        case "$?" in
          0|1)
            do_start
            case "$?" in
                0) log_end_msg 0 ;;
                1) log_end_msg 1 ;; # Old process is still running
                *) log_end_msg 1 ;; # Failed to start
            esac
            ;;
          *)
            # Failed to stop
            log_end_msg 1
            ;;
        esac
        ;;
        *)
        echo "Usage: $SCRIPTNAME {start|stop|status|restart|reload|force-reload}" >&2
        exit 1
        ;;
    esac
    
    :
    

    请记住让您的初始化脚本保持最新,以便定期更新 php5-fpm 改变一些东西。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-15
      • 2023-03-15
      • 2014-12-02
      • 2014-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多