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ベースのリリース版にはすべて同じ手順が適用されます.
    システムの更新
    まず、システムが最新の状態にあることを確認します.
    $ 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/wwwsrv、または他のパスを好む場合は.まず、このディレクトリの下に/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
    

    あ、長いですね.やっと書き終わりました.問題があったらコメントにメッセージをください.