如何使用 Lighttpd 和 FastCGI 设置 Python(类似 PHP)

如何使用 Lighttpd 和 FastCGI 设置 Python(类似 PHP)

在 Linux 上运行 Lighttpd,我希望能够像执行 PHP 脚本一样执行 Python 脚本。

目标是能够执行存储在 WWW 目录中的任意脚本文件,例如http://www.example.com/*.py


  • 我不想为每个请求都生成一个新的 Python 实例(解释器)(如果我没记错的话,就像在常规 CGI 中所做的那样),这就是我使用 FastCGI 的原因。

  • 下列的Lighttpd 的文档,以下是我的配置文件的 FastCGI 部分。问题是它总是/usr/local/bin/python-fcgi为每个 *.py 文件运行脚本,而不管该文件的内容如何:

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

    (无论 的内容如何script.py

  • 我对使用任何框架不感兴趣,只是简单地执行单独的[web]脚本。

我怎样才能使它像 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()

答案1

PHP(FastCGI)解释器以这种方式运行 PHP 文件;即,它运行一个脚本,然后忘记它的所有内部状态,然后重新启动。

Python 不是为此而构建的。

您可以尝试在 flup 之上构建解决方案;您会__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

相关内容