翻訳者から
Django Adventに関するこの記事を読んで、すでに間もなくリリースされたDjango 1.2のリリースに合わせて、それを翻訳することにしました。 さらに、記事のテキスト。
DjangoでWebサイトを開発するときは、コンソールを開いて次のように入力するだけです。
python manage.py runserver
この単純な管理コマンドを使用すると、サイトの管理メディアメディアが正しい方法でサポートされ、PYTHONPATHが正しく構成され、プロジェクトのルートフォルダーが含まれます。また、指定したポート(トランスレーターから:デフォルトではポート8000)で自動的に再ロードされたWebサーバーが起動します とても簡単!
Webサイトを戦闘サーバーに配置するときが来ると、人々が非常に失望することは驚くことではありません。このプロセスには非常に多くのステップがあり、すべてを学習してすべてを正しく実行することは困難です。 この複雑さがすべて、DjangoでのWebサイトの展開について多くの記事が書かれているという事実につながることは驚くことではありません。 しかし、これらの記事のほとんどすべては、Apacheとmod_wsgiまたはmod_pythonを使用したサイトのデプロイメントに焦点を当てています。
ただし、Apacheは理想的なソリューションではない場合があります。 VPSのメモリが256 MBしかない場合や、インストール中にApacheを構成する複雑さを避けたい場合があります。 または、Apacheが好きではないかもしれません。 これらのいずれの理由でも、 FastCGIに注意を向けることができます。
そもそも
展開を開始する前に、システムの基盤がインストールされていることを確認する必要があります。 まず、アプリケーションをデプロイするサーバーが必要です。 任意のサーバーとオペレーティングシステムを使用できますが、簡単にするためにUbuntu Linuxであると仮定します。
いくつかのコンパイラ、Pythonヘッダーファイル、およびsetuptoolsを含むシステムのベースをセットアップしましょう
sudo apt-get install build-essential python-dev python-setuptools
また、 NginxをWebサーバーとして配置します。 これは次のように実行できます。
sudo apt-get install nginx
Daemontoolsもインストールする必要があります-これは、サービスを管理するためのツールのコレクションです。 これらを使用して、サーバーエラーまたは再起動のイベントが発生した場合でも、サービスが実行され続けるようにします(または少なくとも元の状態に戻ります)。 daemontoolsをインストールするには:
sudo apt-get install daemontools
残念ながら、daemontoolsパッケージでは、再起動時に自動的に再起動するために少し余分な作業が必要です。 まず、次の内容で
/etc/event.d/svscanboot
ファイルを作成します。
start on runlevel 2
start on runlevel 3
start on runlevel 4
start on runlevel 5
stop on runlevel 0
stop on runlevel 1
stop on runlevel 6
respawn
exec /usr/bin/svscanboot
次に、次のコマンドを実行して
/etc/service
フォルダーを作成します。
sudo mkdir /etc/service
daemontools
、次のコマンドを実行して
daemontools
を実行します。
sudo initctl start svscanboot
サイトの新しいユーザーを作成します。
adduser mysite
ユーザーでsudoコマンドを使用する場合は、
/etc/sudoers
も編集する必要があり
/etc/sudoers
。 このファイルで行の
root ALL=(ALL) ALL
を見つけて、以下を追加します。
mysite ALL=(ALL) ALL
これで、ユーザーに切り替えることができます。
su - mysite
これで、システムの基礎が整いました。 データベース、メールサーバー、バージョン管理システム、memcached、およびその他のさまざまなサービスについては、個人的な好みによって大きく異なる可能性があるため、意図的に話しません。
Python用の仮想環境のセットアップ
システムの基礎が確立されたので、興味深いことに集中できます。 最初に、Python用のサンドボックスを作成するためのツールであるvirtualenvをインストールします。 virtualenvを使用して、アプリケーションのサンドボックスを作成します。
sudo easy_install virtualenv
virtualdevの最新のコピーを使用して、さらに進んで新しい仮想環境をセットアップできます。
mkdir ~/virtualenvs
virtualenv ~/virtualenvs/mysite
ホームフォルダーにvirtualenvsディレクトリを作成し、その中にmysiteという仮想環境を作成しました。 次に、それを使い始めてpipをインストールし、Pythonパッケージを簡単にインストールしましょう。
source ~/virtualenvs/mysite/bin/activate
easy_install pip
ここで、 Flupパッケージがインストールされていることを確認する必要があります。 これは、WSGIアプリケーションをFastCGIに変換するためのアダプターを含む、WCGIアプリケーションを操作するための有用なツールのセットです(SCGIとAJPの両方...しかし、これはこの記事の範囲外です)。 Djangoでは、runfcg制御コマンドを使用する前にFlupをインストールする必要があります。 pipを使用すると、簡単にインストールできます。
pip install flup
Pythonシステムパスに沿ってインストールされたデータベースアダプター、グラフィックライブラリ、またはXMLパーサーを使用する場合は、仮想環境からアクセスできることを確認する必要があります。 これを行うには、.pthファイルをsite-packages仮想環境のディレクトリに追加します。
echo "/usr/lib/python2.6/dist-packages/" > ~/virtualenvs/mysite/lib/python2.6/site-packages/fix.pth
次のステップは、Djangoコードをサーバーに複製することです(明らかに
git
は
mercurial, svn
または
rsync
置き換えることができます)。
git clone github.com/myusername/mysite.git
プロジェクトにpip要件ファイルがある場合、これを使用できます。
pip install -U -r mysite/requirements.txt
または、
requirements file
がない場合は、依存関係を手動でインストールでき
requirements file
。 例:
pip install -U Django simplejson python-memcached
FastCGIサーバーのオプションを選択する
わあ! 私たちはシステムをセットアップする上で長い道のりを歩んできましたが、FastCGIの部分についてはまだ話していません。 恐れてはいけません、私たちは今それをする準備ができています。 FastCGIサーバーを起動するときにどのオプションを使用するかを決めましょう。
最初に行う選択は、使用する並列化方法です。
- スレッド化:
すべてのHTTP要求に対して1つのプロセスでストリーミングサーバーを実行します。 これにより多くのメモリを節約できますが、すべてのスレッドで1つのグローバルインタープリターロック (GIL)の問題が発生します。 これは、CPU使用率が高いためにパフォーマンスが制限される可能性があることを意味します。 I / O操作はGILの外部で行われるため、I / Oの負荷が重い場合でもGILの問題は発生しません。 また、一部のpython拡張機能はスレッドセーフにすることを目的としていないため、この競合方法では使用できません。
- プリフォーク:
プロセスのプールを生成する分岐サーバーを実行します。各プロセスには、ジャングルとPythonの独自のコピーがメモリに読み込まれます。 これは、より多くのメモリが使用されることを意味しますが、GILまたはスレッドセーフに関する前述の問題はありません。
メモリサイズが小さいサーバーがあるため、FastCGIに興味があると仮定します。 preforkメソッドはより多くのメモリを使用するため、スレッド化されたメソッドを選択します。
ここで、負荷がかかった状態での操作方法をサーバーに伝えるいくつかのオプションを選択します。
- minspare:
サーバーが準備を整え、将来のリクエストを待機するプロセス/スレッドの最小数は?
- maxspare:
サーバーが準備を保ち、将来のリクエストを待機するプロセス/スレッドの最大数はいくつですか?
- maxrequests(preforkメソッドのみ):
強制終了して再起動するまでに各プロセスが処理するリクエストの数。 これが問題になるまでメモリリークを防ぐため。 このオプションを設定することをお勧めします。
- maxchildren(プリフォークメソッドのみ):
どの時点でいくつの子プロセスがリクエストをサポートできますか?
サーバーは265 MBのメモリを備えた小さなVPSで実行されるため、非常に控えめな設定を選択します。
minspare
、
minspare
場合は4、
maxspare
場合は6、
maxchildren
500。
最後に、最後のいくつかの設定を選択します。
- ホスト
着信接続をリッスンするホスト名(ホスト名)
- 港
どのポートで着信接続をリッスンしますか?
- pidfile
FastCGIサーバーが起動すると、プロセス識別子(プロセスID)でファイルが作成されます。 このプロセスIDは、メインスレッド/プロセスのpidです 。 これは、 SIGHUPなどのOS信号をサポートするプロセスです。 このオプションは、このファイルの場所を決定します。
選択が
runfcgi
、
runfcgi
コマンドを実行してサーバーを起動できます。
python manage.py runfcgi method=threaded host=127.0.0.1 port=8080 pidfile=mysite.pid minspare=4 maxspare=30 daemonize=false
daemonize=false
フラグが追加されて
daemonize=false
ことに注意してください。 常にインストールする必要があります(作成者によると、このオプションをスキップすると、runfcgiコマンドの計算が間違っています)。 また、このコマンドの結果としてプロジェクトディレクトリに
mysite.pid
ファイルが作成されるため、バージョン管理システムがこのファイルを無視することをお勧めします。
FastCGIサーバーが正しく実行されていることを確認したので、停止して次のステップに進みます
daemontools
を使用してこのコマンドを実行し、サーバーを常にバックグラウンドで実行し続けます。
DaemontoolsはFastCGIサーバーを実行します
Daemontoolsは/ etc / serviceディレクトリのすべてのサブディレクトリを検索し、それぞれのサブディレクトリでrunという実行可能ファイルを検索します。 彼がそのようなファイルを見つけた場合、彼はそれを開始し、彼が死ぬと再起動します。 それでは、mysiteディレクトリを作成しましょう。
sudo mkdir /etc/service/mysite
それでは、fastcgiサーバーを起動する小さなスクリプトを作成しましょう。 お気に入りのテキストエディタを使用して、このテキストを
/etc/service/mysite/run
に書き込み
/etc/service/mysite/run
。
#!/usr/bin/env bash
source /home/mysite/virtualenvs/mysite/bin/activate
cd /home/mysite/mysite
exec envuidgid mysite python manage.py runfcgi method=threaded host=127.0.0.1 port=8080 pidfile=mysite.pid minspare=4 maxspare=30 daemonize=false
ここには難しいことは何もありません。 まず、正しい仮想環境(virtualenv)にいることを確認してから、現在のディレクトリを
mysite
変更してから、
runfcgi
コマンドを実行します。
envuidgid mysite
は、次のコマンドが
root
ではなくユーザー
mysite
として実行されることを確認するだけです。
スクリプトはdaemontoolsが認識できるように実行可能である必要があるため、次のコマンドを実行してみましょう。
sudo chmod +x /etc/service/mysite/run
svstat
コマンドを使用して、実行されていることを確認できます。
sudo svstat /etc/service/mysite/
結果は次のようになります。
/etc/service/mysite/: up (pid 3610) 33 seconds
これは、プロセスが起動し、プロセスID = 3610が割り当てられ、33秒間機能したことを意味します。
svc
コマンドを使用して、プロセスを停止できます。
sudo svc -d /etc/service/mysite/
その後、svstatを再度実行すると、次のような結果が得られます。
/etc/service/mysite/: down 4 seconds, normally up
プロセスを取り戻すには、次のようにします。
sudo svc -u /etc/service/mysite/
svcコマンドの完全なリストはオンラインで見つけることができます -これは、
daemontools
さらに深く掘り下げる場合に非常に優れたソースです。
サーバーで動作するようにNginxを構成する
すでにフィニッシュラインに近づいています。 私たちがしなければならないことは、FastCGIサーバーと通信し、それから応答を受信し、ユーザーに送信するようにnginxを構成することです。
Ubuntuには便利な
/etc/nginx/fastcgi_params
ファイルが
/etc/nginx/fastcgi_params
ます。 残念ながら、それは完全に正しいわけではありません。 (エンコード)
SCRIPT_NAME
パラメーターをエンコードしますが、サーバーが実際に必要なのは
PATH_INFO
です。 以下の内容を検索して置き換えたり、
/etc/nginx/fastcgi_params
ファイルにコピーしたりできます。
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param PATH_INFO $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
次に、サイトの定義を作成します。 テキストエディターを使用して、次の内容のファイル
/etc/nginx/sites-available/mysite
を作成しましょう。
server {
listen 80;
server_name mysite.com www.mysite.com;
access_log /var/log/nginx/mysite.access.log;
location /media {
autoindex on;
index index.html;
root /home/mysite/mysite;
break;
}
location / {
include /etc/nginx/fastcgi_params;
fastcgi_pass 127.0.0.1:8080;
break;
}
}
彼は、ポート80(HTTPの標準)をリッスンすると言います
mysite.com http://www.mysite.com/
mysite.com http://www.mysite.com/
。
/home/mysite/mysite/media
リクエストは、
/home/mysite/mysite/media
ディレクトリのディスクから直ちに処理する必要があります。 そして最も重要なこと:他のすべてのリクエストはFastCGIを介してサーバーに送信されます。
次に、シンボリックリンクを介して接続しましょう。
sudo ln -s /etc/nginx/sites-available/mysite /etc/nginx/sites-enabled/mysite
最後に、nginxを再起動して、新しい設定を有効にします。
sudo /etc/init.d/nginx restart
おわりに
nginxを使用してメディアファイルを驚異的な速度で提供する最小限のサーバーと、中間層なしで動的リクエストを提供するクリーンなPython FastCGIサーバーをセットアップします。 daemontoolsを使用すると、FastCGIプロセスを完全に制御でき、いつでも停止、再起動、または設定を変更できます。
本当に興味深いのは、ほんの少しの調整で十分であり、同じスタックをgunicorn 、 spawning 、またはpasteに基づくソリューションに使用できることです。 fastcgi_passを使用する代わりに、proxy_passを使用できます。 それでも、デーモンツールを使用してプロセスを実行し、制御し続けることができます。 この記事のほぼすべてのステップは同じままです。
これは、Apache / mod_wsgiから頻繁に課されるスタックに対する非常に実行可能な代替手段であり、この記事を読んだ後、より多くの人々がそれを自分のWebサイトをdjangoにデプロイする方法と見なすことを願っています
記事の著者について
Eric Florenzanoはソフトウェア開発者です。 彼は現在サンフランシスコに住んでいて、Mochi Mediaで働いています。 現時点では、彼は数年にわたってDjangoとPinaxのコミュニティに参加しています。 彼は現在、Django Doseの共同設立者であり、Djangoに関連するすべてのことについてポッドキャストしています。 時々、彼はpython、非リレーショナルデータベース、その他の興味深いトピックに関するブログをwww.eflorenzano.comで管理しています。