DjangoとFastCGIの組み合わせ
翻訳:merlin
How to use Django with FastCGI
現在推奨されているDjangoの実行方法はApacheを使用してmod_を追加することですがpythonですが、shared hostingを使う人が多いので、FastCGIしか使えません.場合によっては、FastCGIのセキュリティが向上し、mod_よりも優れている可能性があります.pythonはパフォーマンスが向上します.
本質的には,FastCGIはウェブサーバ以外の独立したプログラムにページを提供させる方法である.Webサーバは,受けたウェブリクエストをsocketを介してFastCGIに委任し,後者はコードを実行して結果をウェブサーバに返し,サーバは結果をユーザのブラウザに返す.mod_のようにpythonと同様にFastCGIもコードをメモリにロードし、リクエストに応答したときに起動遅延がないようにします.でもmod_とpython(またはmod_perl)が異なるのは、FastCGIプロセスがwebサーバ内で実行されるのではなく、独立したプロセスであることです.
どうして一人で遊ぶの?
Apacheクラシックmod_*パラメータは、PHP、Python、Perlなど、さまざまなスクリプトサポートを内蔵するために使用されますが、これらはWebサーバのプロセススペース内にあります.これにより、起動時間が短縮されます.コード処理はI/O操作を必要としませんが、メモリが消費されます.mod_でpythonの場合、apacheプロセスごとに独自のpython解釈器があり、メモリが大量に消費されます.
FastCGIの天性に応じて、Webサーバアカウント以外のユーザープロセスを実行することもできます.これは、コードを他のユーザーから隔離できるため、追加のセキュリティメリットをもたらします.
前提条件:flup DjangoとFastCGIを組み合わせる前にflupをインストールする必要があります.これはFastCGIを処理するpythonライブラリです.最新のSVNバージョンが使用されていることを確認してください:-)
FastCGIサーバを起動
FastCGIはclient-serverモードで動作し、ほとんどの場合、FastCGIプロセスを自分で開始します.あなたのWebサーバ(apache、lighttpd、または他のもの)は、ダイナミックページをロードする必要がある場合にのみ、Django-FastCGIプロセスに連絡します.メモリに待機しているため、応答の処理速度は非常に速い.
に注意
共有ホストシステムで遊んでいる場合は、FastCGIプロセスをwebサーバで管理するように強制される可能性があります.下を見て、このような状況をどう処理するか.Webサーバには、Unixドメインソケット(windowsでは名前付きパイプ)を使用するか、TCPソケットを直接使用するかの2つの方法があります.どちらがいいかは個人の好みにかかっています.ただし、権限を考慮すると、TCPソケットの方が簡単です.
サーバーを起動する前に、プロジェクトディレクトリの下(manage.pyファイルがあるディレクトリ)に移動し、実行します.
./manage.py runfcgi [options]
もちろんhelpオプションでヘルプ情報を見ることができます.もちろん、socketまたはホストプラスポートを指定する必要があります.Webサーバを設定してFastCGIサーバの起動を完了します.例を次に示します.
指定したTCPポートでthreadedサーバを実行します:./manage.py runfcgi method=threaded host=127.0.0.1 port=3033指定したUnixドメインソケット上でpreforkedサーバを実行:./manage.py runfcgi method=prefork socket=/home/user/mysite.sock pidfile=django.pid
非daemon方式でプロセスを実行する(デバッグが容易):./manage.py runfcgi daemonize=false socket=/tmp/mysite.sock
FastCGI daemonの終了:フロントで実行する場合は、明らかに簡単です:直接Ctrl-C之;バックグラウンドなら、kill之も明らかだ.
起動時にpidfileオプションを指定した場合、kill`cat$PIDFILE`
次のshellスクリプトはFastCGIを簡単に再起動できます.
#!/bin/bash
# Replace these three settings.
PROJDIR="/home/user/myproject"
PIDFILE="$PROJDIR/mysite.pid"
SOCKET="$PROJDIR/mysite.sock"
cd $PROJDIR
if [ -f $PIDFILE ]; then
kill `cat -- $PIDFILE`
rm -f -- $PIDFILE
fi
exec /usr/bin/env - /
PYTHONPATH="../python:.." /
./manage.py runfcgi socket=$SOCKET pidfile=$PIDFILE
Apacheの構成
もちろんmod_を構成する必要がありますfastcgiのapache.ここでは、apacheの関連ドキュメントを参照してください.httpdを編集します.confファイルは、apacheがDjangoのFastCGIインスタンスを指すように、次の2つのことをする必要があります.
FastCGIサーバの場所の指定について:
FastCGIExternalServer directiveは、ApacheにFastCGI serverを見つける方法を教えてくれます.ここでFastCGIExternalServer docsでは、ソケットまたはホストを指定することができます.いくつかの例を示します.
# socket / named pipe Connect to FastCGI
FastCGIExternalServer /home/user/public_html/mysite.fcgi -socket /home/user/mysite.sock
# TCP host/port FastCGI
FastCGIExternalServer /home/user/public_html/mysite.fcgi -host 127.0.0.1:3033
いずれの場合も/home/user/public_html/mysite.fcgiというファイルは存在する必要はありません.これはWebサーバ内部で使用されているURLにすぎません.FastCGIがどのURLを処理しなければならないかを示すフックです(以下詳しく説明します).
mod_でrewriteはFastCGI上のURLsを示す
第2のステップは、apacheに、特定のパターンに一致するURLsがFastCGIに渡されるべきであることを知らせることである.そのためにmod_を使用するrewriteモジュールはURLsをmysiteに書き換える.fcgi(または、前のセクションで説明したように、FastCGIExternalServer directiveで指定したもの).
次の例では、apacheに、ファイル以外のすべてのアクセスに対して/media/ヘッダの要求を行わずにFastCGIに処理させるように伝えます.Djangoでadminというfeatureを使用すると、これは最も一般的な状況かもしれません.
ServerName example.com DocumentRoot/home/user/public_html Alias/media/home/user/python/django/contrib/admin/media RewriteEngine On RewriteRule ^/(media.*)$/$1 [QSA,L] RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^/(.*)$/mysite.fcgi/$1 [QSA,L]
Lighttpd構成
Lighttpdは軽量級のウェブサーバであり、通常は静的ファイルにアクセスするために使用されます.FastCGIは生まれながらにしてサポートされているので、apacheに特に要求がなければ、静的ページでも動的ページでも良い選択です.mod_を確認fastcgiはmod_にインストールされていますrewriteとmod_アクセスの後のどこかですがmod_アクセスログの後.modが必要かもしれませんaliasはadmin mediaをサポートします.
ライトtpdプロファイルに次の項目を追加します.
server.document-root = "/home/user/public_html"fastcgi.server = ( "/mysite.fcgi"=> ( "main"=> ( # Use host/port instead of socket for TCP fastcgi # "host"=> "127.0.0.1", # "port"=> 3033, "socket"=> "/home/user/mysite.sock", "check-local"=> "disable", ) ),)alias.url = ( "/media/"=> "/home/user/django/contrib/admin/media/",)url.rewrite-once = ( "^(/media.*)$"=> "$1", "^/favicon/.ico$"=> "/media/favicon.ico", "^(/.*)$"=> "/mysite.fcgi$1",)
1つのLighttpdで複数のDjangoサイトを実行します.
Lighttpdは、ホストレベルのカスタム構成をサポートするために「conditional configuration」を使用します.複数のFastCGIサイトを構成するには、FastCGIプロファイルに各サイトに次のconditional blockを追加します.
# If the hostname is 'www.example1.com'... $HTTP["host"] == "www.example1.com"{ server.document-root = "/foo/site1" fastcgi.server = ( ... ) ... } # If the hostname is 'www.example2.com'... $HTTP["host"] == "www.example2.com"{ server.document-root = "/foo/site2" fastcgi.server = ( ... ) ... }
fastcgiでもserver directiveでは、同じサイト上の複数のDjangoインストールをサポートするために複数のentryを指定し、DjangoごとにFAstCGIホストを追加します.
Apacheの共有ホストでDjangoを実行します.
一般的に、共有ホストの所有者は、自分のサーバプロセスを実行することを許可しません.httpdを編集することも許可しません.confプロファイル.この場合、Webサーバ-spawned processesに対してDjangoを実行することができます.
注意事項
Webサーバ-spawned processesの場合、FastCGIサーバを自分で起動する必要はありません.Apacheは状況に応じて多くのプロセスを誘導して需要を満たす.
Webルートの下にファイルを追加します.htaccess
AddHandler fastcgi-script .fcgi
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ mysite.fcgi/$1 [QSA,L]
それから、ApacheにFastCGIプログラムをどのようにspawnするかを教える小さなスクリプトを作成します.mysiteを作成します.fcgiファイルをWebディレクトリの下に配置し、実行権限があることを確認します.
#!/usr/bin/python
import sys, os
# Add a custom Python path.
sys.path.insert(0, "/home/user/python")
# Switch to the directory of your project. (Optional.)
# os.chdir("/home/user/myproject")
# Set the DJANGO_SETTINGS_MODULE environment variable.
os.environ['DJANGO_SETTINGS_MODULE'] = "myproject.settings"
from django.core.servers.fastcgi import runfastcgi
runfastcgi(method="threaded", daemonize="false")
spawned serverの再起動
pythonコードを変更した場合は、FastCGIがコードを動かしたことを伝える必要があります.しかしapacheをやり直す必要はありません.逆にmysiteをアップロードするだけですfcgiファイル、または編集して、このファイルのタイムスタンプを変更します.このようにapacheがこのファイルが更新されたのを見たら、彼は自分からDjangoプログラムをやり直します.
Unixシステムでshellを遊ぶ権限があれば、次の簡単なtouchコマンドでできます.touch mysite.fcgi