IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    HHVM拒绝502,用supervisor管理HHVM进程

    Note发表于 2014-11-09 07:38:21
    love 0

    HHVM502问题困扰了好多像我这样的新手菜鸟,经常不明原因的就会出现HHVM crash。网上也就很多文章讨论,很多都是建立一个监控脚本,当502出现就重启HHVM服务,今天给大家介绍用supervisor来管理HHVM进程,拒绝502出现。

    HHVM 502

    什么是supervisor?

    Supervisor是一个C/S系统,它可以在类unix操作系统让用户来监视和控制后台服务进程的数量,一个很重要的功能就是监控服务器的主要后台进程,并在出现问题是自动重启。

    安装supervisor

    1、根据服务器上的python版本下载对应的setuptools

    [root@test1 ~]# python -V

    显示 Python 2.6.6

    wget http://pypi.python.org/packages/2.6/s/setuptools/setuptools-0.6c11-py2.6.egg#md5=bfa92100bd772d5a213eedd356d64086
    
    sh setuptools-0.6c11-py2.6.egg

    2、下载并安装supervisor

    wget http://pypi.python.org/packages/source/s/supervisor/supervisor-3.0b1.tar.gz
    tar -zxvf supervisor-3.0b1.tar.gz
    cd supervisor-3.0b1
    python setup.py install

    安装setuptools后也可以

    easy_install supervisor

    3、创建默认的配置文件

    echo_supervisord_conf  >/etc/supervisord.conf

    4、设定supervisor开机启动

    vi /etc/init.d/supervisord

    #!/bin/bash
    #
    # supervisord This scripts turns supervisord on
    # chkconfig: 345 83 04
    # description: supervisor is a process control utility. It has a web based
    # xmlrpc interface as well as a few other nifty features.
    #
    
    # source function library
    . /etc/rc.d/init.d/functions
    
    set -a
    
    PREFIX=/usr
    
    SUPERVISORD=$PREFIX/bin/supervisord
    SUPERVISORCTL=$PREFIX/bin/supervisorctl
    
    PIDFILE=/var/supervisor/supervisord.pid
    LOCKFILE=/tmp/supervisord.lock
    
    OPTIONS="-c /etc/supervisord.conf"
    
    # unset this variable if you don't care to wait for child processes to shutdown before removing the $LOCKFILE-lock
    WAIT_FOR_SUBPROCESSES=yes
    
    # remove this if you manage number of open files in some other fashion
    ulimit -n 96000
    
    RETVAL=0
    
    running_pid()
    {
    # Check if a given process pid's cmdline matches a given name
    pid=$1
    name=$2
    [ -z "$pid" ] && return 1
    [ ! -d /proc/$pid ] && return 1
    (cat /proc/$pid/cmdline | tr "\000" "\n"|grep -q $name) || return 1
    return 0
    }
    
    running()
    {
    # Check if the process is running looking at /proc
    # (works for all users)
    
    # No pidfile, probably no daemon present
    [ ! -f "$PIDFILE" ] && return 1
    # Obtain the pid and check it against the binary name
    pid=`cat $PIDFILE`
    running_pid $pid $SUPERVISORD || return 1
    return 0
    }
    
    start() {
    echo "Starting supervisord: "
    
    if [ -e $PIDFILE ]; then
    echo "ALREADY STARTED"
    return 1
    fi
    
    # start supervisord with options from sysconfig (stuff like -c)
    $SUPERVISORD $OPTIONS
    
    # show initial startup status
    $SUPERVISORCTL $OPTIONS status
    
    # only create the subsyslock if we created the PIDFILE
    [ -e $PIDFILE ] && touch $LOCKFILE
    }
    
    stop() {
    echo -n "Stopping supervisord: "
    $SUPERVISORCTL $OPTIONS shutdown
    if [ -n "$WAIT_FOR_SUBPROCESSES" ]; then
    echo "Waiting roughly 60 seconds for $PIDFILE to be removed after child processes exit"
    for sleep in 2 2 2 2 4 4 4 4 8 8 8 8 last; do
    if [ ! -e $PIDFILE ] ; then
    echo "Supervisord exited as expected in under $total_sleep seconds"
    break
    else
    if [[ $sleep -eq "last" ]] ; then
    echo "Supervisord still working on shutting down. We've waited roughly 60 seconds, we'll let it do its thing from here"
    return 1
    else
    sleep $sleep
    total_sleep=$(( $total_sleep + $sleep ))
    fi
    
    fi
    done
    fi
    
    # always remove the subsys. We might have waited a while, but just remove it at this point.
    rm -f $LOCKFILE
    }
    
    restart() {
    stop
    start
    }
    
    case "$1" in
    start)
    start
    RETVAL=$?
    ;;
    stop)
    stop
    RETVAL=$?
    ;;
    restart|force-reload)
    restart
    RETVAL=$?
    ;;
    reload)
    $SUPERVISORCTL $OPTIONS reload
    RETVAL=$?
    ;;
    condrestart)
    [ -f $LOCKFILE ] && restart
    RETVAL=$?
    ;;
    status)
    $SUPERVISORCTL $OPTIONS status
    if running ; then
    RETVAL=0
    else
    RETVAL=1
    fi
    ;;
    *)
    echo $"Usage: $0 {start|stop|status|restart|reload|force-reload|condrestart}"
    exit 1
    esac
    
    exit $RETVAL

    后面我们需要配置的是/etc/supervisord.conf这个文件,增加HHVM管理。

    配置supervisord管理HHVM进程

    编辑/etc/supervisord.conf

    [program:hhvm]
    command=/usr/bin/hhvm --mode server --config /etc/hhvm/config.hdf --config /etc/hhvm/php.ini -vServer.Type=fastcgi -vServer.Port=9000 ; the program (relative uses PATH, can take args)
    ;process_name=%(program_name)s ; process_name expr (default %(program_name)s)
    numprocs=1 ; number of processes copies to start (def 1)
    directory=/tmp ; directory to cwd to before exec (def no cwd)
    ;umask=022 ; umask for process (default None)
    ;priority=999 ; the relative start priority (default 999)
    autostart=true ; start at supervisord start (default: true)
    autorestart=unexpected ; whether/when to restart (default: unexpected)
    ;startsecs=1 ; number of secs prog must stay running (def. 1)
    ;startretries=3 ; max # of serial start failures (default 3)
    ;exitcodes=0,2 ; 'expected' exit codes for process (default 0,2)
    ;stopsignal=QUIT ; signal used to kill process (default TERM)
    stopwaitsecs=10 ; max num secs to wait b4 SIGKILL (default 10)
    ;stopasgroup=true ; send stop signal to the UNIX process group (default false)
    ;killasgroup=true ; SIGKILL the UNIX process group (def false)
    user=nginx ; 你启动HHVM的用户名

    保存文件后执行supervisorctl reload,这样你的HHVM进程就由supervisor来管理了,当出现502时,supervisor就会重启HHVM.

    需要注意的是HHVM启动需要以 server模式运行。

    The post HHVM拒绝502,用supervisor管理HHVM进程 appeared first on WordPress Note.



沪ICP备19023445号-2号
友情链接