我是一名 PHP 程序员,但我想学习 Python。我对如何实际执行脚本有点困惑。我在 Web 服务器根目录中创建了 test.py,在文件中我写了以下内容:
#!/usr/bin/python
import jon.cgi as cgi
import jon.fcgi as fcgi
print "Content-type: text/html"
print "hello world"
我的服务器在 CentOS 5 上运行 Litespeed,按照以下教程进行操作:http://www.litespeedtech.com/support/wiki/doku.php?id=litespeed_wiki:python_fcgi我已经安装了 Jon 的 CGI。
但是当我在浏览器中导航到脚本时,它只会打印完整代码,好像它没有解析它一样。抱歉,如果我问了一个愚蠢的问题,我真的很感激任何帮助,谢谢。
答案1
真正的答案需要更多的信息(相关路径、配置块、您的 *.py 是否可执行、配置后是否重新启动等),所以我会尽我所能,但首先......
与 PHP 不同,PHP 本身在解释器中内置了 fastCGI,而 Python 不会向您隐藏 fastCGI 实现。从最基本的层面上讲,此 test.py 设置了无效的标头(\r\n
换行符是强制的) 并且缺少标题和正文之间必需的空白行。这些都是req.set_header()
和req.write()
函数(如示例中所示)处理的事情。
其次,您必须编写一个“永远”运行的 fastCGI 应用程序(或者直到达到最大请求数,服务器终止它并启动另一个请求)。与 PHP 不同,没有像“php-cgi”这样的“python-cgi”(无论如何,我知道……)可以永远运行并通过运行来自各种文件的少量源代码来处理请求。
该应用程序将具有一个请求处理程序函数,该函数针对每个请求调用,并负责读取和处理实际请求。在给出的示例的情况下,创建了Handler
类(它是的子类cgi.Handler
),并用于构造一个 fastCGI 服务器,其run()
方法被调用来处理问题的“永久运行”部分。该类添加了一个process()
成员,该成员接受请求并执行某些操作。这个“操作”就是您的 hello world 代码所在的地方。
根据您链接的示例中配置,当浏览器转到 时,litespeed 将尝试通过 上的套接字文件http://vhost.example.com/python/banana/apple.jpg
连接到现有进程(或运行 demoapp.py 程序,然后在必要时进行连接)。连接后,它会使用 fastCGI 协议告诉正在运行的应用程序它有一个via请求(我/absolutepathto/demoapp.py
/tmp/lshttpd/mypythonfcgi.sock
banana/apple.jpg
REQUEST_URI
思考。它可能是 /python/banana/apple.jpg 或类似的东西。使用给出的示例转储请求并查看)。由process()
成员函数决定如何处理banana/apple.jpg
请求。与普通 PHP 不同,URL 不一定对应于单个源代码片段。(尽管您可以编写一个使用 REQUEST_URI 来执行其他 python 程序的 python 程序。)
另请注意,此 /absolutepathto/fastcgiapp.py 传统上位于服务器文档根目录之外,以便人们不会意外下载应用程序本身。
现在,至于为什么您的脚本被打印出来,而不是抛出一个糟糕的标题错误、给您一个空白页或只是崩溃。主要怀疑是以下三个之一:
- 你的“
/absolutepathto/test.py
”不可执行(尽管我确信这会导致错误) - litespeed 中的虚拟主机未将 test.py 配置为“外部应用程序”(这也可以在所有虚拟主机的服务器级别进行配置)
- 该虚拟主机上的 URI 未配置为将请求路由到步骤#2 中配置的“外部应用程序”。
- 你在更改 #2 和 #3 的配置后没有重新启动 litespeed 吗?(不是主要怀疑对象,但必须问)
如果不是#1 或#4,请使用相关的 litespeed 配置更新问题,然后我们从那里开始。