在Apache中運行Python WSGI應用

咱們介紹如何使用Apache模塊mod_wsgi來運行Python WSGI應用。python

安裝mod_wsgi

咱們假設你已經有了Apache和Python環境,在Linux或者Mac上,那第一步天然是安裝。在Ubuntu或Debian環境中,你可使用apt-get命令來安裝:git

sudo apt-get install libapache2-mod-wsgi

sudo apt-get install libapache2-mod-wsgi-py3

不過咱們建議採用編譯安裝,這樣在任何系統中均可以安裝成功,具體步驟以下:github

  • 下載源碼包

mod_wsgi的源碼託管在Github上,你能夠從https://github.com/GrahamDumpleton/mod_wsgi/releases下載它各個版本的源碼包。apache

  • 解壓後,配置編譯選項

通常採用默認配置便可,即執行:flask

./configure

若是要指定Apache和Python環境,那你須要加上」–with-apxs」和」–with-python」選項:瀏覽器

./configure --with-apxs=/usr/local/apache/bin/apxs --with-python=/usr/local/bin/python
  • 編譯並安裝
sudo make && make install
  • 在Apache配置文件中載入mod_wsgi

讓咱們打開Apache的配置文件httpd.conf,默認是在:app

$ sudo vi /etc/httpd/conf/httpd.conf   # For Linux
$ sudo vi /etc/apache2/httpd.conf      # For Mac

在全部」Load Module」配置項的最後,加上載入mod_wsgi的配置,注意Linux和Mac的模塊加載路徑不一樣:函數

LoadModule wsgi_module modules/mod_wsgi.so   # For Linux
# LoadModule wsgi_module libexec/apache2/mod_wsgi.so   # For Mac
  • 重啓Apache來啓用配置
$ sudo service httpd restart       # For Linux
$ sudo service apachectl restart   # For Mac

測試mod_wsgi

最簡單的測試方法天然是Hello World,讓咱們在Apache的DocumentRoot根目錄下建立一個文件」test.wsgi」。在文件中,咱們寫入這樣的內容:測試

def application(environ, start_response):
    status = '200 OK'
    output = 'Hello World!'
 
    response_headers = [('Content-type', 'text/plain'),
                        ('Content-Length', str(len(output)))]
    start_response(status, response_headers)
 
    return [output]

這裏的函數application即爲WSGI應用對象,它返回的值就是該應用收到請求後的響應。而後,再打開Apache的配置文件httpd.conf,在其最後加上URL路徑映射:this

WSGIScriptAlias /test /var/www/test.wsgi

這裏咱們假設Apache的文檔根目錄是」/var/www」。

如今你能夠打開瀏覽器,訪問一下」http://localhost/test」,若是看到」Hello World!」了,就說明mod_wsgi已經安裝成功。

咱們能夠試試運行Flask應用,固然首先是你本地Python環境已經安裝了Flask,咱們將」test.wsgi」改成:

from flask import Flask
application = Flask(__name__)
 
@application.route('/')
def index():
    return '<h1>Hello World!</h1>'

注意,這裏必需要將Flask應用對象命名爲」application」,這樣才能被mod_wsgi識別。再用瀏覽器訪問下,是否是能看到大標題」Hello World!」?

使用Python虛擬環境

通常咱們會將應用安裝在虛擬環境中,這樣應用的更新只需改變虛擬環境便可,不會影響到其餘應用環境。要使用虛擬環境來運行當前WSGI應用的話,你必須在」.wsgi」文件中先執行虛擬環境的啓用腳本,基於上面的代碼,咱們來作以下改動:

activate_this = '/home/bjhee/virtualenv/bin/activate_this.py'
execfile(activate_this, dict(__file__=activate_this))
 
from flask import Flask
application = Flask(__name__)
 
@application.route('/')
def index():
    return '<h1>Hello World!</h1>'

上例中,咱們的虛擬環境在目錄」/home/bjhee/virtualenv」下,你能夠在其」/bin」子目錄中找到啓用腳本」activate_this.py」。在WSGI應用的一開始執行它便可。

補充內容

當咱們的Python環境中有模塊是以.egg壓縮包安裝的話,WSGI應用運行時須要將.egg壓縮包解開。默認的解壓路徑頗有可能沒有訪問權限,好比Mac下是」/Library/WebServer/.python-eggs」,所以你須要指定臨時解壓目錄。方法有兩種,一是在Apache的httpd.conf文件中,使用」WSGIPythonEggs」配置項,配置參數就是咱們的臨時目錄路徑;二是設置系統環境變量」PYTHON_EGG_CACHE」。咱們建議採用第二種,並將其寫在」.wsgi」文件中,這樣就不會影響其餘的應用:

activate_this = '/home/bjhee/virtualenv/bin/activate_this.py'
execfile(activate_this, dict(__file__=activate_this))
 
import os
os.environ['PYTHON_EGG_CACHE'] = '/home/bjhee/.python-eggs'
 
from flask import Flask
application = Flask(__name__)
 
@application.route('/')
def index():
    return '<h1>Hello World!</h1>'

運行前,請確保臨時目錄(上例中的」/home/bjhee/.python-eggs」)有訪問及寫權限。

相關文章
相關標籤/搜索