FastCGIを使用してDjangoサイトを展開する

翻訳者から



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サーバーを起動するときにどのオプションを使用するかを決めましょう。



最初に行う選択は、使用する並列化方法です。



メモリサイズが小さいサーバーがあるため、FastCGIに興味があると仮定します。 preforkメソッドはより多くのメモリを使用するため、スレッド化されたメソッドを選択します。



ここで、負荷がかかった状態での操作方法をサーバーに伝えるいくつかのオプションを選択します。



サーバーは265 MBのメモリを備えた小さなVPSで実行されるため、非常に控えめな設定を選択します。

minspare



minspare



場合は4、 maxspare



場合は6、 maxchildren



500。



最後に、最後のいくつかの設定を選択します。



選択が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プロセスを完全に制御でき、いつでも停止、再起動、または設定を変更できます。



本当に興味深いのは、ほんの少しの調整で十分であり、同じスタックをgunicornspawning 、またはpasteに基づくソリューションに使用できることです。 fastcgi_passを使用する代わりに、proxy_passを使用できます。 それでも、デーモンツールを使用してプロセスを実行し、制御し続けることができます。 この記事のほぼすべてのステップは同じままです。

これは、Apache / mod_wsgiから頻繁に課されるスタックに対する非常に実行可能な代替手段であり、この記事を読んだ後、より多くの人々がそれを自分のWebサイトをdjangoにデプロイする方法と見なすことを願っています



記事の著者について



Eric Florenzanoはソフトウェア開発者です。 彼は現在サンフランシスコに住んでいて、Mochi Mediaで働いています。 現時点では、彼は数年にわたってDjangoとPinaxのコミュニティに参加しています。 彼は現在、Django Doseの共同設立者であり、Djangoに関連するすべてのことについてポッドキャストしています。 時々、彼はpython、非リレーショナルデータベース、その他の興味深いトピックに関するブログをwww.eflorenzano.com管理しています。



All Articles