Flask mod_wsgi (Apache)

2021-08-11 10:40 更新

如果你使用 Apache web 服務(wù)器,請(qǐng)考慮使用 mod_wsgi 。

注意:

請(qǐng)確保在任何 ?app.run() ?調(diào)用之前,你應(yīng)該把應(yīng)用文件放在一個(gè)? if __name__ == `__main__`:? 塊中或移動(dòng)到獨(dú)立的文件。只確保它沒被調(diào)用是 因?yàn)檫@總是會(huì)啟動(dòng)一個(gè)本地的 WSGI 服務(wù)器,而當(dāng)我們使用? mod_wsgi ?部署應(yīng)用 時(shí)并不想讓它出現(xiàn)。

安裝 mod_wsgi

如果你還沒有安裝過(guò) ?mod_wsgi ?,你需要使用包管理器來(lái)安裝或手動(dòng)編譯它。 mod_wsgi 的 安裝指引 涵蓋了 UNIX 系統(tǒng)中的源碼安裝。

如果你使用 ?Ubuntu/Debian? 你可以按照下面的命令使用 ?apt-get ?獲取并激活它:

# apt-get install libapache2-mod-wsgi

在 FreeBSD 上,通過(guò)編譯 www/mode_wsgi port 或使用 pkg_add 來(lái)安裝:

# pkg_add -r mod_wsgi

如果你在使用 pkgsrc 你可以編譯 www/ap2-wsgi 包來(lái)安裝 mod_wsgi 。

如果你在 apache 第一次重加載后遇到子進(jìn)程段錯(cuò)誤,你可以安全地忽略它們。 只需要重啟服務(wù)器。

創(chuàng)建一個(gè) .wsgi 文件

你需要一個(gè) yourapplication.wsgi 文件來(lái)運(yùn)行你的應(yīng)用。這個(gè)文件包含 mod_wsgi 啟動(dòng)時(shí)執(zhí)行的獲取應(yīng)用對(duì)象的代碼。這個(gè)對(duì)象在該文件中名為 application ,并在 之后作為應(yīng)用。

對(duì)于大多數(shù)應(yīng)用,下面度文件就可以勝任:

from yourapplication import app as application

如果你沒有一個(gè)用于創(chuàng)建應(yīng)用的工廠函數(shù)而是單例的應(yīng)用,你可以直接導(dǎo)入它為 application 。

把這個(gè)文件放在你可以找到的地方(比如 /var/www/yourapplication )并確保 yourapplication 和所有使用的庫(kù)在 python 載入的路徑。如果你不想在系統(tǒng)全局 安裝它,請(qǐng)考慮使用 virtual python 實(shí)例。記住你也會(huì)需要在 virtualenv 中安裝應(yīng)用。可選地,你可以在 .wsgi 文件中在導(dǎo)入前修補(bǔ)路徑:

import sys
sys.path.insert(0, '/path/to/the/application')

配置 Apache

你需要做的最后一件事情就是為你的應(yīng)用創(chuàng)建一個(gè) Apache 配置文件。在本例中,考慮 安全因素,我們讓 mod_wsgi 來(lái)在不同度用戶下執(zhí)行應(yīng)用:

<VirtualHost *>
    ServerName example.com

    WSGIDaemonProcess yourapplication user=user1 group=group1 threads=5
    WSGIScriptAlias / /var/www/yourapplication/yourapplication.wsgi

    <Directory /var/www/yourapplication>
        WSGIProcessGroup yourapplication
        WSGIApplicationGroup %{GLOBAL}
        Order deny,allow
        Allow from all
    </Directory>
</VirtualHost>

更多信息請(qǐng)翻閱 mod_wsgi wiki

故障排除

如果你的應(yīng)用不能運(yùn)行,按照下面的指導(dǎo)來(lái)排除故障:

問題: 應(yīng)用不能運(yùn)行,錯(cuò)誤日志顯示, SystemExit 忽略
你的應(yīng)用文件中有一個(gè)不在 if __name__ == '__main__': 聲明保護(hù)下的 app.run() 調(diào)用。把 run() 從文件中移除,或者把 它移到一個(gè)獨(dú)立的 run.py 文件,再或者把它放到這樣一個(gè) if 塊中。
問題: 應(yīng)用報(bào)出權(quán)限錯(cuò)誤
可能是因?yàn)槭褂昧隋e(cuò)誤的用戶運(yùn)行應(yīng)用。確保需要訪問的應(yīng)用有合適的權(quán)限設(shè)置, 并且使用正確的用戶來(lái)運(yùn)行( WSGIDaemonProcess 指令的 user 和 group 參數(shù))
問題: 應(yīng)用崩潰時(shí)打印一條錯(cuò)誤

記住 mod_wsgi 禁止對(duì) sys.stdout 和 sys.stderr 做操作。 你可以通過(guò)設(shè)定配置中的 WSGIRestrictStdout 為 off 來(lái)禁用這個(gè)保護(hù)。

WSGIRestrictStdout Off

或者,你可以在 .wsgi 文件中用不同的流來(lái)替換標(biāo)準(zhǔn)輸出:

import sys
sys.stdout = sys.stderr
問題: 訪問資源時(shí)報(bào)出 IO 錯(cuò)誤

你的應(yīng)用可能是一個(gè)你符號(hào)鏈接到 site-packages 文件夾的單個(gè) .py 文件。 請(qǐng)注意這不會(huì)正常工作,除非把這個(gè)文件放進(jìn) pythonpath 包含的文件夾中, 或是把應(yīng)用轉(zhuǎn)換成一個(gè)包。

這個(gè)問題同樣適用于非安裝的包,模塊文件名用于定位資源,而符號(hào)鏈接會(huì)獲取 錯(cuò)誤的文件名。

自動(dòng)重加載支持

你可以激活自動(dòng)重載入支持來(lái)協(xié)助部署工具。無(wú)論何時(shí),當(dāng) .wsgi 文件, mod_wsgi 會(huì)為我們自動(dòng)重新加載所有的守護(hù)進(jìn)程。

為此,只需要直接在你的 Directory 節(jié)中添加如下內(nèi)容:

WSGIScriptReloading On

使用虛擬環(huán)境

虛擬環(huán)境的優(yōu)勢(shì)是它們永遠(yuǎn)不在系統(tǒng)全局安裝所需的依賴關(guān)系,這樣你可以更好 地控制使用什么。如果你想要同 mod_wsgi 使用虛擬環(huán)境,你需要稍微修改一下 .wsgi 文件。

把下面的幾行添加到你 .wsgi 文件的頂部:

activate_this = '/path/to/env/bin/activate_this.py'
execfile(activate_this, dict(__file__=activate_this))

這根據(jù)虛擬環(huán)境的設(shè)置設(shè)定了加載路徑。記住這個(gè)路徑一經(jīng)是絕對(duì)的。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)