Cómo configurar Python en FastCGI en IIS
Aquí se explica cómo configurar Python en FastCGI IIS 7+ con el camino abierto para una configuración decente de DJango
... y poder enganchar un depurador en el proceso que le permita avanzar a través de su código Python
Este ejemplo no usa la consola de administración de IIS pero enumera el contenido de los archivos de configuración resultantes
Paso 1
Instale Python + un buen depurador (este ejemplo usa WingIDE, que encontré una herramienta excelente) Este ejemplo asume la carpeta c: \ python27
Paso 2
Cree una carpeta web, por ejemplo, en localhost c: \ inetpub \ wwwroot \ mypythonfolder y coloque el siguiente archivo web.config en ella:
Tenga en cuenta el | carácter de canalización en la directiva scriptProcessor. IIS lo utiliza para asignar el script a una aplicación fastCgi (paso 3). Debe coincidir carácter por carácter con la configuración de ruta completa + carácter de tubería + argumentos del paso 3 a continuación.
Paso 3
En el archivo applicationHost.config en la carpeta c: \ windows \ system32 \ inetsrc \ config, coloque lo siguiente en la sección:
<fastCgi>
<application fullPath="c:\python27\python.exe" arguments="c:\python27\lib\mylib\myfcgi.py" monitorChangesTo="C:\Python27\Lib\r4a\r4afcgi.py" stderrMode="ReturnStdErrIn500" maxInstances="4" idleTimeout="300" activityTimeout="300" requestTimeout="90" instanceMaxRequests="200" protocol="NamedPipe" queueLength="1000" flushNamedPipe="true" rapidFailsPerMinute="10" />
</fastCgi>
Paso 4
En c: \ python27 \ lib \ mylib \ myfcgi.py ponga el siguiente código:
import wingdbstub
import os, io, sys ret = "ambiente: \ r \ n" para param en os.environ.keys (): ret = ret + "% s =% s \ r \ n"% (param, os.environ [ param]) ret = ret + "\ r \ nArgs:" para arg en sys.argv: ret = ret + arg handle = io.open ("c: \ temp \ myfcgi.log", 'wb') handle.write (ret) handle.close ()
Paso 5
Asegúrese de que IUSR tenga derechos para escribir en su carpeta c: \ temp
Paso 6
Coloque wingdbstub.py y wingdebugpw en su carpeta c: \ python27 \ lib \ mylib \. Esto permitirá la depuración en wingide. Estos archivos se proporcionan con la instalación de su ala. Nota: si Python también necesita compilar su código en wingstub.pyc, IUSR necesita derechos de escritura en esa carpeta ya que IIS lanzará el proceso de Python bajo esa cuenta
Paso 6
Abra wingdb y establezca un punto de interrupción en la línea 'import os, io, sys'
Paso 7
Presiona en tu navegador http: // localhost / mypythonfolder
Si todo funciona correctamente, ahora se debe activar wingide para mostrar el código de ejecución en su punto de interrupción. De lo contrario: hay un problema con el firewall. El proceso de python se comunica con la interfaz WingIDE a través de una conexión tcp, o hay un problema con la seguridad dentro de wingide. Necesita la versión adecuada del archivo wingdebugpw, que básicamente contiene una contraseña o token que valida el acceso contra su instalación de wingide. Si este no fuera el caso, cualquier persona con acceso tcp a su PC podría depurar su código.
Paso 8
Verifique que en c: \ temp se cree el archivo de registro. Esto también debería funcionar si no puede iniciar el paso 7
Paso 9
Tenga en cuenta que esta página activa el depurador pero no devuelve ninguna página al navegador web. Algunos antecedentes: el servidor web comunica fastcgi a través de los llamados 'registros'. Esto significa que cada solicitud de usuario entra en su aplicación empaquetada en múltiples 'registros' separados. Cada registro es una estructura de datos que indica el comienzo de una solicitud, la cadena de consulta, las variables de publicación, etc. El desempaquetado de estos registros en una sola solicitud es algo engorroso, sigue la especificación fastcgi de
http: //www.fastcgi .com / devkit / doc / fcgi-spec.html # S1
Como contenido de c: \ python27 \ lib \ mylib \ myfcgi.py, acabo de dejar caer una copia de zoofcgi.py proporcionada por helicontech. Este archivo de Python puede decodificar estos registros y servir una página y es bastante interesante para depurar. También tenga en cuenta que helicontech opcionalmente proporciona un dll que se encuentra entre IIS y zoofcgi.py, pero este dll no es estrictamente necesario. Creo que implementa una versión ligeramente mejorada y genérica de la implementación fastcgi que ofrece msft. Sin embargo, cuando usa su dll, cuando desea recorrer su código, el proceso finaliza bastante rápido e IIS / la DLL mata su proceso de Python cuando concluye que no hay respuesta en un segundo o segundo.
Eso es. En principio, la comunicación entre IIS y su código de Python se realiza con canalizaciones con nombre. Debería poder configurarlo usando sockets tcp pero no pude averiguar qué puerto se usa (creo que el stdin debe transformarse en el puerto que luego se puede seleccionar () ed pero no di eso cualquier intento)