Назад | Перейти на главную страницу

Как настроить Python с Lighttpd и FastCGI (например, PHP)

Запуская Lighttpd в Linux, я хотел бы иметь возможность выполнять скрипты Python так же, как я выполняю скрипты PHP.

Цель состоит в том, чтобы иметь возможность выполнять произвольные файлы сценариев, хранящиеся в каталоге WWW, например http://www.example.com/*.py.


Как я могу заставить его работать как PHP, выполняя любой скрипт в каталоге WWW, запрашивая его путь?

/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()

Интерпретатор PHP (FastCGI) был построен для запуска файлов PHP таким образом; т.е. он запускает один скрипт, затем забывает все его внутреннее состояние и запускается заново.

Python не был создан для этого.

Вы можете попытаться построить решение на основе флопа; ты бы __import__ запрошенный сценарий и вызвать в нем функцию handleRequest или аналогичную.

Вы можете «перезагрузить» модуль, чтобы обновить его: https://stackoverflow.com/questions/437589/how-do-i-unload-reload-a-python-module

Но вы не можете выгружать модули, поэтому использование памяти будет расти: https://stackoverflow.com/questions/3105801/unload-a-module-in-python