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プロセスを完党に制埡でき、い぀でも停止、再起動、たたは蚭定を倉曎できたす。

本圓に興味深いのは、ほんの少しの調敎で十分であり、同じスタックを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で管理しおいたす。

Source: https://habr.com/ru/post/J85851/


All Articles