Ir al contenido principal

Implementación de aplicaciones web Python (Flask) en Windows Server (IIS) - FastCGI

Configurar IIS para publicar aplicaciones Python con Flask.

Windows 2016 - IIS 10 - Flask - Python 3.9






Fue un poco complicado encontrar informacion actualizada para configurar los servicios de python, por lo que tuve que tomar varias configuraciones de diferentes tutotiales hasta que pude confiurar mi servidor virtual. 

Instalacion de IIS.
Despues de instalado windows 2016 debemos instalar IIS y los componentes necesarios

Seguimos las siguientes imagenes para instalar el IIS.

Server Manager / add roles and features


Next

Role-based or feature-based instalattion. (estamos instalando localmente). Next.

Nos aseguramos que es el servidor donde queremos instalar el IIS. Next

Seleccionamos "Web Server (IIS)", nos aparecerá una nueva ventana, "Add Features". Next.

Next
Next

Buscamos "Application Development" y seleccionamos "CGI". Next

Install.


Ahora tenemos instalado el IIS en Windows 2016.

Abrimos el navegador y vamos a la pagina http://localhost para comprobar que esta funcionando el IIS


Comprobamos que tenemos instalado el IIS en nuestro sistema.



Copiando nuestra pagina web escrita con python y flask.

NOTA: Este es un servidor de prueba y todo lo estoy instalando en la unidad C. No es recomendable que lo hagan así. Yo recomiendo tener 3 unidades extra. 
1. Para los sitios web. en caso de falla de la unidad C, es mas facil montar o recuperar los datos en una unidad diferente al sistema operativo.
2. Los Logs. Ya que si crecen en la misma unidad C. pueden dejar al servidor inaccesible por falta de espacio.
3. Backups (si es que los hacen en el mismo servidor), por rapidez en la recuperacion de versiones estables. 

Creamos el arbol de carpetas. En mi caso "sitiosweb" y "python_app01"

Damos permisos para el acceso de IIS. Noté que en algunos tutoriales piden dar acceso total al usuario de IIS. No lo hagan.
Click derecho a la carpeta raiz, en mi caso "sitiosweb", seleccionamos "Security"
Add


Dependiendo de la configuracion que tengan o sus requerimientos de seguridad, deben seleccionar los usuarios que requieran para la ejecucion de pools, etc. Si no tienen configuracion de usuarios que sea requerido por la empresa. Deben poner IIS_IUSRS con esto deberia ser suficiente, pero si lo requieren tambien agreguen el usuario IUSR. 

IIS_IUSRS; IUSR

Luego "Check names"

Aceptar, y agregar el permiso de "Modify"


Ahora copiamos nuestra aplicacion de python en la carpeta "Python_app01"


Instalacion de ambiente Python
Descargar el instalable de python


Seleccionar "Customize installation", seleccionar "Add python 3.9 PATH"

Next

Install for all users y cambiar a otra direccion de carpeta (depende de sus requerimientos), en mi caso es mas facil de identificar la localizacion de python de esta forma.


Despues instalamos lo necesario para el funcionamiento de python
Abrimos la consola de CMD con permisos de administrador. En mi caso al ser un servidor WEB expuesto a internet no debe estar en dominio y deberia estar fiuncionando con otro usuario diferente al administrator. 

pip install wfastcgi
pip install flask
c:\python39\python.exe -m pip install --upgrade pip


Ejecutamos el siguiente comando:

wfastcgi-enable.exe

y guardamos la informacion que nos regresa:

"c:\python39\python.exe|c:\python39\lib\site-packages\wfastcgi.py"


Ahora creamos un sitio web nuevo, todo depende de para que requieran su servidor, si publicaran en diferentes sitios, diferentes puertos, diferentes dominios, etc.. en mi caso hare la publicacion en un nuevo puerto sin especificar dominio.

click derecho en "site", "add website", ponemos un nombre para este sitio asi como la direccion local donde se encuentra el sitio de Python/Flask. y puerto en caso de requerir alguno diferente al puerto 80.


Ahora debemos configurar el sitio para ejecutar la aplicacion de python/Flask

En este tutorial me encontré con varios problemas, vi algunos archivos we.config que compartieron y en una primera prueba en windows 10, no funcionó y cambie a windows 2016. En esa instalación funcionó correctamete la configuracion y no tuve ningun problema. Pero al replicar una segunda vez para este tutorial no pude utilizar el mismo web.config por lo que tengo una alternativa en caso de que les falle la forma facil de crear el web.config.

En la carpeta donde se encuentra su sitio web, deben crear un archivo llamado "web.config".
Nota: deben configurar su explorador para que puedan ver las extensiones de los archivos y poder crearlo como debe ser. 

C:\sitiosweb\python_app01 - Carpeta donde se encuentra su sitio web
mysite.app - Utilizar el nombre del script python
c:\python39\python.exe|c:\python39\lib\site-packages\wfastcgi.py - esto viene de la ejecución wfastcgi-enable.exe, ver en las imegenes de arriba.
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <directoryBrowse enabled="false" />
        <defaultDocument>
            <files>
                <add value="mysite.py" />
            </files>
        </defaultDocument>
    </system.webServer>
    <appSettings>
        <add key="PYTHONPATH" value="C:\sitiosweb\python_app01" />
        <add key="WSGI_HANDLER" value="mysite.app" />
        <handlers>
            <add name="Python FastCGI" path="*" verb="*" modules="FastCgiModule" scriptProcessor="c:\python39\python.exe|c:\python39\lib\site-packages\wfastcgi.py" resourceType="Unspecified" requireAccess="Script" />
        </handlers>
    </appSettings>
</configuration>
Crean el archivo y como prueba. Deben abrir el "handler mapping", no debe mostrarles ningun error.

 
debe existir Python FastCGI en la lista. Si existe es hora de probar el sitio. 
                                         

El sitio deberá funcionar. 



Si tuvieron algun error, deben borrar el archivo web.config y crear la configuracion de forma manual.


Workaround.




Agregar nombre del documento por default. Agregar el nombre de la aplicacion python. Esto es para que cuando entren directamente a la URL y puerto, se abra la aplicacion. En otros manuales he visto que piden listar todo los archivos como si fuera una carpeta virtual y luego seleccionar la aplicacion. No es recomendable hacerlo.

Luego en Handler Mapping, agregar lo siguiente:
Request path: *
Module: FastCgiModule
Executable: c:\python39\python.exe|c:\python39\lib\site-packages\wfastcgi.py <- Es el resultado obtenido.
Name: Nombre que ustedes quieran para recordar el modulo de python.
En Request Restrictions: Remover la opcion seleccionada de "Invoke handler only request is mapped to"






En "configuration Editor"
agregar:
PYTHONPATH - C:\sitiosweb\python_app01
WSGI_HANDLER - mysite.app

Podran ver al final que se crea nuevamente el archivo web.config.
Con esto deberian ejecutar la aplicacion de python/flask correctamente









Comentarios

Entradas más populares de este blog

Flask / Python. Pagina web de ejemplo.

Flask / Python.  Pagina web de ejemplo. Como inicio deben instalar Flask en el ambiente python. pip install flask Cuando ejecuten python automaticamente se generara su servidor web y podra ser accesible desde la URL  http://localhost:5000/ Escribir en el programa en un archivo y ejecutar. from flask import Flask app=Flask(__name__) @app.route('/') def home():     return "Website Content goes here!!" if __name__ == "__main__":     app.run(debug=True) Como pueden ver es un script simple para utilizar todo el pontencial de python en aplicaciones web. Podemos comprobar que funciona el servidor.  En caso de probar en un servidor de produccion con Windows 2016 y IIS. ver Flask/Python en Windows server Como ejemplo:  

Comando Basicos de configuracion inicial de Switches Dell

Configuración Switch DELL Cambiar de Modo usuario a modo privilegiado console> enable Cambiar de modo privilegiado a Modo configuración console# configure Para cambiar el nombre al equipo console(config)# hostname “nombre del equipo” “nombre equipo”(config)# Poner password para cambiar de modo usuario a modo privilegiado console(config)# enable password “password” Poner IP console(config)# interface vlan 1 console(config-if)# ip address “IP” “Mascara de subred” Habilitar el modo de configuracion por WEB console(config)# ip http server Para Poner un nombre de usuario, contraseña y nivel para entrar por Web console(config)# username “usuario” password “contraseña” 15 Este manual lo tenia hace unos años, por lo que pueden revisar esto en la  Guia de comandos Dell PowerConnect  Espero les sea de utilidad.