3

私のコードは/home/ubuntu/apiリモートサーバーにあります。WSGI オブジェクトは名前が付けられapp、 に存在し/home/ubuntu/api/api.pyます。私の gunicorn conf ファイルが呼び出され、そこgunicorn.conf.pyに存在します。/home/ubuntu/api

私のgunicorn.conf.py

import multiprocessing

bind = "127.0.0.1:8000"
workers = multiprocessing.cpu_count() * 2 + 1
backlog = 2048
worker_class = 'gevent'
daemon = True
debug = True
loglevel = 'debug'
accesslog = '/mnt/log/gunicorn_access.log'
errorlog = '/mnt/log/gunicorn_error.log'
max_requests = 1000
graceful_timeout = 20

ファブリックを介してリモートでサーバー上で gunicorn を起動しようとしています。私のファブリックコードは次のようになります

@roles('stag_api')
def run_server():
    with cd('/home/ubuntu/api'):
        sudo('gunicorn -c gunicorn.conf.py api:app')

現在、ファブリックにはエラーは表示されませんが、ガンコーンは起動しません。

だから私はそれをパッケージにするために作成__init__.pyしました。/home/ubuntu/api私はこれを__init__.pyファイルに書きました

from api import app

appこれにより、パッケージの名前空間でWSGI を使用できるようになります。次に、ファブリックコードをこれに変更しました

@roles('stag_api')
def run_server():
    sudo('gunicorn -c /home/ubuntu/api/gunicorn.conf.py api:app')

現在でもファブリックにはエラーは表示されませんが、ガンコーンは起動しません。

だから私はと呼ばれるシェルスクリプトを作成し、serverそのコードは次のようになります

if [ "$1" = "start" ]; then
        echo 'starting'
        gunicorn -c /home/ubuntu/api/gunicorn.conf.py api:app
fi

if [ "$1" = "stop" ]; then
        echo 'stopping'
        pkill gunicorn
fi

if [ "$1" = "restart" ]; then
        echo 'restarting'
        pkill gunicorn
        gunicorn -c /home/ubuntu/api/gunicorn.conf.py api:app
fi

このシェルスクリプトを配置します/home/ubuntu/api

今私のファブリックコードはこのようになります

@roles('stag_api')
def stag_server(action='restart'):
    if action not in ['start', 'stop', 'restart']:
        print 'not a valid action. valid actions are start, stop and restart'
        return
    sudo('./server %s' % action)

ファブリックを介してサーバーを起動しようとすると、印刷startingされるため、シェル スクリプトが実行され、ifブロックに到達しますが、それでもファブリックを介してサーバーを起動できません。

しかし、サーバーに ssh して実行するとsudo ./server start、gunicorn が起動します。

誰かが私が間違っていることを説明できますか?

4

2 に答える 2

3

これは、次の 2 つの FAQ ポイントに関連している可能性が最も高いです。

http://www.fabfile.org/faq.html#init-scripts-don-t-work

http://www.fabfile.org/faq.html#why-can-ti-run-programs-in-the-background-with-it-makes-fabric-hang

于 2013-08-01T05:58:54.773 に答える
1

次のように pty False をグローバルに設定してみてください。

from fabric.api import env

env.always_use_pty = False

または、そのコマンドの pty False を次のように設定します。

run('run unicorn command etc...' pty=False)

以下の Init スクリプト セクションを参照してください。

http://www.fabfile.org/faq.html#init-scripts-don-t-work

于 2017-06-26T05:22:33.553 に答える