python - with - La configuración del servidor más limpia y rápida para Django
wsgi django (13)
Estoy a punto de implementar un sitio de mediano tamaño impulsado por Django. Tengo un servidor Ubuntu dedicado.
Estoy realmente confundido sobre qué software de servidor usar. Así que pensé: ¿por qué no pedir Stackoverflow?
Lo que estoy buscando es:
- Fácil de configurar
- Rápido y fácil en recursos
- Puede servir archivos de media
- Capaz de servir múltiples djangosites en el mismo servidor
- Preferiría no instalar PHP o cualquier otra cosa que apetezca recursos, y para la cual no me sirve.
He oído hablar de mod_wsgi y mod_python en Apache, nginx y lighty. ¿Cuáles son los pros y los contras de estos y he echado de menos a alguien?
@Barry : de alguna manera siento que Apache está hinchado por mí. ¿Qué hay de las alternativas?
@BrianLy : Ok, revisaré un poco más a mod_wsgi. ¿Pero por qué necesito Apache si sirvo archivos estáticos con Lighty? También me las arreglé para servir la aplicación django con luz. ¿Eso es malo de todos modos? Lo siento por ser tan estúpido :-)
ACTUALIZACIÓN : ¿Qué pasa con lighty y nginx? ¿Cuáles son los casos de uso cuando estas son la elección perfecta?
Como dijo @Barry, la documentación usa mod_python . No he usado Ubuntu como servidor, pero tuve una buena experiencia con mod_wsgi en Solaris. Puede encontrar documentación para mod_wsgi y Django en el sitio mod_wsgi .
Una revisión rápida de sus requisitos:
- Fácil de instalar Encontré apache 2.2 bastante fácil de construir e instalar.
- Rápido y fácil en los recursos Yo diría que esto depende de su uso y tráfico. * Es posible que no desee server todos los archivos usando Apache y use LightTPD (lighty) para los archivos estáticos del servidor.
- Puede servir archivos multimedia ¿Supongo que quiere decir imágenes, archivos flash? Apache puede hacer esto.
- Varios sitios en el mismo servidor Alojamiento de servidores virtuales en Apache.
- En lugar de eso, no instale otras extensiones Comente cualquier cosa que no desee en la configuración de Apache.
Como estaba buscando respuestas más profundas, decidí investigar el tema yo mismo a fondo. Por favor, avíseme si he entendido mal algo.
Algunas recomendaciones generales son usar un servidor web separado para manejar los medios. Por separado, me refiero a un servidor web que no ejecuta Django. Este servidor puede ser, por ejemplo:
- Lighttpd (Lighty)
- Nginx (EngineX)
- O algún otro servidor liviano
Entonces, para Django, puedes seguir diferentes caminos. Tu también puedes:
Sirve Django a través de Apache y:
mod_python
Esta es la forma estable y recomendada / bien documentada. Contras: utiliza mucha memoria.
mod_wsgi
Por lo que entiendo, mod_wsgi es una alternativa más nueva. Parece ser más rápido y más fácil con los recursos.
mod_fastcgi
Al usar FastCGI, usted está delegando la porción de Django en otro proceso. Como mod_python incluye un intérprete python en cada solicitud, utiliza mucha memoria. Esta es una forma de eludir ese problema. También hay algunas preocupaciones de seguridad.
Lo que debes hacer es iniciar tu servidor Django FastCGI en un proceso separado y luego configurar Apache a través de reescrituras para llamar a este proceso cuando sea necesario.
O tu puedes:
Sirva a Django sin usar Apache pero con otro servidor que admita FastCGI de forma nativa:
(La documentación menciona que puede hacer esto si no tiene necesidades específicas de Apache. Supongo que la razón debe ser para guardar la memoria).
- Lighttpd
Este es el servidor que ejecuta Youtube. Parece rápido y fácil de usar, sin embargo, he visto informes en memoryleaks.
- nginx
He visto puntos de referencia que afirman que este servidor es incluso más rápido que lighttpd. Sin embargo, está documentado en su mayoría en ruso.
Otra cosa, debido a las limitaciones en Python, su servidor debería estar ejecutándose en modo bifurcado, no enhebrado.
Esta es mi investigación actual, pero quiero más opiniones y experiencias.
En mi opinión, la pila mejor / más rápida es barniz-nginx-uwsgi-django. Y lo estoy usando con éxito.
Estoy luchando por entender todas las opciones también. En esta publicación de blog , encontré algunos beneficios de mod_wsgi en comparación con mod_python explicado.
Múltiples sitios de poco tráfico en un VPS pequeño hacen que el consumo de RAM sea la principal preocupación, y mod_python parece ser una mala opción allí. Utilizando lighttpd y FastCGI, he logrado que el uso mínimo de memoria de un sitio Django simple sea de 58MiB virtual y de 6.5MiB residente (después de reiniciar y atender una única solicitud no pesada de RAM).
Me he dado cuenta de que la actualización de Python 2.4 a 2.5 en Debian Etch aumentó la huella de memoria mínima de los procesos de Python en un pequeño porcentaje. Por otro lado, una mejor administración de la memoria 2.5 podría tener un efecto opuesto más grande en los procesos de larga ejecución.
Estoy usando Cherokee .
De acuerdo con sus puntos de referencia (grano de sal con ellos), maneja la carga mejor que Lighttpd y nginx ... Pero esa no es la razón por la que lo uso.
Lo uso porque si escribe cherokee-admin
, inicia un nuevo servidor en el que puede iniciar sesión (con una contraseña de un solo uso) y configura todo el servidor a través de un webmin muy bien hecho. Esa es una característica clave. Ya me ha ahorrado mucho tiempo. ¡Y está ahorrando muchos recursos a mi servidor!
En cuanto a django, lo estoy ejecutando como un proceso SCGI enhebrado. Funciona bien. Cherokee puede mantenerlo funcionando también. Nuevamente, muy buena característica.
La versión actual del repositorio de Ubuntu es muy antigua, así que te aconsejo que uses su PPA . Buena suerte.
Estoy usando nginx (0.6.32 tomado de Sid ) con mod_wsgi . Funciona muy bien, aunque no puedo decir si es mejor que las alternativas porque nunca lo intenté. Nginx tiene compatibilidad para memcached , que quizás pueda interoperar con el middleware de cache de Django (en realidad no lo uso, sino que llene el caché de forma manual utilizando python-memcache y lo invalido cuando se realizan cambios), por lo que el caché golpea completamente a Django (mi máquina de desarrollo puede atender aproximadamente 3000 solicitudes por segundo).
Una advertencia: nginx '' mod_wsgi
no le mod_wsgi
las ubicaciones con nombre (intenta pasarlas en SCRIPT_NAME
), por lo que la'' error_page 404 = @django
''causará numerosos errores oscuros. Tuve que parchear la fuente mod_wsgi para arreglar eso.
Hay muchas maneras, enfoque para hacer esto. Por ese motivo, recomiendo leer atentamente el artículo relacionado con el proceso de implementación en DjangoAdvent.com: Eric Florenzano - Implementación de Django con FastCGI: http://djangoadvent.com/1.2/deploying-django-site-using-fastcgi/ Lea también: Mike Malone - Escalando Django Stochastictechnologies Blog: La configuración perfecta de Django Mikkel Hoegh Blog: 35% Response-time-improvement-switching-uwsgi-nginx
Saludos
La forma oficialmente recomendada para implementar un proyecto django es usar mod_python con apache. Esto se describe en la documentación. El principal profesional con esto es que es la mejor manera documentada, más compatible y más común de implementar. La desventaja es que probablemente no sea el más rápido.
La mejor configuración no es tan conocida, creo. Pero aquí está:
- Use nginx para solicitudes de servicio (dinámico a la aplicación, contenido estático directamente).
- Utilice el servidor web python para servir contenido dinámico.
Las dos soluciones más rápidas para el servidor web basado en python son:
Necesita buscar en google para encontrar la mejor configuración actual para django (aún en desarrollo).
Mantenlo simple: Django recomienda Apache y mod_wsgi (o mod_python) . Si el servicio de archivos multimedia es una parte muy importante de su servicio, considere Amazon S3 o Rackspace CloudFiles.
Si está usando lighthttpd, también puede usar FastCGI para servir Django. No estoy seguro de cómo se compara la velocidad con mod_wsgi, pero si la memoria funciona correctamente, obtienes un par de los beneficios que obtendrías con mod_wsgi que no obtendrías con mod_python. La principal es que puede asignarle a cada aplicación su propio proceso (lo que es realmente útil para mantener separadas la memoria de las diferentes aplicaciones y para aprovechar las computadoras de varios núcleos).
Editar: solo para agregar en lo que respecta a su actualización sobre nginix, si la memoria vuelve a funcionar correctamente, nginix usa "greenlets" para manejar la simultaneidad. Esto significa que es posible que deba ser un poco más cuidadoso para asegurarse de que una aplicación no consuma todo el tiempo del servidor.
Tengo una advertencia por usar Cherokee. Cuando realiza cambios en Django, Cherokee mantiene el proceso VIEJO, en lugar de matarlo y comenzar uno nuevo.
En Apache, recomiendo encarecidamente este artículo.
http://www.djangofoo.com/17/django-mod_wsgi-deploy-exampl
Es fácil de configurar, fácil de matar o restablecer después de hacer cambios.
Solo escriba terminal
sudo /etc/init.d/apache2 restart
y los cambios se ven al instante.
Utilizamos nginx y FastCGI para todas nuestras implementaciones de Django. Esto se debe principalmente a que usualmente desplegamos en Slicehost, y no queremos donar toda nuestra memoria a Apache. Supongo que este sería nuestro "caso de uso".
En cuanto a los comentarios acerca de que la documentación está principalmente en ruso, he encontrado que la mayoría de la información en el wiki en inglés es muy útil y precisa. Este sitio también tiene configuraciones de muestra para Django, desde las cuales puede ajustar su propia configuración de nginx.