2009-10-28 9 views
7

私はDjangoサイトを開発しています。私はライブサーバー上ですべての変更を行っています。それは簡単な方法だからです。問題は、今のところ、私が取り組んでいる* .pyファイルの1つをキャッシュするように思えることです。ときどきリフレッシュすると、古いバージョンのページと新しいバージョンの間で切り替わることがあります。Django + WSGI:最新の問題?

私のセットアップは、多かれ少なかれDjangoのチュートリアルで説明しているもののようである:それはWSGIハンドラの複数のインスタンスを発射だので、私はを推測しているhttp://docs.djangoproject.com/en/dev/howto/deployment/modwsgi/#howto-deployment-modwsgi

は、それがこれをやっているし、そのハンドラに応じて、 httpリクエストが送信されると、別のバージョンのページを受け取ることがあります。 Apacheを再起動すると問題は解決するようですが、それは面倒です。

WSGIや「ミドルウェア」やそのようなリクエスト処理のことについて、私は本当によく分かりません。私はPHPのバックグラウンドから来ています。そこではすべてうまく動作します:)

とにかく、この問題を解決するにはどうすればよいですか? WSGIハンドラを実行すると「デーモンモード」が問題を緩和しますか?もしそうなら、どのようにしてデーモンモードで動かすことができますか?

答えて

2

あなたはライブサーバー上でコードを編集していないことにより、この問題を解決することができます。真剣に、それについて言い訳はありません。バージョンコントロールを使用してローカルで開発し、必要ならば、最新のバージョンをチェックアウトしてApacheを再起動するポストコミットフックを使用して、ライブチェックアウトからサーバーを実行します。

+1

はい、しかし時にprod環境は組み込みdevサーバとは異なる動作をしますので、選択肢はありません:) – jujule

+0

@jujule:あなたが開発したものをローカルでテストできるように、prodサーバ上にテストドメインを設定できます。私はprodサーバー上でコードを編集することを正当化できる言い訳はないと思う。 – shanyu

+0

サーバー環境を複製するのは大変な作業です!私のサーバはubuntu/apache2/postgresを実行しています。私の家庭用コンピュータはwin7を使用しています...他の2台をインストールしようとしていません。私はそれを実行したと仮定すると、どのように私は生産にデータベースを移行するだろうか? – mpen

4

組み込みモードでmod_wsgiを使用しているため、変更は自動的には表示されません。 Apacheは新しいハンドラインスタンスを時々起動し、時々更新プログラムを捕捉するので、あなたはそれらを毎回見ています。

hereのようにデーモンモードを使用して解決できます。具体的には、あなたのApacheの設定に次のディレクティブを追加したいと思う:

WSGIDaemonProcess example.com processes=2 threads=15 display-name=%{GROUP} 
WSGIProcessGroup example.com 
+0

この作業を行うために仮想ホストは必要ありませんか? – mpen

+1

宣言をWSGIScriptAliasと同じコンテキストに置くことができます。 –

+0

これはまったく効果がないようですが、btw。 – mpen

5

Djangoサイトに含まれているmod_wsgiホスティングに関する最小限の情報に頼るのではなく、mod_wsgiのドキュメントをお読みください。これは正確にわかります

http://code.google.com/p/modwsgi/wiki/ReloadingSourceCode

どのようにDjangoのするrunserverがないことをリロードソースコードの同じ種類を実装するために使用することができ、モニタを含むのmod_wsgiで作品を、リロードソースコード:partcularでは、お読みください。また、Djangoにそれをどのように適用するかについての議論も参照してください。

http://blog.dscpl.com.au/2008/12/using-modwsgi-when-developing-django.html http://blog.dscpl.com.au/2009/02/source-code-reloading-with-modwsgi-on.html

16

助けにはなりませんデーモンモードでの処理を実行します。

mod_wsgiは、あなたのDjangoサイトの着信要求を処理するために、複数の同一プロセスを生成しています。これらのプロセスはそれぞれ独自のPythonインタプリタであり、着信するWebリクエストを処理できます。これらのプロセスは永続的であり(要求ごとに呼び出されずに分解されないため)、1つのプロセスで何千もの要求が順番に処理される可能性があります。 mod_wsgiは、複数のプロセスがあるため、複数のWebリクエストを同時に処理できます。

各プロセスのPythonインタプリタは、「インポートモジュール」が実行されるたびにモジュール(カスタムPythonファイル)を読み込みます。 djangoのコンテキストでは、これはWebリクエストのために新しいview.pyが必要なときに発生します。モジュールがロードされると、メモリに保存されるため、ファイルに対する変更はそのプロセスに反映されません。より多くのWebリクエストが入ると、プロセスのPythonインタプリタはすでにメモリーにロードされているモジュールのバージョンを使用します。作成中の各Webリクエストは異なるプロセスで処理できるため、リフレッシュ間の不一致が見られます。いくつかのプロセスは、あなたのコードの以前のリビジョン中にPythonモジュールをロードしているかもしれませんが、他のプロセスはそれらをロードしているかもしれません(それらのプロセスはWeb要求を受け取っていないので)。

簡単な解決策:コードを修正するときはいつでも、Apacheプロセスを再開してください。ほとんどの時間は、シェル "/etc/init.d/apache2 restart"からrootとして実行するのと同じくらい簡単です。 "/etc/init.d/apache2 reload"

デーモンの解決策:デーモンモードでmod_wsgiを使用している場合は、 unixコマンド)、またはwsgiスクリプトファイルを変更します。 scrompt.comの投稿を明確にするために、Pythonのソースコードを変更しても、コードを再読み込みするmod_wsgiにはなりません。リロードは、wsgiスクリプトファイルが変更された場合にのみ発生します。

最後の注意点:私は単純化のためにプロセスを使用するためwsgiについてしか話しませんでした。 wsgiは実際には各プロセス内でスレッドプールを使用します。私はこの詳細がこの回答に関連するとは感じなかったが、mod_wsgiについて読んで詳細を見つけることができます。

+0

いい説明!ありがとう。このスレッドのプーリングは、PHPがやっていることよりも有利ですか? – mpen

+0

マルチスレッドを使うときは、Python GILと闘わなければなりません。したがって、集中的な要求ハンドラコードを計算するために、1つのプロセスで複数のCPU /コアを利用できないことがあります。コードがGILをリリースするデータベースや他のモジュールにアクセスしている場合、それほど問題はありません。とにかく、それよりずっと複雑です。 「http://blog.dscpl.com.au/2007/09/parallel-python-discussion-and-modwsgi.html」とお読みください。 –

+0

BTWでは、他のレスポンスで参照されているmod_wsgiドキュメントに記述されているように、コードモニタを実行できるので、デーモンモードが役立ちます。このようにして、WSGIスクリプトファイルだけでなく、Pythonコードを変更すると自動的にデーモンプロセスグループの再起動がトリガーされます。 –