22

Webサイトのコードを更新するときは、(当然のことながら)apacheインスタンスを再起動して、変更を有効にします。

残念ながら、各apacheインスタンスによって提供される最初のページは、すべてを初めてRAMにロードする間は非常に遅くなります(この特定のサイトでは5〜7秒)。

後続のリクエストは0.5〜1.5秒しかかからないので、ユーザーにとってこの影響を排除したいと思います。

wgetをx回実行するよりもすべてをRAMにロードするためのより良い方法はありますか(xは私のhttp.confでServerLimitによって定義されたapacheインスタンスの数です)

apacheを再起動してwgetを5回実行する再起動スクリプトを作成することは、私にはちょっとハッキーに思えます。

ありがとう!

4

2 に答える 2

32

Apache / mod_wsgiのデフォルトは、そのアプリケーションを必要とするプロセスへの最初のリクエストでのみアプリケーションコードをロードすることです。したがって、最初のステップは、最初のリクエストだけでなく、プロセスの開始時にコードをプリロードするようにmod_wsgiを構成することです。これは、WSGIImportScriptディレクティブを使用してmod_wsgi2.Xで実行できます。

とにかくより良いオプションであるデーモンモードを想定すると、これは次のようなものになることを意味します。

# Define process group.

WSGIDaemonProcess django display-name=%{GROUP}

# Mount application.

WSGIScriptAlias / /usr/local/django/mysite/apache/django.wsgi

# Ensure application preloaded on process start. Must specify the
# process group and application group (Python interpreter) to use.

WSGIImportScript /usr/local/django/mysite/apache/django.wsgi \
  process-group=django application-group=%{GLOBAL}

<Directory /usr/local/django/mysite/apache>

    # Ensure application runs in same process group and application
    # group as was preloaded into on process start.

    WSGIProcessGroup django
    WSGIApplicationGroup %{GLOBAL}

    Order deny,allow
    Allow from all
</Directory>

コードを変更したら、次のリクエストでのみチェックされるWSGIスクリプトファイルに触れる代わりに、デーモンプロセスグループ内のプロセスにSIGINTシグナルを送信します。

WSGIDaemonProcessの「display-name」オプションを使用すると、BSDスタイルの「ps」プログラムを使用してどのプロセスを識別できます。'display-name'を'%{GROUP}'に設定すると、'ps'出力にプロセス名として'(wsgi:django)'が表示されます。プロセスIDを特定し、次のことを行います。

kill -SIGINT pid

'pid'を実際のプロセスIDと交換します。デーモンプロセスグループに複数のプロセスがある場合は、それらすべてにシグナルを送信します。

'killall'を使用してこれを1つのステップで実行できるかどうかはわかりません。MacOSXで問題が発生しました。

mod_wsgi 3.Xでは、設定が簡単になり、代わりに次のものを使用できます。

# Define process group.

WSGIDaemonProcess django display-name=%{GROUP}

# Mount application and designate which process group and
# application group (Python interpreter) to run it in. As
# process group and application group named, this will have
# side effect of preloading application on process start.

WSGIScriptAlias / /usr/local/django/mysite/apache/django.wsgi \
  process-group=django application-group=%{GLOBAL}

<Directory /usr/local/django/mysite/apache>
    Order deny,allow
    Allow from all
</Directory>

つまり、特定のプロセスグループとアプリケーショングループをWSGIScriptAliasの引数として使用できるように、個別のWSGIImportScriptディレクティブを使用する必要はなく、アプリケーションをプリロードするという副作用があります。

于 2009-11-09T22:18:59.603 に答える
3

Django (mod_python と mod_wsgi) をどのように実行していますか?

mod_wsgi を (デーモン モードで) 実行している場合、アプリケーションをリロードするために Apache を再起動する必要はありません。必要なのは、wsgi スクリプトの mtime を更新することだけです (これは で簡単に実行できますtouch)。

mod_wsgi のドキュメントには、プロセスのかなり完全な説明があります。

ソースコードの再読み込み

于 2009-11-09T17:47:43.060 に答える