サーバー

注釈

デプロイの考え方 (アーキテクチャー) は何が必要かとサイトのトラフィックに広く依存します。下記のセットアップについての記述は、最低限の設定であり、大体のインスタンスではうまく動きます。

我々は、フロントエンドプロキシ 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 にアクセスできない場合の選択肢です。