サーバー¶
注釈
デプロイの考え方 (アーキテクチャー) は何が必要かとサイトのトラフィックに広く依存します。下記のセットアップについての記述は、最低限の設定であり、大体のインスタンスではうまく動きます。
我々は、フロントエンドプロキシ Nginx の裏で gunicorn または uWSGI を経由して、PostgreSQL データベースバックエンドと一緒に Ubuntu Linux 上で Django を動かします。便宜上、ここでは Gunicorn/Nginx のみ取り扱います。
Nginx¶
Nginx はそのスピード、安定性、少ないリソース・フットプリントから優秀なフロントエンドサーバーを形成します。サイトのためのよくある Nginx の設定は次のようになります:
# Gunicorn サーバー
upstream django {
server domain.com:9000;
}
# www サブドメイン上のの全てのリクエストをルートドメインにリダイレクト
server {
listen 80;
server_name www.domain.com;
rewrite ^/(.*) http://domain.com/$1 permanent;
}
# 静的ファイルを送出し、その他のリクエストは Apache へリダイレクト
server {
listen 80;
server_name domain.com;
root /var/www/domain.com/;
access_log /var/log/nginx/domain.com.access.log;
error_log /var/log/nginx/domain.com.error.log;
# 外部からのリクエストで /var/www/domain/ にファイルが存在するかチェック
# もし存在しなければ、Gunicorn/Django へ中継 (proxy) する
try_files $uri @django;
# Django のリクエストの名前付きロケーションのセットアップと、中継 (proxy) の処理の詳細
location @django {
proxy_pass http://django;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
それは何をしますか ?
最初のブロックは Nginx に我々の Django サイトをホスティングするサーバーをどこに探せば良いか知らせます。二番目のブロックは www.domain.com
に来るどんなリクエストも domain.com
にリダイレクトさせます。従って、各リソースは、canonical URL をただ1つ持つことになります。最後のセクションは、全ての処理についてのものです。この記述は、 /var/www/domain
内のファイルにリクエストがマッチするかを Nginx にチェックさせます。もしマッチすれば、ファイルが送出され、もしマッチしなければ、 Django サイトへリクエストを中継します。
SSL¶
フロントエンドサーバーを走らせる、その他の恩恵としては、SSL のターミネーションです。 SSL アクセスと 非 SSL アクセスで走らせる Django インスタンスを 2 つ持つよりも、 localhost
上でリッスンしている単一の非 SSL の WSGI インスタンスに、全てのリクエストをリダイレクトして返すゲートキーパーとして振る舞う Nginx を選択します。ここにどのようなものになるかを記載します:
server {
listen 67.207.128.83:443; # あなたの使う ip アドレスに置き換えてください
server_name domain.com;
root /var/www/domain.com/;
access_log /var/log/nginx/domain.com.access.log;
ssl on;
ssl_certificate /etc/nginx/ssl/certs/domain.com.crt;
ssl_certificate_key /etc/nginx/ssl/private/domain.com.key;
ssl_prefer_server_ciphers on;
# 外部からのリクエストで /var/www/domain/ にファイルが存在するかチェック
# もし存在しなければ、Gunicorn/Django へ中継 (proxy) する
try_files $uri @django;
# Django のリクエストの名前付きロケーションのセットアップと、中継 (proxy) の処理の詳細
location @django {
proxy_pass http://django;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Protocol ssl;
}
}
非 SSL 設定ファイルの末尾に、このコードを入れることもできます。
Gunicorn¶
Gunicorn は軽量 WSGI サーバーです。これは高トラフィックスサイト用にも小さなデプロイからスケールすることができます。 pip install gunicorn
からインストールできます。 Nginx は HTTP(S) でリッスンするので、 Gunicorn には違うポートをバインドする必要があるでしょう。 その状態でなら、あなたは localhost
への応答だけを教えてあげるだけです。単純な gunicorn プロセスは次のようになります:
$ gunicorn --workers=4 --bind=127.0.0.1:9000 my_project.wsgi:application
これは gunicorn のプロセスを、 http://127.0.0.1:9000 でリッスンする 4 つの worker で生成します。 もしあなたのプロジェクトにまだ wsgi.py
ファイルがなければ、そのファイルを加えたいと思うでしょう。 the Django WSGI docs または django-layout を例として参照してください。
プロセス・マネジメント¶
あなたは gunicorn が常に走っていて、サーバーの再起動時にも自動的に立ち上がることを確かなものにしたいでしょう。 もし Ubuntu にデプロイするなら、 upstart
はおそらく、その最初として最も簡単な方法です。ここにサンプルの設定を記載します:
# ログは /var/log/upstart/my_project.log へ
description "my_project"
start on startup
stop on shutdown
respawn
# virtualenv パスから起動する
exec /opt/webapps/my_project/bin/gunicorn -w 4 -b 127.0.0.1:9000 my_project.wsgi:application
setuid www-data
これをファイルとして /etc/init/gunicorn.conf
に保存し sudo start gunicorn
を実行してください。 トラブルシューティングのために、 あなたのログは /var/log/upstart/gunicorn.log
で見れるようになっていると思います。
注釈
Supervisor は、 Python のみで書かれていて、もしあなたが upstart
にアクセスできない場合の選択肢です。