apache python cgi_Apache 中运行 Python CGI 程序

Web 程序我还是喜欢用 Apache 来作为入口,因为我用的系统是 Mac OS, Apache 它就静静的躺上那儿了。最好是都像 PHP 那样的程序,无需启动额外的服务,这种使用方式的缺陷是不太适合于做微服务。

这儿呢,我也是来探索如何在 Apache 中运行 Python 的 CGI 程序,这主要是涉及了 Apache 与 Python 的集成。集成方式有直接集成(mod_python),CGI,FastCGI, WSGI 和 uWSGI。本文主要是讲如何运行一个简单的 Python CGI。

直接集成(mod_python)

虽然由于多方面的安全因素,这已经成为历史了,但还是提一下。参见

需要安装模块 mod_python.so,并在 httpd.conf 加上相关的配置

1

2

3

4

5

6

7

LoadModulepython_modulemodules/mod_python.so

AddHandlermod_python.py

PythonHandlermod_python.publisher

PythonDebugOn

程序代码示例(创建在 /home/www/html/mptest.py)

1

2

3

4

5

6

frommod_pythonimportapache

defhandler(req):

req.content_type='text/plain'

req.send_http_header()

req.write("Hello World!")

returnapache.OK

通过 http://localhost/mptest.py/handler 来访问,内空肯定是 Hello World 了。相信 mod_python 也提供了不少处理请求参数的函数。

CGI

这是本文希望重点强调的部份。本人所使用的系统是 mac OS High Sierra, 自带的 Apache 是

httpd -v

Server version: Apache/2.4.33 (Unix)

Server built: Apr 3 2018 23:45:11

不同版本的 Apache 配置上会略有不同,随后稍有提及,Linux 发行版下的 Apache 请作参考。

最简单的配置方式是,打开 /etc/apache2/httpd.conf 文件,找到下行并移除起始的注释符号 #, 最终是

1

LoadModulecgi_modulelibexec/apache2/mod_cgi.so

Mac 下的 libexec/apache2 的绝对目录是 /usr/libexec/apache2。

不同系统下可能要启用的模块是 mod_cgid.so, 它与 mod_cgi.so 在配置上没什么差别,d 代表 Daemon。不启用该模块的话,访问的脚本文件将不被解释器执行,而是直接显示源代码去客户端。

mod_cgi 或 mod_cgid 可以支持系统任意的脚本,如 sh, perl, ruby 等,反正都是根据第一行的指示交给相应的脚本解释器,最后获得输出。

默认目录放置 Python 脚本

在 Mac 下的只需要在目录 /Library/WebServer/CGI-Executables 目录下创建文件 hello.py, 内容如下

1

2

3

4

5

6

#!/usr/local/bin/python3

print("Context-type:text/html")

print("")

print("

Hello Python CGI

")

这是依照 HTTP 的标准响应格式,头与体之间空行分隔。注意 Shebang 注释行(第一行),要指定 python3 解释器的路径,爱用 python 2 也无妨。但是用 #!/usr/bin/env python3 却不行,只适于运行为 shell。

hello.py 文件必须是可执行,用以下命令修改

1

sudochown+r/Library/WebServer/CGI-Executables/hello.py

重启 Apache

1

sudoapachectl-krestart#-k 可检查配置中的语法错误

测试

curl -i http://localhost/cgi-bin/hello.py

HTTP/1.1 200 OK

Date: Sat, 10 Nov 2018 07:21:38 GMT

Server: Apache/2.4.33 (Unix)

Context-type: text/html

Transfer-Encoding: chunked

Hello Python CGI

为什么把可执行的 hello.py 丢到目录 /Library/WebServer/CGI-Executables 中就行了呢?因为在 /etc/apache2/httpd.conf 有这样的配置

1

2

3

4

5

6

7

ScriptAliasMatch^/cgi-bin/((?!(?i:webobjects)).*$)"/Library/WebServer/CGI-Executables/$1"

AllowOverrideNone

OptionsNone

Requireallgranted

配置自己的 Python 脚本目录

前面是把 hello.py 放置在默认的目录中,我们也可以在自定义的目录中安装 Python CGI 脚本。比如用下面的配置

1

2

3

4

5

6

7

ScriptAlias/py-cgi/"/Users/yanbin/python/cgi-bin/"

AllowOverrideNone

Options+ExecCGI

Requireallgranted

AddHandlercgi-script.py# Mac 下这一行不是必须的

需要事先创建好目录 /Users/yanbin/python/cgi-bin,然后把先前的 hello.py 放到该目录中。对于 Apache 2.4 之前的版本

1

Requireallgranted

要替换成

1

2

Orderallow,deny# 逗号后不能用空格

Allowfromall

然后重启 Apache 后,访问 http://localhost/py-cgi/hello.py 得到相同的结果。

注:任何 Apache 的访问错误请一定要查看它的错误日志文件, Mac 下的日志文件位置是 /var/log/apache2/error_log, 这个比 Google 都更好使。

FastCGI

这个在 Mac 下现在不好用了,以下命令都失效了

1

brewinstallhomebrew/apache/mod_fcgid

说是

Error: homebrew/apache was deprecated. This tap is now empty as all its formulae were migrated.

1

2

brewinstallmod_fastcgi

brewinstall--with-homebrew-httpd24mod_fastcgi

上面两个命令都找不到想要安装的组件,倒是有一个fcgi 不知道是什么

1

brewinstallfcgi

安装之后找不到想要的 mod_fcgid.so 或 mod_fcgi.so,有一个 cgi-fcgi 可执行文件, 以及其他的如 fastcgi.h 和 .a, .dylib 静态,动态库。

像 Apache, FastCGI and Python 中介绍的, Debian 系列的 Linux 可以用如下命令安装和启用

1

2

# apt-get install libapache2-mod-fastcgi

# a2enmod fastcgi

根据 https://github.com/Homebrew/homebrew-core/issues/18732,说是 mod_fastcgi 和 mod_fcgi 已经被 mod_proxy_fcgi 替代了,而 Mac 中的  Apache 是带有这个模块的

1

#LoadModule proxy_fcgi_module libexec/apache2/mod_proxy_fcgi.so

只需要取消注释就能用了。并且提到 mod_wsgi 的安装可以用命令

1

APXS=/usr/local/bin/apxspipinstallmod_wsgi

关于 FastCGI 结合 Python 的方式就不再深入了。接下来会关注 WSGI,以及集成 Flask。从上面看来搭建服务器使用 Mac 比 Linux 更具有挑战性,谁让 Mac Server 版基本没有份额。

相关推荐

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:1024 设计师:我叫白小胖 返回首页

打赏作者

weixin_39613089

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值