当前位置:  开发笔记 > 编程语言 > 正文

如何优雅地重启django在nginx后面运行fcgi?

如何解决《如何优雅地重启django在nginx后面运行fcgi?》经验,为你挑选了3个好方法。

我正在使用fcgi(通过使用manage.py runfcgi命令)在nginx后面运行一个django实例.由于代码被加载到内存中,因此无法在不杀死并重新启动django fcgi进程的情况下重新加载新代码,从而中断了实时网站.重启本身非常快.但是通过首先杀死fcgi进程,一些用户的操作将被中断,这是不好的.我想知道如何在不造成任何中断的情况下重新加载新代码.建议将受到高度赞赏!



1> Martin v. Lö..:

我会在新端口上启动一个新的fcgi进程,更改nginx配置以使用新端口,有nginx重新加载配置(这本身就是优雅的),然后最终停止旧进程(你可以使用netstat找出何时最后一次连接旧端口已关闭).

或者,您可以更改fcgi实现以分叉新进程,关闭子进程中除fcgi服务器套接字之外的所有套接字,关闭父进程中的fcgi服务器套接字,在子进程中执行新的django进程(使其使用fcgi服务器)套接字),并在关闭所有fcgi连接后终止父进程.IOW,为runfcgi实现优雅重启.



2> sheats..:

所以我继续执行马丁的建议.这是我想出的bash脚本.

pid_file=/path/to/pidfile
port_file=/path/to/port_file
old_pid=`cat $pid_file`

if [[ -f $port_file ]]; then
    last_port=`cat $port_file`
    port_to_use=$(($last_port + 1))
else
    port_to_use=8000
fi

# Reset so me don't go up forever
if [[ $port_to_use -gt 8999 ]]; then
    port_to_use=8000
fi

sed -i "s/$old_port/$port_to_use/g" /path/to/nginx.conf

python manage.py runfcgi host=127.0.0.1 port=$port_to_use maxchildren=5 maxspare=5 minspare=2 method=prefork pidfile=$pid_file

echo $port_to_use > $port_file

kill -HUP `cat /var/run/nginx.pid`

echo "Sleeping for 5 seconds"
sleep 5s

echo "Killing old processes on $last_port, pid $old_pid"
kill $old_pid



3> Marcin Kaszy..:

我在寻找这个问题的解决方案时遇到了这个页面.其他一切都失败了,所以我查看了源代码:)

解决方案似乎更简单.Django fcgi服务器使用flup,它以正确的方式处理HUP信号:它正常关闭.所以你要做的就是:

    将HUP信号发送到fcgi服务器(runserver的pidfile =参数会派上用场)

    等一下(flup允许孩子进行10秒钟,所以再等几个; 15看起来像个好号码)

    将KILL信号发送到fcgi服务器,以防有什么东西阻止它

    再次启动服务器

而已.

推荐阅读
贾志军
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有