DjangoとFastCGIの組み合わせ

7009 ワード


翻訳: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つのことをする必要があります.
  • FastCGIExternalServer directiveを使用してFastCGI serverの場所を示す
  • mod_を使用rewriteは、FastCGI上のURLs
  • を適切に示す
    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