python iis-6 wsgi flask isapi-wsgi

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

  1. Instalar Python (2.7 o 3.x - utilicé 3.3)
  2. Instalar pip-Win (utilicé la versión 1.6)
  3. Instalar pywin32 (utilicé la versión 218)
  4. 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] .
  • 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 adaptador wfastcgi.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.

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 especificar WSGI_HANDLER : le dice a wfastcgi.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 de PYTHONPATH , luego divide el resultado en punto y coma y añade las entradas a sys.path antes de invocar la aplicación WSGI . Debido a que wfastcgi.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 en fcgiext.ini (en cuyo caso está incluido en sys.path por el intérprete y nuevamente por wfastcgi.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 en fcgiext.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 y wfastcgi.py que está utilizando. Ambos deben darse de la misma manera que aparecen en el elemento <handlers>/<add> en su Web.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ía PYTHONPATH en <applicationSettings> de su Web.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)



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.