Translate

lunes, 17 de junio de 2019

Servidores WSGI HTTP para PYTHON 3



APLICACIONES WSGI

Al desarrollar una aplicación PYTHON 3 según el estandar Web Server Gateway Interface, o por sus siglas WSGI, podremos servir pàginas web a travès del protocolo HTTP.  Por tanto, debemos evaluar un servidor WSGI HTTP con el que responderemos a los clientes.

Cuando escribimos un programa WSGI podrá ejecutarse en un servidor WEB como APACHE ( con mod_wsgi ) o NGINX, este último se suele utilizar como un PROXY INVERSO complementando a un servidor de aplicaciones, incluso puede complementar como PROXY INVERSO a una configuración con APACHE y mod_wsgi. Un PROXY INVERSO es un intermediario que nos permite reservar nuestros servidores de aplicaciones de los ataques de usuarios o también podríamos configurarlo con caché para acelerar el tiempo de respuesta.

SERVIDORES DE APLICACIONES

Aunque habitualmente instalo mis aplicaciones en un servidor APACHE con mod_wsgi y NGINX, existe mucha documentación que explica cómo realizarlo.

Por esta vez, voy a mostrar unos ejemplos de implementación de una aplicación WSGI en tres servidores de aplicaciones como : Green Unicorn o GUNICORN, UWSGI y CHERRYPY

Resultado de imagen de gunicorn GUNICORN es un magnífico servidor de aplicaciones para UNIX/LINUX.

Para instalar GUNICORN :  

$ pip install gunicorn

Creamos una sencilla aplicación WSGI que denominamos 'wsgi.py' y que nos servirá para todos los ejemplos :

#!/usr/bin/env python
# -*- coding: utf-8 -*-

def application(env, start_response):
     data = b"Hello, World!\n"
     start_response('200 OK', [('Content-Type', 'text/html')])
     return [data]


Ya podemos mostrar el resultado en el puerto 80 cuando ejecutamos :

$ gunicorn -b 0.0.0.0:80 -w 4 wsgi

GUNICORN tiene una extensa cantidad de parámetros pero los que he usado en esta ejecución -b nos permite indicarle IP y PUERTO donde servir las páginas y -w le indica el número de procesos que deberá arrancar y al final solo le indicamos el nombre de la aplicación ('wsgi').


También es posible ejecutar el mismo servidor en segundo plano con :

$ gunicorn -b 0.0.0.0:80 -w 4 wsgi &

Resultado de imagen de UWSGIuWSGI es un servidor de aplicaciones PYTHON compatibles con WSGI y que se puede comunicar con NGINX con el protocolo 'uwsgi'.

Para su instalación :

$ pip install uwsgi

Ahora volvemos a mostrar el resultado de ejecutar en anterior programa wsgi.py

$ uwsgi --http :80 --wsgi-file wsgi.py 

Le hemos indicado que muestre el resultado en el puerto 80.

También es posible ejecutar el mismo servidor en segundo plano con :

$ uwsgi --http :80 --wsgi-file wsgi.py &

CHERRYPY es una librería para el desarrollo de aplicaciones WEB, pero en este caso solo nos interesa su servidor de aplicaciones compatible con WSGI.


Para realizar su instalación :

 $ pip install cherrypy

Como en los casos anteriores vamos a mostrar el resultado que nos devuelve wsgi.py, pero ahora necesitamos crear un pequeño programa PYTHON donde podremos implementar todos los parámetros necesarios, este programa lo vamos a denominar 'server.py' :

# Import your application as:
# from wsgi import application
# Example:

from wsgi import application

# Import CherryPy
import cherrypy

if __name__ == '__main__':

    # Mount the application
    cherrypy.tree.graft(application, "/")

    # Unsubscribe the default server
    cherrypy.server.unsubscribe()

    # Instantiate a new server object
    server = cherrypy._cpserver.Server()

    # Configure the server object
    server.socket_host = "0.0.0.0"
    server.socket_port = 80

    server.thread_pool = 30

    # For SSL Support
    # server.ssl_module            = 'pyopenssl'
    # server.ssl_certificate       = 'ssl/certificate.crt'
    # server.ssl_private_key       = 'ssl/private.key'
    # server.ssl_certificate_chain = 'ssl/bundle.crt'

    # Subscribe this server
    server.subscribe()

    # Example for a 2nd server (same steps as above):
    # Remember to use a different port

    # server2             = cherrypy._cpserver.Server()

    # server2.socket_host = "0.0.0.0"
    # server2.socket_port = 8080
    # server2.thread_pool = 30
    # server2.subscribe()

    # Start the server engine (Option 1 *and* 2)

    cherrypy.engine.start()
    cherrypy.engine.block() 



Mostramos el resultado de ejecutar wsgi.py con :

$ python server.py  

ó para ejecutarlo en segundo plano :


$ python server.py & 

Puede observar que en server.py existen opciones comentadas para demostrar otras capacidades que puede obtener de CHERRYPY, en este caso volvemos a mostrar el contenido en el puerto 80.

Esta ha sido una sencilla y eficaz introducción a tres de los servidores de aplicaciones compatibles con el estándar WSGI que considero más importantes y si necesita realizar un despliegue en producción puede utilizar NGINX como PROXY INVERSO y obtener los mejores resultados.  


 





 

No hay comentarios:

Publicar un comentario