天天看點

Python+Apache+CGI完全配置

作業系統環境:ubuntu 15.10

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"顯示出來了:

Python+Apache+CGI完全配置

    這樣的話,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腳本檔案了:

Python+Apache+CGI完全配置

    ok,那麼到這裡就結束了,如果是完全按照上面的操作來進行的話,相信是不會有太大的問題的,隻是要注意的細節問題比較多。當然肯定不會跟我這裡的情況完全一樣,因為這還取決于你所使用的環境,這裡我的作業系統是:ubuntu 15.10,是以還是僅提供參考。

    希望幫到有需要的朋友。