Apache2.4终于运行python脚本......但为什么呢?

时间:2015-03-07 20:58:13

标签: python apache

我花了很长时间才弄明白如何让Apache2.4运行我的" Hello,world!" python脚本。我终于找到了在命令行中运行的命令序列,以使脚本正常工作。不幸的是,当我运行这些命令时,我仍然不明白正在发生什么。我想知道为什么他们让我的脚本工作。我知道这一切都在文档中,但到目前为止,我觉得有点难以理解那里写的内容。

这是我使用的命令列表。

  1. sudo apt-get install apache2
  2. sudo a2dismod mpm_event
  3. sudo a2enmod mpm_prefork
  4. sudo service apache2 restart
  5. sudo a2enmod cgi
  6. sudo service apache2 restart
  7. 对第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。

2 个答案:

答案 0 :(得分:0)

  1.   

    事件多处理模块(MPM)旨在提供更多功能   要求通过假冒一些处理同时提供服务   努力支持线程,释放主线程来处理新线程   要求。   http://httpd.apache.org/docs/2.2/mod/event.html

  2.   

    这个多处理模块(MPM)实现了非线程,   预先分叉的Web服务器。每个服务器进程可以应答传入   请求和父进程管理服务器池的大小。它   适用于需要避免线程化的站点   与非线程安全库的兼容性。它也是最好的MPM   用于隔离每个请求,以便单个请求出现问题   不会影响任何其他。   http://httpd.apache.org/docs/current/mod/prefork.html

  3. 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框架一起使用 - PyramidFlaskDjango等; WSGI应用程序比CGI更有效。