python - ¿Cómo implemento una aplicación Flask en IIS?
iis-6 wsgi (3)
Descripción general de alto nivel
HTTP -> IIS -> ISAPI -> FastCGI -> WSGI (aplicación Flask)
Pasos de configuración
Paso 1: Instala los binarios requeridos
- Instalar Python (2.7 o 3.x - utilicé 3.3)
- Instalar pip-Win (utilicé la versión 1.6)
- Instalar pywin32 (utilicé la versión 218)
- Instale la extensión IIS FastCGI con fcgisetup 1.5
Paso 2: Instala paquetes binarios opcionales
Instalé pyodbc
usando el instalador .exe desde este sitio . La instalación desde el origen (por ejemplo, pip, para instalar en un entorno virtual) requiere un compilador C / C ++.
Paso 3: Obtenga una copia de wfastcgi.py
Elija una versión que funcione para usted, preferiblemente una que admita Python 3.3 (utilicé la de David Ebbo ). Es posible que desee la versión "oficial" de aquí .
Instale el script wfastcgi.py
en C:/Inetpub/wwwroot
y asegúrese de que la cuenta que servirá a su aplicación ("Servicio de red" por defecto) tenga acceso de lectura a él.
Paso 4: Instalar virtualenv
en el sistema site-packages
C:/Python33/Scripts/pip.exe install virtualenv
(si está usando Python 3.3 e instaló todo en la ubicación predeterminada)
Paso 5: Instale su aplicación de matraz
Puede instalar la aplicación en cualquier lugar del sistema. Es posible que desee instalarlo en
C:/Inetpub
. Para este tutorial, llamaremos a la carpeta raíz de la instalación de su aplicación%APPROOT%
. (No ponga comillas en la variable de entorno).Asegúrese de que la cuenta que servirá a su aplicación ("Servicio de red" de forma predeterminada) tenga acceso de lectura a todos los archivos de script. Este comando:
cacls "%APPROOT%" /S:"D:PAI(A;OICI;FA;;;BA)(A;OICIIO;FA;;;CO)(A;OICI;0x1200a9;;;NS)(A;OICI;FA;;;SY)"
le dará a su directorio de aplicaciones los siguientes permisos:
- BUILTIN / Administrators: control total de esta carpeta, subcarpetas y archivos
- PROPIETARIO DE CREADOR: control total solo para subcarpetas y archivos
- AUTORIDAD DE NT / SERVICIO DE RED: permisos de lectura para esta carpeta, subcarpetas y archivos
- NT AUTHORITY / SYSTEM: control total de esta carpeta, subcarpetas y archivos
Agregue cualquier configuración local necesaria (mi aplicación utiliza un archivo local.cnf que el sistema de control de versiones ignora), por ejemplo, URL de base de datos.
Asegúrese de que su aplicación contenga un archivo
Web.config
en%APPROOT%
; consulte la sección a continuación para obtener información sobre el formato del archivo.
Paso 6: crea un virtualenv para tu aplicación
C:/Python33/Scripts/virtualenv.exe --system-site-packages "%APPROOT%/env"
(Elija un nombre que no sea env
si su aplicación ya usa ese directorio).
Paso 7: Instale los paquetes requeridos por su aplicación para el virtualenv
cd "%APPROOT%"
env/Scripts/activate
pip install -r Packages
(Mi proyecto mantiene la especificación de requisitos en un archivo llamado Packages
).
Paso 8: crea un sitio web o directorio virtual para tu aplicación
Use inetmgr.msc
( Inicio -> Ejecutar ... , luego ingrese inetmgr
en el cuadro de edición y presione ENTER ) para iniciar el Administrador de Internet Information Services (IIS) . Asegúrese de establecer la ruta local para el nodo (Sitio web o Directorio virtual) que cree en la carpeta raíz de su aplicación Flask. wfastcgi.py
usa la ruta local para identificar la aplicación Flask para manejar las solicitudes.
Proporcione permisos de lectura y de script ( ejecutar scripts ) para el nodo.
Paso 9: Configura fcgiext.ini
Este archivo se encuentra en el mismo directorio que fcgiext.dll
instalado en el Paso 1 (de forma predeterminada, %SYSTEMROOT%/system32/inetsrv
).
Al configurar este archivo, necesita varios parámetros:
- {identificador del sitio} : la identificación numérica del sitio que puede encontrar en el panel de detalles (mano derecha ) del Administrador de servicios de información de Internet (IIS) cuando se selecciona "Sitios web" en el árbol en el lado izquierdo de la ventana.
- {nombre de la aplicación} : el nombre de la sección dentro de
fcgiext.ini
que proporciona los parámetros para el controlador FastCGI (ISAPI). Usted elige este valor: seleccione algo que represente su aplicación. - {ruta a la aplicación} : para un directorio virtual, se debe manejar la ruta URL dentro del sitio web al directorio virtual.
- {approot} : la ruta al directorio raíz de su aplicación.
Use esos parámetros para:
Asigne las solicitudes de FastCGI a una sección de manejo:
- Para un sitio web completo, agregue
*: {site id} = {application name}
a la sección[Types]
. - Para un directorio virtual, agregue
*:/lm/w3svc/ {site id} /root/ {path to app} = {application name}
a la sección[Types]
.
- Para un sitio web completo, agregue
Agregue una sección de manejo (
[ {application name} ]
) con parámetros para esta aplicación ( referencia completa ):-
ExePath= {approot} /env/python.exe
-
Arguments=C:/Inetpub/wwwroot/wfastcgi.py
(o donde esté instalado el script del adaptadorwfastcgi.py
) -
EnvironmentVars=ENV_VAR1:value,ENV_VAR2:value, etc.
(consulte la referencia completa para reglas de cotización). Este es un buen lugar para establecer su variable de entorno WSGI_LOG : asegúrese de que la cuenta que sirve el sitio ("Servicio de red" de forma predeterminada) tenga permisos de escritura para el archivo y (si el archivo no existe) permiso para agregar un archivo a el directorio que contiene
-
Paso 10: configurar FastCGI Handling para las URL de destino
Utilizando el Administrador de Internet Information Services (IIS) , seleccione "Propiedades ..." en el menú contextual (clic con el botón derecho) del nodo (Sitio web o Directorio virtual) a ser atendido por su aplicación Flask y:
En la pestaña "Directorio de inicio" (Sitio web) o "Directorio virtual" (Directorio virtual), haga clic en el botón "Configuración ...".
En la sección "Mapas de la aplicación de comodines", use el botón "Insertar ..." para agregar una asignación de comodines:
- El ejecutable es la DLL de extensión FastCGI instalada en el Paso 1. Su ubicación predeterminada es
%SYSTEMROOT%/system32/inetsrv/fcgiext.dll
. - Asegúrese de que "Verifique que el archivo existe" esté desmarcado . Las aplicaciones de Flask hacen su propio enrutamiento que no necesariamente tiene nada que ver con los archivos en el disco.
- El ejecutable es la DLL de extensión FastCGI instalada en el Paso 1. Su ubicación predeterminada es
Web.config
Este archivo está (en esta configuración) leído por wfastcgi.py
, no por IIS.
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<applicationSettings>
<add key=“PYTHONPATH” value=“”/>
<add key=“WSGI_HANDLER” value=“module.application”/>
</applicationSettings>
</configuration>
<add>
elementos<add>
agregan variables de entorno (os.environ
en Python).WSGI_HANDLER
debe especificarWSGI_HANDLER
: le dice awfastcgi.py
cómo localizar el objeto de la aplicación WSGI. Si el valor termina en "()",wfastcgi.py
llamará al objeto nombrado, esperando que devuelva un objeto de aplicación WSGI.PYTHONPATH
se gestiona especialmente:wfastcgi.py
realiza la expansión de variables (entorno) (utilizando la notación%VAR%
estándar de Windows) en el valor dePYTHONPATH
, luego divide el resultado en punto y coma y añade las entradas asys.path
antes de invocar la aplicación WSGI . Debido a quewfastcgi.py
cambia el directorio actual a la ruta especificada como ruta local del sitio web o directorio virtual antes de importar el módulo que contiene el objeto de aplicación WSGI, incluir una cadena vacía en PYTHONPATH hará que la búsqueda incluya su directorio de aplicación Flask como punto de partida También puede establecer PYTHONPATH enfcgiext.ini
(en cuyo caso está incluido ensys.path
por el intérprete y nuevamente porwfastcgi.py
).WSGI_RESTART_FILE_REGEX
proporciona una expresión regular de Python utilizada para filtrar las notificaciones de cambio de archivos para las rutas que deben desencadenar el reinicio del proceso del controlador FastCGI. Configure esto para que se dispare cuando cambien los archivos fuente o los archivos de configuración. Yo uso(?i).*/.(py|cnf|config)$
.WSGI_LOG
puede establecerse aquí, pero creo que está mejor configurado enfcgiext.ini
.
Para IIS 7
Algunas cosas con FastCGI cambiaron drásticamente con IIS 7. Comenzando con esta versión, FastCGI tiene soporte directamente a través de IIS y no está configurado a través de una extensión (es decir, el Paso 1.4 no es necesario y fcgiext.ini
no controla el comportamiento de FastCGI para IIS 7+ y no es necesario crearlo / editarlo). En su lugar, asegúrese de que CGI esté habilitado en Servicios de información de Internet en el Panel de control> Programas y características> Activar o desactivar las características de Windows .
Web.config
IIS 7 es la primera versión de IIS que lee configuraciones de configuración relacionadas con FastCGI desde el archivo Web.config
. Su archivo Web.config
deberá contener, dentro del elemento <configuration>
, un elemento <system.webServer>
que contenga un elemento <handlers>
que contenga un elemento <add>
con los atributos:
- ruta:
*
- verbo:
*
- módulos:
FastCgiModule
- resourceType:
Unspecified
- requireAccess:
Script
- scriptProcessor: el complicado
El scriptProcessor
Attribute
Este atributo del elemento <add>
debe contener la ruta completa al archivo .exe
intérprete Python que desea usar (el de la subcarpeta Scripts
de su Virtualenv Python) seguido de |
y luego la ruta completa al archivo wfastcgi.py
que está utilizando. Como estas rutas dependen de la configuración de la máquina en la que se ejecuta la aplicación, es posible que desee establecer este atributo como parte de su proceso de implementación.
Configuración de IIS Server-wide
- En
inetmgr
, haga clic en el nodo del servidor en el árbol y luego seleccione Configuración FastCGI en el panel central. Aparecerá una lista de pares de ejecutables / argumentos. - Agregue una entrada para las rutas completas de
python.exe
ywfastcgi.py
que está utilizando. Ambos deben darse de la misma manera que aparecen en el elemento<handlers>/<add>
en suWeb.config
. - Asegúrese de configurar la variable de entorno
PYTHONPATH
en la nueva entrada de la aplicación FastCGI para incluir la raíz de la base de código de su aplicación. El consejo sobre agregar una entrada vacíaPYTHONPATH
en<applicationSettings>
de suWeb.config
puede no aplicarse a esta versión de IIS.
¿Alguien puede ayudarme a ejecutar una aplicación Flask en IIS 6? Intenté usar isapi-wsgi, pero cuando visito la dirección del directorio virtual, aparece una página que dice "No se pudo encontrar el módulo especificado". ¿Hay otras opciones para esto?
A continuación se muestra el script de Python que escribí para isapi-wsgi. El Directorio virtual se creó y todo se veía bien en el Administrador de IIS, pero el sitio no funcionó.
from wof import app
import os
app.secret_key=os.urandom(24)
import isapi_wsgi
def __ExtensionFactory__():
return isapi_wsgi.ISAPISimpleHandler(app)
if __name__ == ''__main__'':
from isapi.install import *
params = ISAPIParameters()
sm = [ScriptMapParams(Extension="*", Flags=0)]
vd = VirtualDirParameters(Name="WOFPy_Sondes", Description="ISAPI-WSGI for WOFPY Sondes test", ScriptMaps=sm, ScriptMapUpdate="replace")
params.VirtualDirs = [vd]
HandleCommandLine(params)
Echa un vistazo a la página de Django sobre el tema. Me ayudó a configurar un proyecto de Django en funcionamiento, pero no debería ser tan diferente para una aplicación de Flask.
http://code.djangoproject.com/wiki/DjangoOnWindowsWithIISAndSQLServer
Nunca uso IIS, pero IIS admite gateway CGI, por lo tanto, debería poder adaptar CGI con WSGI.
IIS <--> CGI <--> WSGI
Para ejecutar un WSGI como un script CGI, puede usar el CGIHandler en la biblioteca estándar de Python.