【问题标题】:Gracefully reloading gunicorn after switching the current symlink to a new directory将当前符号链接切换到新目录后优雅地重新加载 gunicorn
【发布时间】:2013-07-14 14:32:19
【问题描述】:

我正在尝试部署我的应用程序,我的文件夹的组织方式意味着我只在想要部署新版本时更改符号链接。像这样:

./2013-07-16-10-12-48-test/  
./2013-07-16-10-17-01-test/  
./current -> 2013-07-16-10-17-01-test/

通常我会简单地使用kill -HUP master-pid,只要目录保持不变,一切都会正常工作。但是当我第一次更改符号链接然后重新加载代码时,代码仍然通过其绝对路径从旧目录运行,就像 gunicorn 遵循符号链接并保存最终路径。 我像这样启动 gunicorn:gunicorn run:app -c gunicorn-config.py 在“当前”目录中,我的配置文件如下所示:

workers = 4
worker_class = 'gevent'
bind = '127.0.0.1:5000'
pidfile = '/var/run/gunicorn.pid'
debug = False
loglevel = 'debug'
errorlog = '/var/log/gunicorn-error.log'
daemon = True

gunicorn 有没有办法重新评估符号链接或只保存符号链接而不是完整路径?也许是某种on_startingon_reload 钩子?

Here's 一个我无法开始工作的解决方案,也许它提供了更多上下文。

【问题讨论】:

  • 你设法让它工作了吗?您提供的链接也已损坏。
  • @AJP:我将在下面添加我的解决方案作为回复 =)
  • 哦,链接对我有用,奇怪..
  • 嗯,它又开始工作了!感谢@moodh 的快速响应!

标签: python deployment reload symlink gunicorn


【解决方案1】:

我通过使用USR2 signal 来完成这项工作。 这是我的 init.d 文件,部署后我将运行 service gunicorn start_or_reload,它会根据新位置启动或正常重新加载代码。从技术上讲,它会在当前 master 中生成另一个 master,然后杀死旧的 worker 和 master,最后提升新生成的 master。我采用了这个解决方案,以便在杀死旧主人之前添加烟雾测试等。我希望这对某人有帮助!

#!/bin/sh
### BEGIN INIT INFO
# Provides:          thin
# Required-Start:    $local_fs $remote_fs
# Required-Stop:     $local_fs $remote_fs
# Default-Start:     2 3 4 5
# Default-Stop:      S 0 1 6
# Short-Description: thin initscript
# Description:       thin
### END INIT INFO

# Original author: Forrest Robertson

# Do NOT "set -e"

DEPLOY_PATH=/opt/project/current
PID_FOLDER=/var/run/gunicorn
PID_FILE=$PID_FOLDER/project.pid
OLD_PID_FILE=$PID_FOLDER/project.pid.oldbin

start() {
    cd $DEPLOY_PATH && gunicorn run:app -c gunicorn-config.py
}

stop() {
  if [ -f $PID_FILE ]
  then
    kill `cat $PID_FILE`
    rm $PID_FILE
  fi
}

reload() {
    kill -USR2 `cat $PID_FILE`
    sleep 1
    kill -QUIT `cat $OLD_PID_FILE`
    rm $OLD_PID_FILE
}

start_or_reload() {
    if [ -f $PID_FILE ]
    then
        reload
    else
        start
    fi
}

case "$1" in
    start)
        echo "Starting server..."
        start
    ;;
    reload)
        echo "Reloading server..."
        reload
    ;;
    stop)
        echo "Stopping server..."
        stop
    ;;
    restart)
        echo "Restarting server..."
        stop && sleep 1 && start
    ;;
    start_or_reload)
        echo 'Starting or reloading server...'
        start_or_reload
    ;;
    wup)
        echo "Increasing workers..."
        kill -TTIN `cat $PID_FILE`
    ;;
    wdown)
        echo "Decreasing workers..."
        kill kill -TTOU `cat $PID_FILE`
    ;;
    *)
        echo "Usage: $SCRIPT_NAME {start|reload|stop|restart|start_or_reload|wup|wdown}" >&2
        exit 3
    ;;
esac

:

【讨论】:

    猜你喜欢
    • 2021-09-24
    • 2011-12-31
    • 1970-01-01
    • 2013-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-25
    • 1970-01-01
    相关资源
    最近更新 更多