目標は、WWWディレクトリに保存されている任意のスクリプトファイルを実行できるようにすることです。 http://www.example.com/*.py
。
すべてのリクエストに対して新しいPythonインスタンス(インタプリタ)を生成したくありません(間違っていない場合は、通常のCGIで実行されたように)ため、FastCGIを使用しています。
Lighttpdのドキュメント に続いて、以下は私の構成ファイルのFastCGI部分です。問題は、ファイルの内容に関係なく、すべての* .pyファイルに対して常に/usr/local/bin/python-fcgi
スクリプトを実行することです。
http://www.example.com/script.py [output=>] "python-fcgi: test"
(script.py
の内容に関係なく)
フレームワークの使用には興味がありませんが、個々の[web]スクリプトを実行するだけです。
パスをリクエストして、WWWディレクトリ内のスクリプトを実行して、PHPのように動作させるにはどうすればよいですか?
/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ファイルを実行するように構築されました。つまり、1つのスクリプトを実行し、その内部状態をすべて忘れてしまいます。再開する。
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