Como configurar o Python com o Lighttpd e o FastCGI (como o PHP)

6

Executando o Lighttpd no Linux, eu gostaria de poder executar scripts Python da mesma maneira que executo scripts PHP.

O objetivo é poder executar arquivos de script arbitrários armazenados no diretório WWW, por exemplo. http://www.example.com/*.py .

  • Eu não gostaria de gerar uma nova instância Python (intérprete) para cada solicitação (como feito no CGI regular, se não me engano), e é por isso que estou usando o FastCGI.

  • Seguindo a documentação do Lighttpd , o seguinte é a parte do FastCGI do meu arquivo de configuração. O problema é que ele sempre executa o script /usr/local/bin/python-fcgi para cada arquivo * .py, independentemente do conteúdo desse arquivo:

    http://www.example.com/script.py [output=>] "python-fcgi: test"

    (independentemente do conteúdo de script.py )

  • Não estou interessado em usar qualquer estrutura, mas simplesmente executar scripts [web] individuais.

Como posso fazê-lo agir como o PHP, executando qualquer script no diretório WWW solicitando seu caminho?

/etc/lighttpd/conf.d/fastcgi.conf:

server.modules += ( "mod_fastcgi" )

index-file.names += ( "index.php" )

fastcgi.server = (
    ".php" => (
        "localhost" => ( 
            "bin-path" => "/usr/bin/php-cgi",
            "socket" => "/var/run/lighttpd/php-fastcgi.sock",
            "max-procs" => 4, # default value
            "bin-environment" => (
                "PHP_FCGI_CHILDREN" => "1", # default value
            ),
            "broken-scriptfilename" => "enable"
          )
    ),
    ".py" =>
    (
        "python-fcgi" =>
        (
         "socket" => "/var/run/lighttpd/fastcgi.python.socket",
         "bin-path" => "/usr/local/bin/python-fcgi",
         "check-local" => "disable",
         "max-procs" => 1,
        )
    )
)

/usr/local/bin/python-fcgi:

#!/usr/bin/python2

def myapp(environ, start_response):
    start_response('200 OK', [('Content-Type', 'text/plain')])
    return ['python-fcgi: test\n']

if __name__ == '__main__':
    from flup.server.fcgi import WSGIServer
    WSGIServer(myapp).run()
    
por johndir 06.12.2011 / 16:58

1 resposta

2

O interpretador PHP (FastCGI) foi criado para executar arquivos PHP dessa maneira; ou seja, ele executa um script, esquece todo o estado interno e começa novamente.

O Python não foi criado para isso.

Você poderia tentar criar uma solução em cima do flup; você poderia __import__ o script solicitado e chamar uma função "handleRequest" ou similar.

Você pode "recarregar" um módulo para atualizá-lo: link

Mas você não pode descarregar módulos, então o uso da memória aumentará: link

    
por 13.12.2012 / 11:38