Configurar aplicativos Web do Python para o IIS

Ao usar os Serviços de Informações da Internet (IIS) como um servidor Web em um computador Windows (incluindo máquinas virtuais do Windows no Azure), você precisa configurar o aplicativo Web Python para permitir que o IIS processe corretamente o código Python. A configuração é realizada por meio de ajustes no arquivo web.config para o aplicativo Web em Python. Este artigo descreve como definir as configurações necessárias.

Pré-requisitos

  • Python no Windows instalado. Para executar um aplicativo Web, primeiro instale a versão necessária do Python diretamente no computador host do Windows, conforme descrito em Instalar interpretadores do Python.

    • Identificar o local do interpretador python.exe. Para sua conveniência, você pode adicionar esse local à variável de ambiente PATH.
  • Pacotes necessários instalados. Para um host dedicado, você pode usar o ambiente global do Python para executar o aplicativo em vez de um ambiente virtual. Da mesma forma, você pode instalar todos os requisitos do aplicativo no ambiente global executando o comando pip install -r requirements.txt.

Configurar o web.config para apontar para o interpretador do Python

O arquivo web.config do aplicativo em Python instrui o servidor Web do IIS (versão 7 ou posterior) em execução no Windows sobre como ele deve tratar as solicitações do Python por meio de HttpPlatformHandler (recomendado) ou FastCGI. As versões do Visual Studio 2015 e anterior fazem essas modificações automaticamente. No Visual Studio 2017 e posterior, você deve modificar o arquivo web.config manualmente.

Se o projeto ainda não contiver um arquivo web.config, você pode adicionar um clicando com o botão direito do mouse no diretório do projeto, selecionando Adicionar > Novo Item e procurando por web.config ou criando um arquivo XML web.config em branco.

Configurar o HttpPlatformHandler

O módulo HttpPlatform passa conexões de soquete diretamente para um processo de Python autônomo. Essa passagem permite que você execute qualquer servidor Web que desejar, mas ela requer um script de inicialização que executa um servidor Web local. Essa abordagem é comumente feita usando um framework web Python, como Flask ou Django. Você especifica o script no elemento <httpPlatform> do arquivo web.config. O atributo processPath aponta para o interpretador Python da extensão do site. O atributo arguments aponta para o script de inicialização que executa um servidor Web local, neste caso, runserver.py, e quaisquer argumentos que você deseja fornecer:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.webServer>
    <handlers>
      <add name="PythonHandler" path="*" verb="*" modules="httpPlatformHandler" resourceType="Unspecified"/>
    </handlers>
    <httpPlatform processPath="c:\python36-32\python.exe"
                  arguments="c:\home\site\wwwroot\runserver.py --port %HTTP_PLATFORM_PORT%"
                  stdoutLogEnabled="true"
                  stdoutLogFile="c:\home\LogFiles\python.log"
                  startupTimeLimit="60"
                  processesPerApplication="16">
      <environmentVariables>
        <environmentVariable name="SERVER_PORT" value="%HTTP_PLATFORM_PORT%" />
      </environmentVariables>
    </httpPlatform>
  </system.webServer>
</configuration>

Neste exemplo, a variável de ambiente HTTP_PLATFORM_PORT contém a porta na qual o servidor local deve escutar as conexões do localhost. Este exemplo também mostra como criar outra variável de ambiente, SERVER_PORT. Você pode criar e atribuir variáveis de ambiente conforme necessário.

Configurar o manipulador do FastCGI

O FastCGI é uma interface que funciona no nível da solicitação. O IIS recebe conexões de entrada e encaminha cada solicitação para um aplicativo WSGI em execução em um ou mais processos Python persistentes.

Observação

É recomendável usar HttpPlatformHandler para configurar os aplicativos, pois o projeto WFastCGI deixou de receber manutenção.

Para usar o FastCGI, primeiro instale e configure o pacote wfastcgi, conforme descrito em pypi.org/project/wfastcgi/.

Em seguida, modifique o arquivo web.config do aplicativo para incluir os caminhos completos para o executável python.exe e o arquivo wfastcgi.py na chave PythonHandler. As etapas a seguir pressupõem que o Python esteja instalado na pasta c:\python36-32 e o código do aplicativo esteja na pasta c:\home\site\wwwroot. Ajuste esses valores para seus caminhos corretamente.

  1. Modifique a entrada PythonHandler no arquivo web.config para que o caminho corresponda ao local de instalação do Python. Para obter mais informações, confira Referência de configuração do IIS (iis.net).

    <system.webServer>
       <handlers>
         <add name="PythonHandler" path="*" verb="*" modules="FastCgiModule"
             scriptProcessor="c:\python36-32\python.exe|c:\python36-32\wfastcgi.py"
             resourceType="Unspecified" requireAccess="Script"/>
       </handlers>
    </system.webServer>
    
  2. Na seção <appSettings> do arquivo web.config, adicione chaves para WSGI_HANDLER, WSGI_LOG (opcional) e PYTHONPATH:

    <appSettings>
       <add key="PYTHONPATH" value="c:\home\site\wwwroot"/>
       <!-- The handler here is specific to Bottle; see the next section. -->
       <add key="WSGI_HANDLER" value="app.wsgi_app()"/>
       <add key="WSGI_LOG" value="c:\home\LogFiles\wfastcgi.log"/>
    </appSettings>
    

    Esses valores <appSettings> estão disponíveis para seu aplicativo como variáveis de ambiente:

    • O valor da chave PYTHONPATH pode ser estendido livremente, mas deve incluir a raiz do aplicativo.
    • A chave WSGI_HANDLER deve apontar para um aplicativo WSGI importável do seu aplicativo.
    • A chave WSGI_LOG é opcional, mas é recomendada para a depuração do aplicativo.
  3. Defina a entrada WSGI_HANDLER nos arquivos web.config de acordo com a estrutura que você está usando:

    • Bottle: inclua parênteses depois do valor app.wsgi_app conforme mostrado no exemplo. Os parênteses são necessários porque o objeto é uma função, não uma variável. Você pode ver a sintaxe no arquivo app.py.

      <!-- Bottle apps only -->
      <add key="WSGI_HANDLER" value="app.wsgi_app()"/>
      
    • Flask: altere o valor de WSGI_HANDLER para <project_name>.app, em que <project_name> corresponde ao nome do seu projeto. Você pode localizar o identificador exato examinando a instrução from <project_name> import app no arquivo runserver.py. Por exemplo, se o projeto fosse denominado FlaskAzurePublishExample, a entrada seria semelhante ao seguinte:

      <!-- Flask apps only: Change the project name to match your app -->
      <add key="WSGI_HANDLER" value="FlaskAzurePublishExample.app"/>
      
    • Django: duas alterações são necessárias no arquivo web.config para projetos do Django.

      • Altere o valor de WSGI_HANDLER para django.core.wsgi.get_wsgi_application(). O objeto está no arquivo wsgi.py.

        <!-- Django apps only -->
        <add key="WSGI_HANDLER" value="django.core.wsgi.get_wsgi_application()"/>
        
      • Adicione a seguinte entrada imediatamente após a entrada da chave WSGI_HANDLER. Substitua o valor DjangoAzurePublishExample pelo nome do projeto:

        <add key="DJANGO_SETTINGS_MODULE" value="django_iis_example.settings" />
        
  4. Somente aplicativos Django: no arquivo settings.py do projeto do Django, adicione o domínio de URL do site ou o endereço IP à entrada ALLOWED_HOSTS. Substitua "1.2.3.4" pelo seu URL ou endereço IP:

    # Change the URL or IP address to your specific site
    ALLOWED_HOSTS = ['1.2.3.4']
    

    Se você não adicionar o URL aos resultados da matriz, verá o seguinte erro:

    DisallowedHost at / Invalid HTTP_HOST header: '\<site URL\>'. You might need to add '\<site URL\>' to ALLOWED_HOSTS.
    

Quando a matriz está vazia, o Django permite automaticamente 'localhost' e '127.0.0.1' como hosts. Se você adicionar o URL de produção, esses sites de host não serão permitidos automaticamente. Por esse motivo, convém manter cópias do arquivo settings.py de desenvolvimento e de produção separadas ou usar variáveis de ambiente para controlar os valores de runtime.

Implantar IIS ou uma máquina virtual do Windows

Quando tiver o arquivo web.config correto no projeto, você pode publicar no computador que está executando o IIS do Gerenciador de Soluções. Clique com o botão direito do mouse no projeto, selecione Publicar e, em seguida, selecione IIS, FTP etc. Nessa situação, o Visual Studio copiará somente os arquivos de projeto para o servidor. Você é responsável por toda a configuração do lado do servidor.