Django Projectを開発サーバーの使い心地のままにApacheでデプロイする
ずーっと、デプロイが苦手だった。
自分でやると全然動いた事が無い。
でも気づけば、いつの間にか出来る様になってた。
今後忘れてしまわないようにメモ。
昨日作った環境でデプロイを行う。
機能的なところ
下準備
作成したDjangoのプロジェクトは「djangoProject」
- /var/www内に、プロジェクトと.wsgiファイルを公開するディレクトリ(django)を作成する。
- プロジェクトのソースを展開する(実際はローカルリポからのリンク)
- /var/www/django/djangoProject
- アプリケーション名は以下の通り
- djangoProject.core
- wsgiの自動再起動用のスクリプトをプロジェクト内に作成する。
- http://code.google.com/p/modwsgi/wiki/ReloadingSourceCode#Monitoring_For_Code_Changes
- 上記URLにのっているコードをmonitor.pyと言う名前で、coreアプリ内に保存する
apacheの設定
設定先は、/etc/apache2/conf.d/と/var/www/ の二ヶ所
それぞれにファイルを一つずつ作成する。
- /etc/apache2/conf.d/djangoProject.conf
WSGIScriptAlias / /var/www/django/djangoProject.wsgi
Order deny,allow
Allow from all
Alias /static "/var/www/django/djangoProject/static"
Order deny,allow
Allow from all
Alias /media "/usr/local/lib/python2.6/dist-packages/Django-1.1-py2.6.egg/django/contrib/admin/media"
Options All
AllowOverride All
Allow from All
- /var/www/django/djangoProject.wsgi
import os, sys
sys.path.append('/var/www/django')
os.environ['DJANGO_SETTINGS_MODULE'] = 'djangoProject.settings'from djangoProject.core import monitor
monitor.start(interval=3.0)import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()
Path通さないとmonitor.pyがインポート出来なかった。
ファイルの更新チェックは3秒毎にしているけど、0.1秒とかにも出来るはず
ベンチしてみた
id:everesさんに「普通にデプロイしな」と言われたのですが、上のやり方で普通にデプロイになるのでしょうか?心配。
とりあえづ、努力は酬われるのか開発サーバとApache+mod_wsgiを比較してみた。
- ab -n 1000 http://127.0.0.1/get/csv
serv | requests | concurrensy | [#/sec] |
manage.py | 1000 | 指定無 | 631.67 |
apache | 1000 | 指定無 | 617.97 |
あんまり速くなってないよぅ、っていうかむしろ遅い・・
悲しすぎる。
以前は、concurrensy増やすと全然ダメダメになっていったので -c付きでテスト続行
- ab -n 1000 -c 40 http://127.0.0.1/get/csv
serv | requests | concurrensy | [#/sec] |
manage.py | 1000 | 50 | 345.38 |
apache | 1000 | 50 | 598.64 |
Apacheの方は、あんまり性能落ちてない。素晴らしい。テスト毎に多少のバラツキはあるけど安定している。
開発サバの方は、テスト毎に性能のバラツキが多すぎる。回によっては、エラー多すぎでabが途中でテスト止めたりする。さらに一回不調になると、その後しばらく不調が続いたりして、開発サーバ再起動しないと調子が戻らなかったりする。
使わない手はないな>apache + mod_wsgi + 自動リロード
わかんなくても、同じ亊何回もやってるといつの間にか理解できた気がするのはなんでだろう?問題があったら、とりあえづ、tailコマンドに-fつけて
# tail -f /var/log/apache2/error.log
このやり方を見つけてからの手返しの早さは異常。
apacheにデプロイしても自動で再起動してくれるなら、もう開発サーバいらないんじゃないかと思う。