Djangoの導入:Nginx+Gunicorn+virtualenv+supervisor+PostgreSQL
12298 ワード
Djangoは最も人気のあるPythonベースのwebフレームワークの一つで、初心者の入門にもぴったりです.Djangoはテスト用の軽量レベルのserverを提供していますが、このserverは実際の本番環境の導入には使用できません.最初のDjangoの導入方法はApache+mod_をお勧めしますwsgi.現在に至るまで、djangoの導入方法もますます弾力性があり、有効になり、さらに複雑になってきました.次のチュートリアルでは、次のツールを使用する必要があります. Nginx Gunicorn virtualenv supervisor PostgreSQL
前期準備
root権限を持つserverが必要です.次のチュートリアルはDebian 7に基づいており、Ubuntuや他のDebianベースのリリース版にはすべて同じ手順が適用されます.
システムの更新
まず、システムが最新の状態にあることを確認します.
PostgreSQL
DebianベースのシステムにPostgreSQLをインストールするには、次のコマンドを実行するだけです.
インストールが完了したら、djangoアプリケーションのユーザーとデータベースを作成します.
実行アカウントの作成
万一、Webアプリケーションが攻撃された後に制御されない結果をもたらすことを避けるために、私たちは一般的に、Webアプリケーションのために権限が制限されたユーザーを作成して、このWebアプリケーションを実行します.例えば、ここではdjangoアプリケーションのために
virtualenv
VirtualenvはPython仮想環境管理のツールです.仮想環境とは、Webアプリケーションに必要なpython環境がシステムのpython環境から独立していることで、異なるアプリケーションで異なるバージョンのサードパーティライブラリを使用することができます.
次のコマンドでDebianにVirtualenvをインストールします.
Djangoアプリケーションのpython環境を作成
ここではdjangoアプリケーションを
仮想環境がアクティブになり、djangoをこの仮想環境にインストールできます.
djangoのインストールが完了したら、空のdjangoプロジェクトを作成します.
テストサーバを起動することで、すべてが正常かどうかをテストできます.
今あなたはhttp://example.com:8000訪問に来ました.
Django用のPostgreSQLの構成
Djangoのデフォルトの新しいエンジニアリングでは、SQLite 3がデータベースとして使用されています.このデータベースのパフォーマンスは、本番環境でのデータベースアプリケーションをサポートするのに十分ではありません.ここではPostgreSQLをDjangoプロジェクトのデータベースとして使用します.DjangoがPostgreSQLを使用できるようにするには、
そしてpipによって取り付けられた
Djangoのデータベース設定を次のように変更できます.
それからPostgresにDjango設定を適用します
Gunicorn
実際の本番環境ではDjangoの単一スレッド開発サーバは使用しません.ここではGunicornを使います.
pipでGuncornをインストールする
インストールが終わったらGuniornでDjangoを実行してみてください
上記のコマンドは簡単なテストですが、実際に本番環境でGuniornを使用するには、いくつかの構成を追加する必要があります.これらのプロファイルをbashスクリプトとしてbin/gunicorn_として保存します.start
このファイルを実行可能モードに変更
このスクリプトを実行してみましょう
上記の手順でカスタムパラメータを設定した場合は、
Supervisor
Superviosrはプロセス監督管理のツールです.簡単に言えば、Superviosrは、サーバの起動時にプログラムが自動的に起動し、プログラムが予期せぬ終了時に再起動することを保証します.次のコマンドでインストールできます.
Superviosrはプロファイルを通じて監督管理されるプログラムを設定します.一般プロファイルは、
他の設定を参考にすることができますが、上記の設定は一般的に十分であるはずです.
ログ・ファイルを手動で作成する必要があります.
上記のファイルを設定すると、
start、stop、restartのプロセスができます
Nginx
Nginxのインストールも簡単です.
サーバにアクセスします(http://example.com)Nginxのウェルカムページが見えるはず("Welcome to nginx")
Djangoの仮想サーバ構成を作成する
各Nginxの仮想serverは、
Djangoアプリケーションのプロファイル
このファイルを
その後nginxを再起動します
今からまたhttp://example.com見たのはnginxのウェルカムページではなくDjangoのウェルカムページだったはずです.
これで構成はすべて完了し、最終プロジェクトの構造全体は次のようになります.
あ、長いですね.やっと書き終わりました.問題があったらコメントにメッセージをください.
前期準備
root権限を持つserverが必要です.次のチュートリアルはDebian 7に基づいており、Ubuntuや他のDebianベースのリリース版にはすべて同じ手順が適用されます.
システムの更新
まず、システムが最新の状態にあることを確認します.
$ sudo aptitude update
$ sudo aptitude upgrade
PostgreSQL
DebianベースのシステムにPostgreSQLをインストールするには、次のコマンドを実行するだけです.
$ sudo aptitude install postgresql postgresql-contrib
インストールが完了したら、djangoアプリケーションのユーザーとデータベースを作成します.
$ sudo su - postgres
postgres@django:~$ createuser --interactive -P
Enter name of role to add: hello_django
Enter password for new role:
Enter it again: Shall the new role be a superuser? (y/n) n
Shall the new role be allowed to create databases? (y/n) n
Shall the new role be allowed to create more new roles? (y/n) n postgres@django:~$
postgres@django:~$ createdb --owner hello_django hello
postgres@django:~$ logout $
実行アカウントの作成
万一、Webアプリケーションが攻撃された後に制御されない結果をもたらすことを避けるために、私たちは一般的に、Webアプリケーションのために権限が制限されたユーザーを作成して、このWebアプリケーションを実行します.例えば、ここではdjangoアプリケーションのために
hello
というユーザーを作成し、webapps
というグループに分類します.$ sudo groupadd --system webapps
$ sudo useradd --system --gid webapps --shell /bin/bash --home /webapps/hello_django hello
virtualenv
VirtualenvはPython仮想環境管理のツールです.仮想環境とは、Webアプリケーションに必要なpython環境がシステムのpython環境から独立していることで、異なるアプリケーションで異なるバージョンのサードパーティライブラリを使用することができます.
次のコマンドでDebianにVirtualenvをインストールします.
$ sudo aptitude install python-virtualenv
Djangoアプリケーションのpython環境を作成
ここではdjangoアプリケーションを
/webapps
というパスの下に置きました./var/www
、srv
、または他のパスを好む場合は.まず、このディレクトリの下に/webapps/hello_django/
フォルダを作成してアプリケーションを格納し、このフォルダのownerを上に作成した実行アカウントhello
に設定します.$ sudo mkdir -p /webapps/hello_django/
$ sudo chown hello /webapps/hello_django/
hello
ユーザーに切り替えて仮想環境を作成$ sudo su - hello
hello@django:~$ cd /webapps/hello_django/
hello@django:~$ virtualenv .
New python executable in hello_django/bin/python
Installing distribute..............done.
Installing pip.....................done.
hello@django:~$ source bin/activate
(hello_django)hello@django:~$
仮想環境がアクティブになり、djangoをこの仮想環境にインストールできます.
Downloading/unpacking django
(...)
Installing collected packages: django
(...)
Successfully installed django
Cleaning up...
djangoのインストールが完了したら、空のdjangoプロジェクトを作成します.
(hello_django)hello@django:~$ django-admin.py startproject hello
テストサーバを起動することで、すべてが正常かどうかをテストできます.
(hello_django)hello@django:~$ cd hello
(hello_django)hello@django:~$ python manage.py runserver example.com:8000
Validating models...
0 errors found
June 09, 2013 - 06:12:00 Django version 1.5.1, using settings 'hello.settings'
Development server is running at http://example.com:8000/
Quit the server with CONTROL-C.
今あなたはhttp://example.com:8000訪問に来ました.
Django用のPostgreSQLの構成
Djangoのデフォルトの新しいエンジニアリングでは、SQLite 3がデータベースとして使用されています.このデータベースのパフォーマンスは、本番環境でのデータベースアプリケーションをサポートするのに十分ではありません.ここではPostgreSQLをDjangoプロジェクトのデータベースとして使用します.DjangoがPostgreSQLを使用できるようにするには、
psycopg2
を仮想環境にインストールする必要があります.まずこのパッケージの依存項目をインストールします. libpq-dev
そしてpipによって取り付けられた
psycopg2
(hello_django)hello@django:~$ pip install psycopg2
Djangoのデータベース設定を次のように変更できます.
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'hello',
'USER': 'hello_django',
'PASSWORD': 'Your password',
'HOST': 'localhost',
'PORT': '', # Set to empty string for default.
}
}
それからPostgresにDjango設定を適用します
(hello_django)hello@django:~$ python manage.py migrate
Gunicorn
実際の本番環境ではDjangoの単一スレッド開発サーバは使用しません.ここではGunicornを使います.
pipでGuncornをインストールする
(hello_django)hello@django:~$ pip install gunicorn
インストールが終わったらGuniornでDjangoを実行してみてください
(hello_django)hello@django:~$ gunicorn hello.wsgi:application --bind example.com:8001
上記のコマンドは簡単なテストですが、実際に本番環境でGuniornを使用するには、いくつかの構成を追加する必要があります.これらのプロファイルをbashスクリプトとしてbin/gunicorn_として保存します.start
#!/bin/bash
NAME="hello_app" # Name of the application
DJANGODIR=/webapps/hello_django/hello # Django project directory
SOCKFILE=/webapps/hello_django/run/gunicorn.sock # we will communicte using this unix socket
USER=hello # the user to run as
GROUP=webapps # the group to run as
NUM_WORKERS=3 # how many worker processes should Gunicorn spawn
DJANGO_SETTINGS_MODULE=hello.settings # which settings file should Django use
DJANGO_WSGI_MODULE=hello.wsgi # WSGI module name
echo "Starting $NAME as `whoami`"
# Activate the virtual environment
cd $DJANGODIR
source ../bin/activate
export DJANGO_SETTINGS_MODULE=$DJANGO_SETTINGS_MODULE
export PYTHONPATH=$DJANGODIR:$PYTHONPATH
# Create the run directory if it doesn't exist
RUNDIR=$(dirname $SOCKFILE)
test -d $RUNDIR || mkdir -p $RUNDIR
# Start your Django Unicorn
# Programs meant to be run under supervisor should not daemonize themselves (do not use --daemon)
exec ../bin/gunicorn ${DJANGO_WSGI_MODULE}:application \
--name $NAME \
--workers $NUM_WORKERS \
--user=$USER --group=$GROUP \
--bind=unix:$SOCKFILE \
--log-level=debug \
--log-file=-
このファイルを実行可能モードに変更
$ sudo chmod u+x bin/gunicorn_start
このスクリプトを実行してみましょう
$ sudo su - hello hello@django:~$ bin/gunicorn_start Starting hello_app as hello 2013-06-09 14:21:45 [10724] [INFO] Starting gunicorn 18.0 2013-06-09 14:21:45 [10724] [DEBUG] Arbiter booted 2013-06-09 14:21:45 [10724] [INFO] Listening at: unix:/webapps/hello_django/run/gunicorn.sock (10724) 2013-06-09 14:21:45 [10724] [INFO] Using worker: sync 2013-06-09 14:21:45 [10735] [INFO] Booting worker with pid: 10735 2013-06-09 14:21:45 [10736] [INFO] Booting worker with pid: 10736 2013-06-09 14:21:45 [10737] [INFO] Booting worker with pid: 10737 ^C (CONTROL-C to kill Gunicorn) 2013-06-09 14:21:48 [10736] [INFO] Worker exiting (pid: 10736) 2013-06-09 14:21:48 [10735] [INFO] Worker exiting (pid: 10735) 2013-06-09 14:21:48 [10724] [INFO] Handling signal: int 2013-06-09 14:21:48 [10737] [INFO] Worker exiting (pid: 10737) 2013-06-09 14:21:48 [10724] [INFO] Shutting down: Master $ exit
上記の手順でカスタムパラメータを設定した場合は、
gunicorn_start
スクリプトの対応するパラメータを変更する必要があります.このうちworkerの数は2*CPUS+1に設定することが推奨されており、これではいつでも半分のworkerがIOをしています.Supervisor
Superviosrはプロセス監督管理のツールです.簡単に言えば、Superviosrは、サーバの起動時にプログラムが自動的に起動し、プログラムが予期せぬ終了時に再起動することを保証します.次のコマンドでインストールできます.
sudo aptitude install supervisor
Superviosrはプロファイルを通じて監督管理されるプログラムを設定します.一般プロファイルは、
/etc/supervisor/conf.d
パスの下に配置されます.ここでは、以下の内容のhello.conf
というプロファイルを作成します.
[program:hello]
command = /webapps/hello_django/bin/gunicorn_start ; Command to start app
user = hello ; User to run as
stdout_logfile = /webapps/hello_django/logs/gunicorn_supervisor.log ; Where to write log messages
redirect_stderr = true ; Save stderr in the same log
environment=LANG=en_US.UTF-8,LC_ALL=en_US.UTF-8 ; Set UTF-8 as default encoding
他の設定を参考にすることができますが、上記の設定は一般的に十分であるはずです.
ログ・ファイルを手動で作成する必要があります.
hello@django:~$ mkdir -p /webapps/hello_django/logs/ hello@django:~$ touch /webapps/hello_django/logs/gunicorn_supervisor.log
上記のファイルを設定すると、
supervisorctl
ツールでこれらの設定を有効にできます.$ sudo supervisorctl reread
hello: available
$ sudo supervisorctl update
hello: added process group
start、stop、restartのプロセスができます
$ sudo supervisorctl status hello hello RUNNING pid 18020, uptime 0:00:50
$ sudo supervisorctl stop hello
hello: stopped
$ sudo supervisorctl start hello
hello: started
$ sudo supervisorctl restart hello
hello: stopped
hello: started
Nginx
Nginxのインストールも簡単です.
$ sudo aptitude install nginx
$ sudo service nginx start
サーバにアクセスします(http://example.com)Nginxのウェルカムページが見えるはず("Welcome to nginx")
Djangoの仮想サーバ構成を作成する
各Nginxの仮想serverは、
/etc/nginx/sites-available
パスの下にあるプロファイルで表されます.リンクされた/etc/nginx/sites-enabled
パスの下で、対応するサイトを有効にすることができます.Djangoアプリケーションのプロファイル
/etc/nginx/sites-available/hello
を作成します.ファイルの内容は次のとおりです.upstream hello_app_server {
# fail_timeout=0 means we always retry an upstream even if it failed
# to return a good HTTP response (in case the Unicorn master nukes a
# single worker for timing out).
server unix:/webapps/hello_django/run/gunicorn.sock fail_timeout=0;
}
server {
listen 80;
server_name example.com;
client_max_body_size 4G;
access_log /webapps/hello_django/logs/nginx-access.log;
error_log /webapps/hello_django/logs/nginx-error.log;
location /static/ {
alias /webapps/hello_django/static/;
}
location /media/ {
alias /webapps/hello_django/media/;
}
location / {
# an HTTP header important enough to have its own Wikipedia entry:
# http://en.wikipedia.org/wiki/X-Forwarded-For
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# enable this if and only if you use HTTPS, this helps Rack
# set the proper protocol for doing redirects:
# proxy_set_header X-Forwarded-Proto https;
# pass the Host: header from the client right along so redirects
# can be set properly within the Rack application
proxy_set_header Host $http_host;
# we don't want nginx trying to do something clever with
# redirects, we set the Host: header above already.
proxy_redirect off;
# set "proxy_buffering off" *only* for Rainbows! when doing
# Comet/long-poll stuff. It's also safe to set if you're
# using only serving fast clients with Unicorn + nginx.
# Otherwise you _want_ nginx to buffer responses to slow
# clients, really.
# proxy_buffering off;
# Try to serve static files from nginx, no point in making an
# *application* server like Unicorn/Rainbows! serve static files.
if (!-f $request_filename) {
proxy_pass http://hello_app_server;
break;
}
}
# Error pages
error_page 500 502 503 504 /500.html;
location = /500.html {
root /webapps/hello_django/static/;
}
}
このファイルを
site-enabled
フォルダにリンクします.$ sudo ln -s /etc/nginx/sites-available/hello /etc/nginx/sites-enabled/hello
その後nginxを再起動します
$ sudo service nginx restart
今からまたhttp://example.com見たのはnginxのウェルカムページではなくDjangoのウェルカムページだったはずです.
これで構成はすべて完了し、最終プロジェクトの構造全体は次のようになります.
/webapps/hello_django/
├── bin <= Directory created by virtualenv
│ ├── activate <= Environment activation script
│ ├── django-admin.py
│ ├── gunicorn
│ ├── gunicorn_django
│ ├── gunicorn_start <= Script to start application with Gunicorn
│ └── python
├── hello <= Django project directory, add this to PYTHONPATH
│ ├── manage.py
│ ├── project_application_1
│ ├── project_application_2
│ └── hello <= Project settings directory
│ ├── __init__.py
│ ├── settings.py <= hello.settings - settings module Gunicorn will use
│ ├── urls.py
│ └── wsgi.py <= hello.wsgi - WSGI module Gunicorn will use
├── include
│ └── python2.7 -> /usr/include/python2.7
├── lib
│ └── python2.7
├── lib64 -> /webapps/hello_django/lib
├── logs <= Application logs directory
│ ├── gunicorn_supervisor.log
│ ├── nginx-access.log
│ └── nginx-error.log
├── media <= User uploaded files folder
├── run
│ └── gunicorn.sock
└── static <= Collect and serve static files from here
あ、長いですね.やっと書き終わりました.問題があったらコメントにメッセージをください.