[Python-es] Servidores web en python

Chema Cortes pych3m4 en gmail.com
Lun Sep 26 09:18:49 EDT 2016


El lun., 26 sept. 2016 a las 11:27, Antonio Beamud Montero (<
antonio.beamud en gmail.com>) escribió:

> El 25/09/16 a las 13:51, Chema Cortes escribió:
> > Se puede dar un buen servicio con apache, pero conseguir que sea
> > escalable es complicado. Mientras, nginx se adapta muy bien a los
> > incrementos de demandas, sobre todo si se trata de enviar streams de
> > datos.
> Hola Chema, ¿en que casos crees que apache no escala bien? Hasta ahora,
> los casos que me he encontrado yo, no eran problema de apache, sin el
> backend detrás de él.
>

Creo que @lasizoillo ha contestado a la pregunta.

La respuesta corta es que apache va bien para ejecuciones cortas, mientras
que nginx es más adecuado para ejecuciones largas.

Yo especificafa el caso de envío de streams, que puede ser para enviar
vídeo, pero que también puede verse como el típico chat o red social tipo
twitter o de visualización de cotizaciones de bolsa. Puedes
superdimensionar un sistema de nodos apache para que tenga workers
suficientes que den respuesta a todas las conexiones que reciba. Por
supuesto, por culpa de la programación de los backends, estos workers
degeneran y empiezan a sufrir bloqueos y a quedarse sin memoria. Se
configuran para que los workers se "autosuiciden" al cabo de un número de
conexiones (MaxConnectionsPerChild) y liberen los recursos que quedaban
bloqueados. Pero ¿qué pasa cuando dedicas una conexión a un stream que
requiere de una conexión más larga? ¿o como dice lasiozillo, si estas
sufriendo una situación similar a un ataque slowloris porque las conexiones
de tu cliente son excesivamente lentas? El worker degenera sin remedio, lo
que va dejando pocos workers disponibles en el pool para nuevas conexiones,
lo que reduce la capacidad de respuesta del servidor. Hay muy pocos que
programen conscientemente de los problemas que tendrán sus programas en
ejecuciones largas.

Con un servidor asíncrono, como nginx, puedes dedicar una conexión a cada
cliente y crear "continuaciones" (corrutinas) que son bastante livianas y
cuyo proceso se ajusta a la capacidad de proceso que tenga tu máquina,
asegurando su escalabilidad. Se puede decir que nginx puede responder a
cualquier número de peticiones concurrentes que se le haga, aunque sea muy
lentamente. Basta aumentar el número de nodos para mejorar la respuesta. Al
igual que apache, también una mala programación puede tumbar el servidor
nginx. Pero si realizas una buena programación asíncrona, que evite
bloqueos y use operaciones atómicas (CAS), se consigue una ejecución
bastante pacífica de un gran número de procesos simultáneos.

-- 
Hyperreals *R  "Quarks, bits y otras criaturas infinitesimales":
http://blog.ch3m4.org <http://ch3m4.org/blog>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://mail.python.org/pipermail/python-es/attachments/20160926/f01ac2d0/attachment.html>


Más información sobre la lista de distribución Python-es