문제

나는 실행 Django 응용 프로그램.그 밑에 아파치를+mod_python 기본기 전에,그것은 모두 괜찮습니다.로 전환 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

결국 저는 다시 전환해 아파치는+mod_python 기본(나가는 임의의 다른 오류 fcgi,이 외에도 중 하나는)모든 것이 좋고 지금 안정되어 있습니다.

질문은 여전히 열려 있습니다.는 경우에 누군가가 나중에 이 문제를 해결 그것은 그들을 기록할 수 있는 솔루션이 여기 나중에 참조할 수 있습니다.:)

다른 팁

가능한 솔루션: http://groups.google.com/group/django-users/browse_thread/thread/2c7421cdb9b99e48

최근까지도 많은 관심을 갖게 되었을 테스트 이에 장고 1.1.1.이 예외가 발생하였을때 다시...놀라 어요.그것은 내게 일 시간 이것을 디버깅,힌트였 는 경우에만(사전에)분기.그래서 사람들을위한 점점 무작위로 이러한 예외를 말할 수 있습...정 귀하의 코드:)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) 

지 않는 이상적인 생각을 연결하는 두 번하여 컴퓨터바이러스에 의한 해결 방법에 최고입니다.


가능한 솔루션:를 사용하여 연결 풀링(pgpool,pgbouncer),그래서 당신은 DB 커넥션 풀로 안정적이고 빠른손잡이 당신의 FCGI 데몬에 사용할 수 있습니다.

문제는 이 트리거 또 다른 버그,psycopg2 키 InterfaceError 기 때문에 그것의 연결을 끊으려고 두 번(pgbouncer 이미 처리된다).

지금 범인 장고 신호 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,그리고 범인 호환 사이의 클라이언트/서버 버전(더라도 그들은 같은 주요 버전!)

냄새처럼 가능한 실을 꿰는 문제입니다.예 상 스레드에 안전하지만에서 문서 파일을 나타내는 것 Django/FCGI 실행할 수 있는 방법입니다.실행 하십시오와 prefork 고 다음의 서버입니다.면 문제가 해결...

어쩌면 PYTHONPATH 및 PATH 환경변수를 다른 모두에 대한 설정(Apache+mod_python 기본 및 lighttpd+FastCGI).

고정하는 경우에도 비슷한 문제가 발생할 수을 사용하여 geodjango 모델을 사용하지 않는 기본 ORM 에 대한 하나의 기능입니다.추가 할 때에 선을 수동으로 연결을 닫는 오류를 갔습니다.

http://code.djangoproject.com/ticket/9437

나는 아직도 오류가 무작위로(~50%의 요청)면을 함께 사용자는 로그인/세션은 그러나입니다.

에 갔을 통해 동의 문제는 최근에(lighttpd,fastcgi&postgre).검색에 대한 솔루션에 대한 일이 없고,마지막으로 전환 mysql.문제가 사라졌다.

왜 저장하에서 세션 캐시?설정

SESSION_ENGINE = "django.contrib.sessions.backends.cache"

또한 당신이 시도할 수 있는 사용 postgres 과 pgbouncer (postgresql-prefork 서버와 좋아하지 않는 많은 연결/연결 끊 시간 당),하지만 먼저 확인하 postgresql.로그인합니다.

또 다른 버전-당신은 많은 기록을 세션에서 테이블과 django-admin.py 정리 도움이 될 수 있습니다.

문제가 될 수 있는 주로 가져올 수 있습니다.어야 그게 나에게 무슨 일이 있었는지.나는 나 자신의 솔루션을 찾은 후 아무것도 있습니다.을 확인하시기 바랍 내 블로그 게시물기: 간단한 Python 유틸리티를 확인하 모두 수입품에서 귀하의 프로젝트

당연히 이만 도움이 될 것입니다 당신의 솔루션을 원래의 문제를 매우 빨리 그리고 실제 문제에 대한 해결책니다.

에서 변경 방법은=prefork 방법=스레드에 대한 문제를 해결하는 나입니다.

내가 하려고 대답을 하는 경우에도 이 말을 사용하지 않는 장고 그러나 피라미드로 framework.내가 실행되었으로 이 문제됩니다.문제는 그것이 정말 생산하기 어려운 이러한 테스트를...어쨌든.마지막으로 나는 그것을 해결을 통해 발굴하여 전체 재료의 세션을,범위 세션,인스턴스의 세션,엔진 연결을 등입니다.나이:

http://docs.sqlalchemy.org/en/rel_0_7/core/pooling.html#disconnect-handling-pessimistic

이 접근은 단순히 추가 수신기를 연결의 수영장 엔진입니다.에서는 수신자에서 정적을 선택하는 쿼리 데이터베이스에 있습니다.그것이 실패하는 경우에 수영장을 설정하려고 하는 새로운 데이터베이스에 대한 연결을하기 전에 실패한다.중요:이런 일이 발생하기 전에 다른 어떤 물건은 발생하는 데이터베이스입니다.그래서 그것은 가능한 사전 연결되어 있는지 확인하는 것을 방지하는 것 나머지 부분의 코드에서 실패하고 있습니다.

이것은 깨끗한 솔루션이기 때문에 그것을 해결하지 않은 오류는 그러나 그것은 마치 마법처럼 작동합니다.희망이 누군가가 도움이 됩니다.

적용 가능한 견적:

"2019 anyone?" - half of YouTube comments, circa 2019

만약 누군가가 여전히 이를 처리하는지 확인 응용 프로그램은"열심히 포크"등는 파이썬 DB 드라이버(psycopg2 나를 위해)지 않는 자원을 공유 프로세스 사이.

나는이 문제를 해결에 서버에 추가하여 lazy-apps = true 옵션,원인은 포크 응용 프로그램의 프로세스의 게이트,오히려 기다리고 복사기/쓰기가 가능합니다.내가 상상하는 다른 WSGI/FastCGI 호스트와 유사한 옵션이 있습니다.

당신은 고려 다운그레이드하는 Python2.5.×(2.5.4 체)?나는 생각하지 않 Django 것으로 간주에 성숙 Python2.6 있기 때문에 일부 호환되지 않는 변경합니다.그러나 내가 이것을 의심할 것이 당신의 문제를 해결합니다.

또한,Django1.0.2 고정 일부는 사악한 작은 버그 그래서 실행하고 있는지 확인하십시오니다.이것을 아주 잘할 수 있었 당신의 문제를 해결합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top