When it’s ready.

出来るまで出来ない

Django Projectを開発サーバーの使い心地のままにApacheでデプロイする

ずーっと、デプロイが苦手だった。
自分でやると全然動いた事が無い。
でも気づけば、いつの間にか出来る様になってた。
今後忘れてしまわないようにメモ。
昨日作った環境でデプロイを行う。

機能的なところ

  • 作成したプロジェクトがきちんと動く事
  • 自動作成されたAdminサイトのデザインもきちんと動く事
  • 静的ファイルはApacheより配信する事
  • ソースを変更した際には、自動でapacheを再起動する事

下準備

作成したDjangoのプロジェクトは「djangoProject」

  • /var/www内に、プロジェクトと.wsgiファイルを公開するディレクトリ(django)を作成する。
  • プロジェクトのソースを展開する(実際はローカルリポからのリンク)
    • /var/www/django/djangoProject
  • アプリケーション名は以下の通り
    • djangoProject.core
  • wsgiの自動再起動用のスクリプトをプロジェクト内に作成する。

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を比較してみた。

serv requests concurrensy [#/sec]
manage.py 1000 指定無 631.67
apache 1000 指定無 617.97

あんまり速くなってないよぅ、っていうかむしろ遅い・・
悲しすぎる。
以前は、concurrensy増やすと全然ダメダメになっていったので -c付きでテスト続行

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にデプロイしても自動で再起動してくれるなら、もう開発サーバいらないんじゃないかと思う。

問題とか気づいた亊など

  1. print が入ってると怒られるのでそこが若干面倒くさい。loggingモジュールを積極的に使っていきたい。
  2. DBは、sqlite使ってるせいなのか、パーミッションで怒られた > apacheを自分で起動するように書き換えた(多分やっちゃいけないんだろうなぁ・・)
  3. ADMIN_MEDIAの持ってき方がこんな直接的な指定の仕方でいいのかな?
  4. NGINXの方が設定楽そうなんですけど・・・
  5. memcachedも併せて起動等管理したいけど、やり方分からず