咱們介紹如何使用Apache模塊mod_wsgi來運行Python WSGI應用。python
咱們假設你已經有了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的配置文件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
$ sudo service httpd restart # For Linux $ sudo service apachectl restart # For Mac
最簡單的測試方法天然是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!」?
通常咱們會將應用安裝在虛擬環境中,這樣應用的更新只需改變虛擬環境便可,不會影響到其餘應用環境。要使用虛擬環境來運行當前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」)有訪問及寫權限。