2009-11-09 27 views
22

私のウェブサイトのコードを更新すると、変更が有効になるようにApacheのインスタンスを(自然に)再起動します。最初のページを高速化する

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

その後のリクエストでは0.5〜1.5秒しかかかりませんので、私はこの影響をユーザーに与えたくありません。

が再起動し、再起動スクリプトを書く

(xはApacheの私のhttp.confでServerLimitので定義されたインスタンスの数がある)wgetのX回を行うに比べてRAMにロードされたすべてのものを得るための良い方法はありますApacheを実行し、5回wgetを実行すると私にハックのようです。

ありがとうございます!

+4

実際に、Apacheを再起動し、 'wget'を5回実行する再起動スクリプトを書くことは、私にとって妥当なアプローチのようです。 –

+2

'wget'への呼び出しのそれぞれが別のプロセスによって処理されるように注意しなければならないかもしれませんが、確かめるためには十分な回数ロードする必要があります。 –

+1

私はそれをテストし、webfaction(アプリケーションがホストされている場所)でapache configを実行すると、インスタンスを循環するので、 'wget'がトリックを実行します。 – Jiaaro

答えて

31

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

とにかく良いオプションであるデーモンモードを、仮定、これはあなたのようなものだろう意味:あなたの代わりにタッチで、のみにチェックされているWSGIスクリプトファイルを、コード変更を行ったら

# 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> 

を次の要求ではなく、SIGINTシグナルをデーモンプロセスグループ内のプロセスに送信します。

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

kill -SIGINT pid 

実際のプロセスIDでスワップします。デーモンプロセスグループ内に複数のプロセスがある場合は、すべてのプロセスにシグナルを送信します。

「killall」を使用してこれを1ステップで実行できるかどうかはわかりません。 、缶特定のプロセスとして独立しWSGIImportScriptディレクティブを使用する必要はありません

# 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> 

:私はmod_wsgiのでのMacOS X上で

それをやっての問題点の構成を簡素にすることができ、代わりに使用することができ3.xは持っていましたグループ、アプリケーショングループをWSGIScriptAliasの引数として使用する代わりに、アプリケーションをプリロードするという副作用があります。

3

Django(mod_python vs mod_wsgi)はどうやって動いていますか?

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

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

ReloadingSourceCode

+0

私はなぜそれがアプリケーションをリロードしていないのだろうかと思っていた!私は再起動スクリプトをtouch wsgiスクリプトで置き換える必要があります:)私の最初の負荷問題は解決しますか?または私はまだwgetが必要ですか? – Jiaaro

+0

これは、最初のロードに費やされた時間を短縮しますが、それを排除するわけではありません。 –