【问题标题】:Apache2.4 is finally running python script... but why?Apache2.4 终于运行 python 脚本了……但是为什么呢?
【发布时间】:2015-03-08 06:25:30
【问题描述】:

我花了很长时间才弄清楚如何让 Apache2.4 运行我的“你好,世界!”蟒蛇脚本。我终于弄清楚了我必须在命令行中运行什么命令序列才能使脚本正常工作。不幸的是,当我运行这些命令时,我仍然不明白发生了什么。我想知道为什么他们让我的脚本工作。我知道这一切都在文档中,但到目前为止,我发现那里写的内容有点难以理解。

这是我使用的命令列表。

  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

非常感谢第 2、3 和 5 步中的任何 cmets。

之后我在 /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 时,我得到了我的问候,世界!

我什至不必修改 apache2.conf、serve-cgi-bin.conf 或 000-default.conf

如果有更明显/更好/正确的方法来使用 Apache24 运行 python 脚本,我真的很想学习它。

附:如果在 Apache 上运行脚本时遇到问题,有人建议将 AddHandler cgi-script .py .cgi 添加到 /etc/apache2/conf-enabled/serve-cgi-bin.conf。但由于某种原因,它对我的​​情况没有任何影响。为什么?

附言我使用的是 Ubuntu 14.04。

【问题讨论】:

  • 您必须在脚本顶部有shebang 以指定要使用的解释器(在本例中为python)。您还必须使用chmod() 设置文件的执行权限,以便网络服务器可以执行它。只是将任何文件添加到 cgi-bin 中不会自动授予它执行权限。
  • 代码在没有第二行的情况下运行,但是apache无论如何都会给出500错误。
  • 更好的方法是将mod_wsgi与任何Web框架(Pyramid、Flask、Django等)一起使用
  • 谢谢。那么 mpm_event 和 mpm_prefork 呢,它们都是什么?

标签: python apache


【解决方案1】:
  1. 事件多处理模块 (MPM) 旨在允许更多 通过传递一些处理来同时服务的请求 致力于支持线程,释放主线程以处理新线程 要求。 http://httpd.apache.org/docs/2.2/mod/event.html

  2. 这个多处理模块 (MPM) 实现了一个非线程的、 预分叉网络服务器。每个服务器进程都可以回答传入的 请求,并且父进程管理服务器池的大小。它 适用于需要避免线程化的站点 与非线程安全库的兼容性。它也是最好的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 启用模块

由于某种原因,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,然后请求一个网页。

附:有人建议添加:

AddHandler cgi-script .py .cgi 

到 /etc/apache2/conf-enabled/serve-cgi-bin.conf 如果你遇到 在 Apache 上运行脚本时出现问题。但由于某种原因 在我的情况下没有任何区别。为什么?

看这里:

AddHandler 处理程序名称扩展名 [扩展名]

具有扩展名的文件将由指定的 处理程序名称。这个映射被添加到任何已经生效的, 覆盖同一个扩展已经存在的任何映射。为了 例如,要激活文件扩展名为 .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 行(第一行,以 #! 开头) http://httpd.apache.org/docs/current/mod/core.html

在同一页面上,有这个指令:

CGIMapExtension 指令

该指令用于控制 Apache httpd 如何找到 用于运行 CGI 脚本的解释器。例如,设置 CGIMapExtension sys:\foo.nlm .foo 将导致所有 CGI 脚本文件 要传递给 FOO 解释器的 .foo 扩展名。

【讨论】:

  • "apache 应该如何知道您使用的是哪种服务器端语言?"我希望 Apache 能够识别脚本的 .py 扩展名。
  • @TeikoAbe,在我的答案底部查看我的回复。
  • @7stud "除非管理员允许,否则无法执行文件。"可能想要将 administrator 更改为 user,因为(非管理员)用户可以为用户拥有的文件设置可执行标志。或者只是重写句子并指出需要设置可执行标志才能执行文件。
【解决方案2】:

mpm 代表Multi-Processing Module;基本上你用prefork替换了基于event的方法;这是 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,后跟内容。 1 个标题是强制性的:Content-Type。在这里,您要告诉网络服务器和浏览器,接下来是text/html 类型的文档。 '\n' 代表换行符。 (技术上你应该写

print "Content-type: text/html\n\n",

那里有一个逗号,否则你得到一个换行太多)。

默认情况下,*nix 中的文件没有+x execute bit - 这是一项安全功能;需要有意识的决定才能使某些东西可执行。


至于首选方法,由于您控制服务器,因此将 Apache mod_wsgi 与任何 Web 框架一起使用 - PyramidFlaskDjango 等; WSGI 应用程序比 CGI 更高效。

【讨论】:

    猜你喜欢
    • 2011-12-10
    • 1970-01-01
    • 1970-01-01
    • 2022-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-18
    • 2021-03-19
    相关资源
    最近更新 更多