天天看點

用Apache+mod_wsgi部署python程式

http://leven.co/blog/read/apache-install-wsgi-public-python

使用Apache+mod_wsgi部署webpy等python程式

webpy是一個python上的非常輕量級的web架構,它和其他許多python web架構一樣,都能支援wsgi部署,而目前來看比較優秀的wsgi部署方案自然是Apache+mod_wsgi,它提供非常簡單優秀的部署方式,使得python程式的部署不再困難,本文将詳細講述在Apache上部署mod_wsgi的方法,并嘗試使用mod_wsgi支援webpy程式.

首先,我們假定我們的伺服器已經安裝配置好Apache了,安裝路徑為/usr/local/apache,虛拟主機配置檔案在/usr/local/apache/conf/vhost下,那麼我們可以開始安裝mod_wsgi.

從mod_wsgi的官方網站http://code.google.com/p/modwsgi/下載下傳最新的源代碼,截止到本文,其最新版為3.3.下載下傳解壓,我們需要編譯安裝

在編譯之前,我們需要确認目前環境是否能支援mod_wsgi,編譯它需要完整的gcc編譯環境,同時必須保證安裝了python和python-dev包,如果您不确定是否有python支援,在debian上可以直接apt-get安裝

1

apt-get 

install

python python-dev

如果提示未安裝,安裝即可

下面開始編譯mod_wsgi

1

./configure --with-apxs=/usr/

local

/apache/bin/apxs --with-python=/usr/bin/python

2

make

3

make

install

如果沒有錯誤,那麼恭喜,mod_wsgi已經被成功編譯并安裝了.

然後我們編輯/usr/local/apache/conf/httpd.conf檔案

加上

1

LoadModule wsgi_module modules/mod_wsgi.so

2

AddType text/html .py

如果要在某個虛拟主機上啟用python+wsgi支援,隻需要在vhost的配置檔案中加入

1

WSGIScriptAlias / /var/www/main.py/

其中/var/www/main.py就是提供wsgi的主程式

當然,一般程式都有靜态檔案支援,是以,您可能需要對某個目錄下的檔案跳過處理,如下

1

Alias /static   /var/www/static/

如此即可.最後加上目錄設定即可,對于上面的例子,完整的虛拟主機配置如下

01

ServerAdmin [email protected]

02

DocumentRoot /var/www

03

ServerName xxx.com

04

ServerAlias www.xxx.com

05

WSGIScriptAlias / /var/www/main.py/

06

Alias /static   /var/www/static/

07

AddType text/html .py

08

ErrorLog /var/log/httpd/xxx_error.log

09

CustomLog "|/usr/bin/cronolog /var/log/httpd/xxx_access_%Y%m%d.log" custom1

10

11

12

Options Indexes FollowSymLinks

13

AllowOverride All

14

Order allow,deny

15

Allow from all

這樣就配置好了此站點的mod_wsgi支援.那麼對于python程式,應該如何使用這樣的配置工作呢?下面我們以webpy為例,考慮實際部署一個測試程式

對于webpy,官方給出了wsgi的配置例子,具體參考:http://webpy.org/cookbook/mod_wsgi-apache/zh-cn

在本文中,我們參考之後,實際的main.py内容如下:

01

#!/usr/bin/env python

02

import

os

03

import

sys

04

path 

=

os.path.dirname(os.path.realpath(__file__))

05

sys.path.append(path)

06

07

import

web

08

09

urls 

=

(

10

'/'

'index'

11

)

12

13

class

index:

14

def

GET(

self

):

15

return

"Hello, I am Leven."

16

17

app 

=

web.application(urls, 

globals

())

18

curdir 

=

os.path.dirname(__file__)

19

session 

=

web.session.Session(app, web.session.DiskStore(curdir 

+

'/'

+

'sessions'

),)

20

21

def

session_hook():

22

web.ctx.session 

=

session

23

24

app.add_processor(web.loadhook(session_hook))

25

application 

=

app.wsgifunc()

稍微解釋下,由于我們考慮是虛拟主機部署,是以伺服器并未安裝webpy,我們将webpy放入web目錄下,是以,在使用的時候,必須将目前目錄加入path才可以正常載入webpy子產品,所有檔案開頭先将目前目錄加入path.

然後,由于web程式中會經常用到session,是以我們将session也加入到了程式中,具體存儲路徑在sessions目錄下.

将webpy目錄和main.py上傳到web根目錄,然後通路,如果通路結果如下圖,恭喜,您的配置已經成功.