web-dev-qa-db-ja.com

ソース変更時のgunicorn自動リロード

最後に、開発環境をrunserverからgunicorn/nginxに移行しました。

Runserverの自動リロード機能をgunicornに複製すると、ソースが変更されたときにサーバーが自動的に再起動するので便利です。それ以外の場合は、kill -HUPを使用してサーバーを手動で再起動する必要があります。

手動での再起動を回避する方法はありますか?

104
Paolo

これは古い質問ですが、一貫性のためだけに-バージョン19.0からgunicornには --reload オプション。したがって、サードパーティ製のツールにこれ以上必要なものはありません。

204

1つのオプションは、 -max-requests を使用して、起動オプションに--max-requests 1を追加することにより、生成された各プロセスが1つの要求のみを処理するように制限することです。新しく生成されるプロセスはすべて、コードの変更を確認する必要があり、開発環境では、リクエストごとの余分な起動時間はごくわずかです。

20
Dave Forgac

Bryan Helmig これを思いつき、run_gunicorn直接gunicornを起動する代わりに、これらの3つのコマンドをDjangoプロジェクトのルートフォルダーがアクティブになっている)のシェルにカットアンドペーストできるようにします。

pip install watchdog -U
watchmedo Shell-command --patterns="*.py;*.html;*.css;*.js" --recursive --command='echo "${watch_src_path}" && kill -HUP `cat gunicorn.pid`' . &
python manage.py run_gunicorn 127.0.0.1:80 --pid=gunicorn.pid
10
hobs

私はgit Pushを使用して実稼働環境にデプロイし、gitフックをセットアップしてスクリプトを実行します。このアプローチの利点は、移行とパッケージのインストールを同時に実行できることです。 https://mikeeverhart.net/2013/01/using-git-to-deploy-code/

mkdir -p /home/git/project_name.git
cd /home/git/project_name.git
git init --bare

次に、スクリプトを作成します/home/git/project_name.git/hooks/post-receive

#!/bin/bash
GIT_WORK_TREE=/path/to/project git checkout -f
source /path/to/virtualenv/activate
pip install -r /path/to/project/requirements.txt
python /path/to/project/manage.py migrate
Sudo supervisorctl restart project_name

chmod u+x post-receive、およびユーザーをsudoersに追加します。 Sudo supervisorctlパスワードなし。 https://www.cyberciti.biz/faq/linux-unix-running-Sudo-command-without-a-password/

ローカル/開発サーバーから、git remote本番サーバーにプッシュすることができます

git remote add production ssh://user_name@production-server/home/git/project_name.git

# initial Push
git Push production +master:refs/heads/master

# subsequent Push
git Push production master

おまけとして、スクリプトの実行中にすべてのプロンプトが表示されます。そのため、移行/パッケージのインストール/スーパーバイザーの再起動に問題があるかどうかがわかります。

2
user3628119