我花了很长时间才弄明白如何让Apache2.4运行我的" Hello,world!" python脚本。我终于找到了在命令行中运行的命令序列,以使脚本正常工作。不幸的是,当我运行这些命令时,我仍然不明白正在发生什么。我想知道为什么他们让我的脚本工作。我知道这一切都在文档中,但到目前为止,我觉得有点难以理解那里写的内容。
这是我使用的命令列表。
sudo apt-get install apache2
sudo a2dismod mpm_event
sudo a2enmod mpm_prefork
sudo service apache2 restart
sudo a2enmod cgi
sudo service apache2 restart
对第2步,第3步和第5步的任何评论都将受到高度赞赏。
之后我在/ usr / lib / cgi-bin中创建了script.py:
#! /usr/bin/python
print "Content-type: text/html\n\n"
print "Hello, world!"
由于某种原因,script.py的前两行是绝对必要的。如果没有它们,代码就无法运行。
最后我跑了:
sudo chmod +x /usr/lib/cgi-bin/script.py #why do I need this? how come it is not executable by default?
sudo service apache2 restart
当我致电http://localhost/cgi-bin/script.py时,我得到了我的Hello,世界!
我甚至不需要修改apache2.conf,serve-cgi-bin.conf或000-default.conf
如果使用Apache24运行python脚本有更明显/更好/更正确的方法,我真的很想学习它。
P.S。如果在Apache上运行脚本时遇到问题,有人建议将AddHandler cgi-script .py .cgi添加到/etc/apache2/conf-enabled/serve-cgi-bin.conf。但由于某些原因,它对我的情况没有任何影响。为什么呢?
P.P.S。我使用的是Ubuntu 14.04。
答案 0 :(得分:0)
事件多处理模块(MPM)旨在提供更多功能 要求通过假冒一些处理同时提供服务 努力支持线程,释放主线程来处理新线程 要求。 http://httpd.apache.org/docs/2.2/mod/event.html
这个多处理模块(MPM)实现了非线程, 预先分叉的Web服务器。每个服务器进程可以应答传入 请求和父进程管理服务器池的大小。它 适用于需要避免线程化的站点 与非线程安全库的兼容性。它也是最好的MPM 用于隔离每个请求,以便单个请求出现问题 不会影响任何其他。 http://httpd.apache.org/docs/current/mod/prefork.html
5)
a2enmod是一个启用指定模块的脚本 apache2配置。 http://manpages.ubuntu.com/manpages/lucid/man8/a2enmod.8.html
名称a2enmod
代表 apache2 enable module 。
由于某种原因,script.py的前两行是绝对的 必要的。
第一个告诉apache如何执行你的cgi脚本。毕竟,还有其他服务器端语言,如php,perl,ruby等。如何知道apache你知道使用哪种服务器端语言?
第二行输出HTTP标头,这是您可以使用的最简单的标头。标题需要在请求正文之前输出 - 这就是http协议的工作方式。
sudo chmod +x /usr/lib/cgi-bin/script.py
为什么我需要这个?为什么它默认不可执行?
除非管理员已授予此权限,否则无法执行文件。这是出于安全原因。
如果有更明显/更好/更正确的方式来运行python脚本 使用Apache24,我真的很想学习它。
您列出的大多数命令都是设置apache配置。每次执行cgi脚本时都不必运行这些命令。一旦配置了apache,您所要做的就是启动apache,然后请求一个网页。
P.S。有些人建议添加:
AddHandler cgi-script .py .cgi
到/etc/apache2/conf-enabled/serve-cgi-bin.conf如果遇到 在Apache上运行脚本时出现问题。但出于某种原因呢 在我的情况下没有任何区别。为什么呢?
见这里:
AddHandler handler-name extension [extension]
具有扩展名的文件将由指定的服务器提供 处理程序名。此映射已添加到任何已生效的映射中, 覆盖同一扩展已存在的任何映射。对于 例如,要激活文件扩展名为.cgi的CGI脚本,您 可能会使用:
AddHandler cgi-script .cgi
一旦将其放入您的httpd.conf文件中,任何包含的文件 .cgi扩展名将被视为CGI程序。 http://httpd.apache.org/docs/2.2/mod/mod_mime.html#addhandler
因此,当您添加AddHandler行时,它会覆盖某个位置执行相同操作的配置设置。
对评论的回应:
ScriptInterpreterSource指令
该指令用于控制Apache httpd查找的方式 用于运行CGI脚本的解释器。默认设置为脚本。 这会导致Apache httpd使用指向的解释器 脚本中的shebang line(第一行,以#!开头) http://httpd.apache.org/docs/current/mod/core.html
在同一页面上,有这个指令:
CGIMapExtension指令
该指令用于控制Apache httpd查找的方式 用于运行CGI脚本的解释器。例如,设置 CGIMapExtension sys:\ foo.nlm .foo将导致所有CGI脚本文件 一个.foo扩展名传递给FOO解释器。
答案 1 :(得分:0)
mpm
代表Multi-Processing Module;基本上你用event
替换了基于prefork
的方法;这是由Apache内部使用的,并且通常不会影响性能以外的任何东西(每个都有不同的性能特征),但有些东西与某些MPM不兼容,然后你需要更改它们。
cgi
模块是提供Common Gateway Interface的附加模块;它不再包含在Apache中了。
脚本的第一行是shebang;它告诉Unix / Linux内核使用什么程序作为解释器;那是; “请使用/usr/bin/python
运行此文件”。文件扩展名在* nix w.r.t可执行性中没有任何意义。
第二行是标题。 CGI规范说output shall be headers followed by an empty line,后面是内容。标题是必填项:Content-Type
。在这里,您告诉Web服务器和浏览器,以下是text/html
类型的文档。 '\n'
代表换行符。 (从技术上讲,你应该写
print "Content-type: text/html\n\n",
用逗号表示,否则你会得到一个新行。)
* nix中的文件默认情况下没有+x
execute bit - 这是一个安全功能;需要有意识地做出可执行的决定。
对于首选方法,由于您控制服务器,因此将Apache mod_wsgi
与任何Web框架一起使用 - Pyramid,Flask,Django等; WSGI应用程序比CGI更有效。