天天看点

Python+Apache+CGI完全配置

0.需求原因

    想在我的Linux上架设Apache来运行CGI程序,方便以后用Apache部署Python的Web应用,但遇到各种各样的问题,网上找的答案要么都太旧了(4/5年前跟现在已经差很多了),要么就不完整,所以这里总结一下,作为最新版本吧。

1.Apache安装

    采用的是源码编译安装的形式。首先要说明的是,要成功安装Apache,需要依次安装完下面的软件(函数库)才算是成功地安装了Apache:

(1)apr安装

第一步:解包

1

2

3

4

5

<code>xpleaf@leaf:~/下载$ </code><code>tar</code> <code>xvf apr-1.5.2.</code><code>tar</code><code>.gz </code>

<code>......</code>

<code>apr-1.5.2</code><code>/mmap/win32/</code>

<code>apr-1.5.2</code><code>/mmap/win32/mmap</code><code>.c</code>

<code>apr-1.5.2</code><code>/apr-config</code><code>.</code><code>in</code>

第二步:运行configure检测和设置编译选项

6

<code>xpleaf@leaf:~/下载</code><code>/apr-1</code><code>.5.2$ .</code><code>/configure</code> 

<code>config.status: creating include</code><code>/arch/unix/apr_private</code><code>.h</code>

<code>config.status: executing libtool commands</code>

<code>rm</code><code>: cannot remove </code><code>'libtoolT'</code><code>: No such </code><code>file</code> <code>or directory</code>

<code>config.status: executing default commands</code>

    正常情况下是没有问题的,如果出现问题,可以自行查找,这个好解决。

第三步:编译和安装

<code>xpleaf@leaf:~/下载</code><code>/apr-1</code><code>.5.2$ </code><code>make</code>

<code>xpleaf@leaf:~/下载</code><code>/apr-1</code><code>.5.2$ </code><code>sudo</code> <code>make</code> <code>install</code>

    OK,这样的话,apr就安装完成了。

(2)apr-util安装

    下载地址跟上面的是一样的,这里我下载的版本是:apr-util-1.5.4.tar.gz

    apr-util安装的步骤跟上面的差不多,不过有一步要注意的,就是在执行./configure命令的时候需要指定apr的安装目录:

7

8

<code>xpleaf@leaf:~/下载</code><code>/apr-util-1</code><code>.5.4$ .</code><code>/configure</code>

<code>checking whether gcc accepts -g... </code><code>yes</code>

<code>checking </code><code>for</code> <code>gcc option to accept ISO C89... none needed</code>

<code>Applying apr-util hints </code><code>file</code> <code>rules </code><code>for</code> <code>x86_64-unknown-linux-gnu</code>

<code>checking </code><code>for</code> <code>APR... no</code>

<code>configure: error: APR could not be located. Please use the --with-apr option.</code>

<code>#注意看上面的报错提示</code>

    先找到apr的安装目录:

<code>xpleaf@leaf:~/下载</code><code>/apr-util-1</code><code>.5.4$ </code><code>whereis</code> <code>apr</code>

<code>apr: </code><code>/usr/local/apr</code>

    再添加相应参数执行apr-util的./configure命令:

<code>xpleaf@leaf:~/下载</code><code>/apr-util-1</code><code>.5.4$ .</code><code>/configure</code> <code>--with-apr=</code><code>/usr/local/apr</code>

<code>config.status: creating </code><code>test</code><code>/Makefile</code>

<code>config.status: creating include</code><code>/private/apu_config</code><code>.h</code>

    这样的话预编译就算完成了,再执行下面的make和sudo make install:

<code>xpleaf@leaf:~/下载</code><code>/apr-util-1</code><code>.5.4$ </code><code>make</code>

<code>xpleaf@leaf:~/下载</code><code>/apr-util-1</code><code>.5.4$ </code><code>sudo</code> <code>make</code> <code>install</code>

    OK,这样的话,apr-util的安装也完成了。

(3)pcre安装

    这不是必需的,前提是你的系统原来已经安装了它的库,如果还没有安装的话,在你编译Apache的时候就会出现下面的错误提示:

    所以如果你也出现了这样的情况,请先下载安装pcre。

    这里我下载的版本是:pcre-8.38.tar.gz

    安装步骤跟上面的一样,而且这里也不会出现什么问题,直接给出步骤好了:

<code>xpleaf@leaf:~/下载$ </code><code>tar</code> <code>zxvf pcre-8.38.</code><code>tar</code><code>.gz </code>

<code>xpleaf@leaf:~/下载</code><code>/pcre-8</code><code>.38$ .</code><code>/configure</code>

<code>xpleaf@leaf:~/下载</code><code>/pcre-8</code><code>.38$ </code><code>make</code>

<code>xpleaf@leaf:~/下载</code><code>/pcre-8</code><code>.38$ </code><code>sudo</code> <code>make</code> <code>install</code>

    pcre也安装完之后,下面就可以真正安装Apache了。

(4)Apache安装

    在上面的三个软件安装完成之后,这下面才开始安装Apache.

    我下载的版本是:httpd-2.4.18.tar.gz

a.安装    

    只要上面的几步完成了,安装apache就比较容易了,依次执行下面的命令就可以了。

<code>xpleaf@leaf:~/下载$ </code><code>tar</code> <code>zxvf httpd-2.4.18.</code><code>tar</code><code>.gz </code>

<code>xpleaf@leaf:~/下载</code><code>/httpd-2</code><code>.4.18$ .</code><code>/configure</code> <code>--</code><code>enable</code><code>-module=shared</code>

<code>xpleaf@leaf:~/下载</code><code>/httpd-2</code><code>.4.18$ </code><code>make</code>

<code>xpleaf@leaf:~/下载</code><code>/httpd-2</code><code>.4.18$ </code><code>sudo</code> <code>make</code> <code>install</code>

b.参数说明

     需要注意的是,如果在执行./configure时没有指定apache的安装目录,默认是安装在/usr/local/apache2,你也可以通过下面的方式来查看它的安装目录:

<code>xpleaf@leaf:~$ </code><code>whereis</code> <code>apache2</code>

<code>apache2: </code><code>/usr/local/apache2</code>

    另外,上面在执行./configure时添加了-enable-module=shared参数,即通过把模块编译成动态共享对象,让Apache启动时动态加载,这样以后需要加载新模块时,只需在配置文件中设置即可。当然,为了这样的便捷性而损失一定的性能是否值得,个人衡量。所以这个参数你不加也是没有问题的。

c.无法启动的解决方案

    安装完成后,就可以启动了,因为采用的是编译安装,所以需要用下面的方式启动:

<code>xpleaf@leaf:~$ </code><code>sudo</code> <code>/usr/local/apache2/bin/apachectl</code> <code>start</code>

<code>/usr/local/apache2/bin/httpd</code><code>: error </code><code>while</code> <code>loading shared libraries: libpcre.so.1: cannot </code><code>open</code> <code>shared object </code><code>file</code><code>: No such </code><code>file</code> <code>or directory</code>

    但是你会发现又报错了,而且报的错为:无法加元libpcre.so.1库函数。

    libpcre.so.1,很熟悉的名字,前面不是已经安装了?确实是安装的,只是Apache没有找到它而已,查看一下:

9

10

11

<code>xpleaf@leaf:~$ ldd </code><code>/usr/local/apache2/bin/httpd</code> 

<code>    </code><code>linux-vdso.so.1 =&gt;  (0x00007ffdf9fe6000)</code>

<code>    </code><code>libpcre.so.1 =&gt; not found</code>

<code>    </code><code>libaprutil-1.so.0 =&gt; </code><code>/usr/local/apr/lib/libaprutil-1</code><code>.so.0 (0x00007f8192a47000)</code>

<code>    </code><code>libapr-1.so.0 =&gt; </code><code>/usr/local/apr/lib/libapr-1</code><code>.so.0 (0x00007f8192813000)</code>

<code>    </code><code>libpthread.so.0 =&gt; </code><code>/lib/x86_64-linux-gnu/libpthread</code><code>.so.0 (0x00007f81925f5000)</code>

<code>    </code><code>libc.so.6 =&gt; </code><code>/lib/x86_64-linux-gnu/libc</code><code>.so.6 (0x00007f819222b000)</code>

<code>    </code><code>libexpat.so.0 =&gt; </code><code>/usr/local/apr/lib/libexpat</code><code>.so.0 (0x00007f8192002000)</code>

<code>    </code><code>libcrypt.so.1 =&gt; </code><code>/lib/x86_64-linux-gnu/libcrypt</code><code>.so.1 (0x00007f8191dca000)</code>

<code>    </code><code>libdl.so.2 =&gt; </code><code>/lib/x86_64-linux-gnu/libdl</code><code>.so.2 (0x00007f8191bc6000)</code>

<code>    </code><code>/lib64/ld-linux-x86-64</code><code>.so.2 (0x00005637a587b000)</code>

    这时我们把pcre对应的该库函数软件链接到/lib目录就可以了:

<code>xpleaf@leaf:~$ </code><code>sudo</code> <code>ln</code> <code>-s </code><code>/usr/local/lib/libpcre</code><code>.so.1 </code><code>/lib</code>

    下面再启动试试:

<code>AH00558: httpd: Could not reliably determine the server</code><code>'s fully qualified domain name, using 127.0.1.1. Set the '</code><code>ServerName' directive globally to suppress this message</code>

    OK,这时再打开浏览器,经典的"It works"显示出来了:

    这样的话,Apache的安装也算是完成了,下面就说说CGI的配置。

2.CGI配置

    Apache支持CGI配置,下面就来详细说明配置的过程。

    找到安装Apache的目录/usr/local/apache2/conf,并对httpd.conf配置文件进行修改,如下面的说明:

(1)加载cgi模块

    大概在httpd.conf的137行:

<code>#LoadModule cgid_module modules/mod_cgid.so</code>

    去掉注释:

<code>LoadModule cgid_module modules</code><code>/mod_cgid</code><code>.so</code>

(2)设置cgi脚本文件路径

    大概在httpd.conf的329行:

<code>ScriptAlias </code><code>/cgi-bin/</code> <code>"/usr/local/apache2/cgi-bin/"</code>

    可以看到apache将"/usr/local/apache2/cgi-bin/"映射为/cgi-bin/,即当你通过浏览器访问/cgi-bin/目录时,实际上就是访问"/usr/local/apache2/cgi-bin/"目录,为了方便,我将其设置为如下:

<code>ScriptAlias </code><code>/cgi-bin/</code> <code>/home/xpleaf/Source_Code/cgi_for_py/</code>

    注意这里路径末尾一定要加/,否则apache是无法打到该路径下的文件的。

(3)设置cgi路径的访问权限

    大概在httpd.conf195行:

<code>&lt;Directory /&gt;</code>

<code>    </code><code>AllowOverride none</code>

<code>    </code><code>Require all denied</code>

<code>&lt;</code><code>/Directory</code><code>&gt;</code>

    将上面的内容全部修改为下面的内容:

<code>&lt;Directory </code><code>"/home/xpleaf/Source_Code/cgi_for_py/"</code><code>&gt;</code>

<code>   </code><code>AllowOverride None</code>

<code>   </code><code>Options +ExecCGI</code>

<code>   </code><code>Order allow,deny</code>

<code>   </code><code>Allow from all</code>

    注意这里的目录是修改为前面我们改的:/home/xpleaf/Source_Code/cgi_for_py/

    这样的修改是有原因的,如果没有在这里设置权限,当你在浏览器中访问你的cgi脚本文件时,得到的可能是这样的提示:

Forbidden

You don't have permission to access /cgi-bin/hello.py on this server.

(4)设置apache可解释python的cgi脚本文件

    大概在httpd.conf的386行:

<code>#AddHandler cgi-script .cgi</code>

    去掉注释,将其修改为:

<code>AddHandler cgi-script .cgi .py</code>

    加上.py后,就可以解释python的脚本文件了,如果你需要解释shell的脚本文件,可以添加.pl,其它的类似。

    OK,完成上面的4步之后,CGI配置就算完成了。不过在配置完成之后,我们需要重启一下Apache服务:

<code>xpleaf@leaf:</code><code>/usr/local/apache2/conf</code><code>$ </code><code>sudo</code> <code>/usr/local/apache2/bin/apachectl</code> <code>restart</code>

3.添加CGI脚本文件

(1)创建cgi脚本文件

    在/home/xpleaf/Source_Code/cgi_for_py/目录下添加下面一个文件,并命名为hello.py:

12

13

<code>#!/usr/bin/env python</code>

<code># -*- coding: UTF-8 -*-</code>

<code>print</code> <code>"Content-type:text/html"</code>

<code>print</code>

<code>print</code> <code>'&lt;html&gt;'</code>

<code>print</code> <code>'&lt;head&gt;'</code>

<code>print</code> <code>'&lt;title&gt;Hello&lt;/title&gt;'</code>

<code>print</code> <code>'&lt;/head&gt;'</code>

<code>print</code> <code>'&lt;body&gt;'</code>

<code>print</code> <code>'&lt;h2&gt;Hello Word! This is my first CGI program&lt;/h2&gt;'</code>

<code>print</code> <code>'&lt;/body&gt;'</code>

<code>print</code> <code>'&lt;/html&gt;'</code>

    注意#!/usr/bin/env python一定要加上,否则会出现500错误提示。   

(2)设置cgi脚本文件的文件权限为755    

<code>xpleaf@leaf:~</code><code>/Source_Code/cgi_for_py</code><code>$ </code><code>chmod</code> <code>755 hello.py</code>

<code>xpleaf@leaf:~</code><code>/Source_Code/cgi_for_py</code><code>$ </code><code>ls</code> <code>-l hello.py</code>

<code>-rwxr-xr-x 1 xpleaf xpleaf 289  1月 31 16:02 hello.py</code>

    此步非常非常重要,如果忘记这步,无论你怎么找配置文件也找不出错误,就算看代码也不会发现有错误,然后通过浏览器访问时会一直显示500错误,所以一定要记得该步操作!    

4.通过浏览器访问cgi脚本文件

    直接在浏览器中输入localhost/cgi-bin/hello.py或127.0.0.1/cgi-bin/hello.py就可以访问我们的cgi脚本文件了:

    Ok,那么到这里就结束了,如果是完全按照上面的操作来进行的话,相信是不会有太大的问题的,只是要注意的细节问题比较多。当然肯定不会跟我这里的情况完全一样,因为这还取决于你所使用的环境,这里我的操作系统是:Ubuntu 15.10,所以还是仅提供参考。

本文转自 xpleaf 51CTO博客,原文链接:http://blog.51cto.com/xpleaf/1740221,如需转载请自行联系原作者