0

我正在构建一个 Django 应用程序,我决定研究 Fabric 以实现自动化部署。我已经让它大部分工作了,但在最后一步失败了,我似乎无法弄清楚为什么。

我正在使用 Nginx 和 Gunicorn 来为应用程序提供服务,并且我想在引入更改并更新数据库后杀死并重新启动 Gunicorn。不幸的是,它似乎总是在最后一关失败。

最后的命令没有响应任何类型的错误,但应用程序没有得到服务,如果我 SSH 没有它的进程,我必须手动重新启动它。每个其他命令都可以完美运行。

我的 fabfile.py:

#!/usr/bin/env python
from fabric.api import local, env, run
from fabric.context_managers import cd, prefix

env.hosts = ['192.168.1.1']
env.path = "/home/matthew/Sites/projectname"


def deploy():
    # Push changes to Bitbucket
    local('git push origin master')

    # Switch to project directory
    with cd(env.path):
        # Pull changes to server
        run('git pull origin master')

        # Activate virtualenv
        with prefix('source venv/bin/activate'):

            # Collect static files
            run('python manage.py collectstatic --noinput')

            # Sync and migrate the database
            run('python manage.py syncdb')
            run('python manage.py migrate')

            # Kill and restart Gunicorn
            run('killall gunicorn_django || true')
            run('gunicorn_django -D -c gunicorn.conf.py')

如果我删除 -D 标志使其不被守护,它可以工作并且我得到以下输出,但我必须使用 Ctrl-C 手动断开连接。如果我将 & 附加到末尾,它将停止工作:

[192.168.1.1] out: 2013-05-22 12:47:51 [60549] [INFO] Starting gunicorn 0.17.4
[192.168.1.1] out: 2013-05-22 12:47:51 [60549] [INFO] Listening at: http://127.0.0.1:8888 (60549)
[192.168.1.1] out: 2013-05-22 12:47:51 [60549] [INFO] Using worker: sync
[192.168.1.1] out: 2013-05-22 12:47:51 [60554] [INFO] Booting worker with pid: 60554
[192.168.1.1] out: 2013-05-22 12:47:51 [60555] [INFO] Booting worker with pid: 60555
[192.168.1.1] out: 2013-05-22 12:47:51 [60556] [INFO] Booting worker with pid: 60556
[192.168.1.1] out: 

谁能看到我误入歧途的地方?

4

2 回答 2

2

从来没有像这样解决这个问题,但我终于弯下腰拿起了Supervisor。事实证明,Supervisor 使用起来非常简单,多亏了这篇博文,我能够很快地把它弄明白。只是想我会发布这个,以防其他人遇到同样的问题并偶然发现这个页面。

于 2013-06-12T12:11:34.373 回答
0

我也面临这个问题。我在杀死和重新启动 gunicorn 进程之间等待了几秒钟,现在它似乎运行良好。

kill_running_gunicorn_process()
time.sleep(10)
start_gunicorn_process()
于 2013-12-16T20:22:26.990 回答