2009-07-03 12 views
8

Estoy ejecutando una aplicación Django en Apache + mod_python. Cuando realizo algunos cambios en el código, a veces tienen efecto inmediatamente, otras veces no, hasta que reinicio Apache. Sin embargo, realmente no quiero hacer eso, ya que es un servidor de producción que ejecuta otras cosas también. ¿Hay alguna otra forma de forzar eso?Reiniciar una aplicación Django que se ejecuta en Apache + mod_python

Para dejarlo en claro, dado que veo que algunas personas lo hacen mal, estoy hablando de un entorno de producción . Para el desarrollo, estoy usando el servidor de desarrollo de Django, por supuesto.

Respuesta

15

Si es posible, debe cambiar a mod_wsgi. Este es ahora el recommended way para servir a Django de todos modos, y es mucho más eficiente en términos de recursos de memoria y servidor.

En mod_wsgi, cada sitio tiene un archivo .wsgi asociado. Para reiniciar un sitio, solo touch el archivo relevante, y solo ese código se volverá a cargar.

+0

Tengo un poco de miedo de este XXgi cosas después de todos los problemas que tuve con FastCGI (claro, fue Lighttpd, pero aún así): http://stackoverflow.com/questions/393637/django-fastcgi-randomly-raising- operationalerror. No sabía que wsgi es la forma recomendada de implementar Django ahora. Solía ​​ser mod_python, ¿verdad? De todos modos, lo investigaré. ¡Gracias! – ibz

+0

s/this things/these things/:) – ibz

+2

Como se indicó en otra parte, debe usar el modo de demonio mod_wsgi para obtener una función mediante la cual se realizará una recarga cuando se toque el archivo de script de WSGI. –

-1

Utilice un servidor de prueba incluido en Django. (como ./manage.py runserver 0.0.0.0:8080) Hará la mayoría de las cosas que necesitaría durante el desarrollo. El único inconveniente es que no puede manejar solicitudes simultáneas con multi-threading.

He oído que hay un truco que establece las instancias máximas de Apache en 1 para que cada cambio de código se refleje de inmediato, pero como dijo que está ejecutando otros servicios, este puede no ser su caso.

+0

Eso es "MaxRequestsPerChild 1" establecido en httpd.conf según lo dicho por zdmytriv, pero no hacen esto para manejar cualquier carga del sitio. – agiliq

0

Puede reducir el número de conexiones a 1 configurando "MaxRequestsPerChild 1" en su archivo httpd.conf. Pero hazlo solo en el servidor de prueba, no en la producción.

o

Si no desea matar a las conexiones existentes y aún reiniciar Apache puede reiniciarlo "con gracia" mediante la realización de "apache2ctl con gracia" - todas las conexiones existentes se les permitirá completar.

+0

"apache2ctl gracefully" suena como una cosa bonita. Definitivamente lo investigaré, a pesar de que no es exactamente lo que estaba buscando. ¡Gracias por el consejo! – ibz

4

Como han sugerido otros, use mod_wsgi en su lugar. Para obtener la capacidad de recarga automática, al tocar el archivo de script de WSGI, o a través de un monitor que busca cambios de código, debe estar usando el modo de daemon en UNIX. Se puede usar un poco de mano para lograr lo mismo en Windows cuando se usa el modo incrustado. Todos los detalles se pueden encontrar en:

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

Cuestiones relacionadas