Django+FastCGI-ランダムに向OperationalError
質問
私は運Djangoます。たのでApache+mod_python'とのすべてOKです。切り替わりLighttpd+FastCGI.今はランダムに以下の例外(いの場所や時間で表示されな予測できる.なのでランダムで表示され替えたあとのFastCGIいないかを設定します。
見た場合の結果googleingがるように思われる関連の設定maxrequests=1です。しかし、そのデフォルトは0になります。
そのアイデアがどこですか?
PS.私が使っているPostgreSQL.が関連性を有するとともに、例外が表示される場合データベースを返します。
File "/usr/lib/python2.6/site-packages/django/core/handlers/base.py", line 86, in get_response
response = callback(request, *callback_args, **callback_kwargs)
File "/usr/lib/python2.6/site-packages/django/contrib/admin/sites.py", line 140, in root
if not self.has_permission(request):
File "/usr/lib/python2.6/site-packages/django/contrib/admin/sites.py", line 99, in has_permission
return request.user.is_authenticated() and request.user.is_staff
File "/usr/lib/python2.6/site-packages/django/contrib/auth/middleware.py", line 5, in __get__
request._cached_user = get_user(request)
File "/usr/lib/python2.6/site-packages/django/contrib/auth/__init__.py", line 83, in get_user
user_id = request.session[SESSION_KEY]
File "/usr/lib/python2.6/site-packages/django/contrib/sessions/backends/base.py", line 46, in __getitem__
return self._session[key]
File "/usr/lib/python2.6/site-packages/django/contrib/sessions/backends/base.py", line 172, in _get_session
self._session_cache = self.load()
File "/usr/lib/python2.6/site-packages/django/contrib/sessions/backends/db.py", line 16, in load
expire_date__gt=datetime.datetime.now()
File "/usr/lib/python2.6/site-packages/django/db/models/manager.py", line 93, in get
return self.get_query_set().get(*args, **kwargs)
File "/usr/lib/python2.6/site-packages/django/db/models/query.py", line 304, in get
num = len(clone)
File "/usr/lib/python2.6/site-packages/django/db/models/query.py", line 160, in __len__
self._result_cache = list(self.iterator())
File "/usr/lib/python2.6/site-packages/django/db/models/query.py", line 275, in iterator
for row in self.query.results_iter():
File "/usr/lib/python2.6/site-packages/django/db/models/sql/query.py", line 206, in results_iter
for rows in self.execute_sql(MULTI):
File "/usr/lib/python2.6/site-packages/django/db/models/sql/query.py", line 1734, in execute_sql
cursor.execute(sql, params)
OperationalError: server closed the connection unexpectedly
This probably means the server terminated abnormally
before or while processing the request.
解決 5
最後に、私は(私はこの1つ以外にも、fcgiのと他のランダム誤差を持っていた)アパッチ+のmod_pythonのに切り替え、すべてが今良いと安定してます。
疑問がまだ開いたまま。場合には誰もが将来的にこの問題を持っており、彼らは今後の参考のためにここに解決策を記録することができ、それを解決します。 :)
他のヒント
可能な解決方法: http://groups.google.com/group/django-users/browse_thread/thread/2c7421cdb9b99e48
最近まで不思議に思試験 このDjango1.1.1.まこの 例外がスローされとして名高い大衆居酒屋"岸田屋驚き がありました。かかったとのことであ 時にはデバッグ、ヒントにした ることを示す場合(前)分岐.ないという人にはまったくってランダムに その例外を除き、できるといいな。fix コード:)Ok..真剣にあり 常に少ないこ 私の予約特典の説明があ の問題です。ご覧になる場合データベース 場合のモジュールの輸入 として、例えば読書の構成から データベースを取得しますこのエラーになります。時fastcgi-preforkの応用 始まりは、まず、輸入の全てのモジュール みにこのフォーク。が確立されているdb接続 インポートすべてのプロセス して正確なコピーすると オブジェクトです。この接続は の終了時に請求相 (request_finished信号).なので初 子どもを呼び出すことにより工程 おすことがあり 接続します。もう 残りの子プロセス?その すると考えてオープン ここから労働への接続 dbので、他のdb操作ることができ ます。なぜこんなには ネジ付きの実行モデルかどうかを示します。と思い でスレッドを用いたオブジェクト やノウハウが他のスレッドが 閉接続します。どうすればいい?が固定コー---が このことが困難であることもあります。その他のオプションは、私の意見であ シェアハウス滞在の経験があるくどこかにお 申請の小片をコード:
from django.db import connection
from django.core import signals
def close_connection(**kwargs):
connection.close()
signals.request_started.connect(close_connection)
理想的な解決策ではないと考え、接続回のDBは、回避策です。
可能な解決方法:使用している接続プーリング(pgpool,pgbouncer)ですから、DB接続を行安定を受けて迅速におFCGIづ.
問題はこのトリガを別のバグpsycopg2を調達 InterfaceError もしようとしているのでし切りに回pgbouncer取り扱います。
現在原因はDjango信号 request_finished トリガ 接続します。close(), 、なんでこられた場合でも既に切断されます。ないと思いこの動作が望、ご請求になる場合には、既に完了したら、というのは気にしていないDBに接続す。パッチ補正はこうすることを期待します。
に関連するトレースバック:
/usr/local/lib/python2.6/dist-packages/Django-1.1.1-py2.6.egg/django/core/handlers/wsgi.py in __call__(self=<django.core.handlers.wsgi.WSGIHandler object at 0x24fb210>, environ={'AUTH_TYPE': 'Basic', 'DOCUMENT_ROOT': '/storage/test', 'GATEWAY_INTERFACE': 'CGI/1.1', 'HTTPS': 'off', 'HTTP_ACCEPT': 'application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5', 'HTTP_ACCEPT_ENCODING': 'gzip, deflate', 'HTTP_AUTHORIZATION': 'Basic dGVzdGU6c3VjZXNzbw==', 'HTTP_CONNECTION': 'keep-alive', 'HTTP_COOKIE': '__utma=175602209.1371964931.1269354495.126938948...none); sessionid=a1990f0d8d32c78a285489586c510e8c', 'HTTP_HOST': 'www.rede-colibri.com', ...}, start_response=<function start_response at 0x24f87d0>)
246 response = self.apply_response_fixes(request, response)
247 finally:
248 signals.request_finished.send(sender=self.__class__)
249
250 try:
global signals = <module 'django.core.signals' from '/usr/local/l.../Django-1.1.1-py2.6.egg/django/core/signals.pyc'>, signals.request_finished = <django.dispatch.dispatcher.Signal object at 0x1975710>, signals.request_finished.send = <bound method Signal.send of <django.dispatch.dispatcher.Signal object at 0x1975710>>, sender undefined, self = <django.core.handlers.wsgi.WSGIHandler object at 0x24fb210>, self.__class__ = <class 'django.core.handlers.wsgi.WSGIHandler'>
/usr/local/lib/python2.6/dist-packages/Django-1.1.1-py2.6.egg/django/dispatch/dispatcher.py in send(self=<django.dispatch.dispatcher.Signal object at 0x1975710>, sender=<class 'django.core.handlers.wsgi.WSGIHandler'>, **named={})
164
165 for receiver in self._live_receivers(_make_id(sender)):
166 response = receiver(signal=self, sender=sender, **named)
167 responses.append((receiver, response))
168 return responses
response undefined, receiver = <function close_connection at 0x197b050>, signal undefined, self = <django.dispatch.dispatcher.Signal object at 0x1975710>, sender = <class 'django.core.handlers.wsgi.WSGIHandler'>, named = {}
/usr/local/lib/python2.6/dist-packages/Django-1.1.1-py2.6.egg/django/db/__init__.py in close_connection(**kwargs={'sender': <class 'django.core.handlers.wsgi.WSGIHandler'>, 'signal': <django.dispatch.dispatcher.Signal object at 0x1975710>})
63 # when a Django request is finished.
64 def close_connection(**kwargs):
65 connection.close()
66 signals.request_finished.connect(close_connection)
67
global connection = <django.db.backends.postgresql_psycopg2.base.DatabaseWrapper object at 0x17b14c8>, connection.close = <bound method DatabaseWrapper.close of <django.d...ycopg2.base.DatabaseWrapper object at 0x17b14c8>>
/usr/local/lib/python2.6/dist-packages/Django-1.1.1-py2.6.egg/django/db/backends/__init__.py in close(self=<django.db.backends.postgresql_psycopg2.base.DatabaseWrapper object at 0x17b14c8>)
74 def close(self):
75 if self.connection is not None:
76 self.connection.close()
77 self.connection = None
78
self = <django.db.backends.postgresql_psycopg2.base.DatabaseWrapper object at 0x17b14c8>, self.connection = <connection object at 0x1f80870; dsn: 'dbname=co...st=127.0.0.1 port=6432 user=postgres', closed: 2>, self.connection.close = <built-in method close of psycopg2._psycopg.connection object at 0x1f80870>
例外処理ここでのファンダメンタルズよりリニエンシー(減免)制度:
/usr/local/lib/python2.6/dist-packages/Django-1.1.1-py2.6.egg/django/db/__init__.py
63 # when a Django request is finished.
64 def close_connection(**kwargs):
65 connection.close()
66 signals.request_finished.connect(close_connection)
んでいれば、それらを受け取った取り扱いにpsycopg2うなスロー致命的なエラーの場合はすべて今は切断しては:
/usr/local/lib/python2.6/dist-packages/Django-1.1.1-py2.6.egg/django/db/backends/__init__.py
74 def close(self):
75 if self.connection is not None:
76 self.connection.close()
77 self.connection = None
その他にも、私の短いアイデア.
スイッチでは、あなたはPostgreSQLのクライアント/サーバーのバージョンを変更しましたか?
私は、PHP + MySQLで同様の問題を見ていると、犯人は、クライアント/サーバのバージョン間の非互換性でした(彼らは同じメジャーバージョンを持っていたにも関わらず!)
の可能なスレッドの問題のようなにおい。で、ファイルドキュメントがジャンゴ/ FCGIがそのように実行することができることを示しているように見えるが、Djangoはのないの保証、スレッドセーフです。 preforkのを実行してみてから、サーバーのがらくたを破りました。問題が解消されている場合...
たぶんPYTHONPATHおよびPATH環境変数には、両方のセットアップ(Apacheの+のmod_pythonのとlighttpdの+のFastCGI)で異なります。
私は同様の問題を修正しました。私は手動で接続を閉じるように行を追加するとエラーが去っていきました。
http://code.djangoproject.com/ticket/9437する
しかし、ユーザーのログイン/セッションでものをやったときに、私はまだランダムエラー(要求の〜50%)を参照してください。
私は(lighttpdを、FastCGIの&postgre)最近、同じ問題を通り抜けました。成功しなかった日のためのソリューションを探し、そして最後の手段としてのmysqlに切り替えます。問題がなくなっています。
なぜキャッシュにセッションを保存しませんか? 設定
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
また、あなたは、のpgbouncer のに使用postgresのを試すことができます(postgresの - preforkのサーバおよび時間あたりの多くのコネクト/切断を好きではない)が、まずあなたのpostgresql.logをチェック
。別のバージョン - 。あなたは、セッションテーブルに多数のレコードを持っているとし、のdjango-admin.pyクリーンアップのを助けることができます。
問題が輸入で、主である可能性があります。少なくとも私に何が起こったのthats。 私は、Webから何も見つけなかった後、私自身の解決策を書きました。ここに私のブログ投稿を確認してください:シンプルなPythonのユーティリティのすべての輸入をチェックしますプロジェクトの
この勿論それ自体のみでかなり迅速になく、元の問題の解決にあなたの問題のため、実際の解を得るのに役立ちます。
変更=スレッドは私のために問題を解決します。
私はこれに答えを与えることを試みます。私は長いので、この問題に実行していました。問題は、とにかく...テストのために、このエラーを生成するために、本当に難しかったということでした。最後に、私は、私はこれを見つけたセッション、エンジンとの接続などのセッション、スコープのセッション、事例の全体のものを掘りことによってそれを解決します:
http://docs.sqlalchemy.org/ EN / rel_0_7 /コア/ pooling.html#切断ハンドリング-悲観的の
このアプローチは、単にエンジンの接続プールにリスナーを追加します。リスナーで静的な選択は、データベースに照会されます。それが失敗した場合、それがすべてで失敗する前に、プールは、データベースへの新しい接続を確立しよう。重要:他のものがデータベースにスローされる前に、これが起こります。だから、それは失敗からあなたのコードの残りの部分を妨げるものをチェック接続を事前にすることが可能である。
これは、エラー自体は解決しないので、クリーンなソリューションではありませんが、それは魔法のように動作します。これは誰かに役立ちます願っています。
適用引用ます:
"2019 anyone?"
- half of YouTube comments, circa 2019
、必ずあなたのアプリがあなたのPython DBドライバ(私にとってpsycopg2
)はプロセス間でリソースを共有しないように、「熱心にフォーク」されていることを確認します。
私はむしろ、コピーオンライトを待っているよりも、右ゲートのうち、アプリのプロセスをforkすることで原因lazy-apps = true
オプションを追加することでuWSGIでこの問題を解決しました。私は他のWSGI / FastCGIのホストが同様のオプションを持っている想像します。
あなたは、Python 2.5.xの(特に2.5.4)にダウングレードすると考えられていますか?私はいくつかの後方互換性のない変更があるので、DjangoはPythonの2.6で、成熟したと考えられるであろうとは思いません。しかし、私はこれはあなたの問題を解決しないだろう。
また、Djangoの1.0.2は、いくつかの極悪非道な小さなバグを修正しますので、それを実行していることを確認してください。これは非常によくあなたの問題を解決することができます。