### 導航
- [索引](# "總目錄")
- [下一頁](# "獨立 WSGI 容器") |
- [上一頁](# "部署選擇") |
- [Flask 0.10.1 文檔](#) ?
- [部署選擇](#) ?
# mod_wsgi (Apache)
如果你使用 [Apache](http://httpd.apache.org/) [http://httpd.apache.org/] web 服務器,請考慮使用 [mod_wsgi](http://code.google.com/p/modwsgi/) [http://code.google.com/p/modwsgi/] 。
注意
請確保在任何 app.run() 調用之前,你應該把應用文件放在一個 if__name__==`__main__`: 塊中或移動到獨立的文件。只確保它沒被調用是因為這總是會啟動一個本地的 WSGI 服務器,而當我們使用 mod_wsgi 部署應用時并不想讓它出現。
### 安裝 mod_wsgi
如果你還沒有安裝過 mod_wsgi ,你需要使用包管理器來安裝或手動編譯它。mod_wsgi 的 [安裝指引](http://code.google.com/p/modwsgi/wiki/QuickInstallationGuide) [http://code.google.com/p/modwsgi/wiki/QuickInstallationGuide] 涵蓋了 UNIX 系統中的源碼安裝。
如果你使用 Ubuntu/Debian 你可以按照下面的命令使用 apt-get 獲取并激活它:
~~~
# apt-get install libapache2-mod-wsgi
~~~
在 FreeBSD 上,通過編譯 www/mode_wsgi port 或使用 pkg_add 來安裝:
~~~
# pkg_add -r mod_wsgi
~~~
如果你在使用 pkgsrc 你可以編譯 www/ap2-wsgi 包來安裝 mod_wsgi 。
如果你在 apache 第一次重加載后遇到子進程段錯誤,你可以安全地忽略它們。只需要重啟服務器。
### 創建一個 .wsgi 文件
你需要一個 yourapplication.wsgi 文件來運行你的應用。這個文件包含 mod_wsgi啟動時執行的獲取應用對象的代碼。這個對象在該文件中名為 application ,并在之后作為應用。
對于大多數應用,下面度文件就可以勝任:
~~~
from yourapplication import app as application
~~~
如果你沒有一個用于創建應用的工廠函數而是單例的應用,你可以直接導入它為application 。
把這個文件放在你可以找到的地方(比如 /var/www/yourapplication )并確保yourapplication 和所有使用的庫在 python 載入的路徑。如果你不想在系統全局安裝它,請考慮使用 [virtual python](http://pypi.python.org/pypi/virtualenv) [http://pypi.python.org/pypi/virtualenv] 實例。記住你也會需要在 virtualenv中安裝應用。可選地,你可以在 .wsgi 文件中在導入前修補路徑:
~~~
import sys
sys.path.insert(0, '/path/to/the/application')
~~~
### 配置 Apache
你需要做的最后一件事情就是為你的應用創建一個 Apache 配置文件。在本例中,考慮安全因素,我們讓 mod_wsgi 來在不同度用戶下執行應用:
~~~
<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>
~~~
更多信息請翻閱 [mod_wsgi wiki](http://code.google.com/p/modwsgi/wiki/) [http://code.google.com/p/modwsgi/wiki/] 。
### 故障排除
如果你的應用不能運行,按照下面的指導來排除故障:
**問題:** 應用不能運行,錯誤日志顯示, SystemExit 忽略你的應用文件中有一個不在 if__name__=='__main__': 聲明保護下的app.run() 調用。把 [run()](# "flask.Flask.run") 從文件中移除,或者把它移到一個獨立的 run.py 文件,再或者把它放到這樣一個 if 塊中。**問題:** 應用報出權限錯誤可能是因為使用了錯誤的用戶運行應用。確保需要訪問的應用有合適的權限設置,并且使用正確的用戶來運行( WSGIDaemonProcess 指令的 user 和group 參數)**問題:** 應用崩潰時打印一條錯誤
記住 mod_wsgi 禁止對 [sys.stdout](http://docs.python.org/dev/library/sys.html#sys.stdout "(在 Python v3.5)") [http://docs.python.org/dev/library/sys.html#sys.stdout] 和 [sys.stderr](http://docs.python.org/dev/library/sys.html#sys.stderr "(在 Python v3.5)") [http://docs.python.org/dev/library/sys.html#sys.stderr] 做操作。你可以通過設定配置中的 WSGIRestrictStdout 為 off 來禁用這個保護。
~~~
WSGIRestrictStdout Off
~~~
或者,你可以在 .wsgi 文件中用不同的流來替換標準輸出:
~~~
import sys
sys.stdout = sys.stderr
~~~
**問題:** 訪問資源時報出 IO 錯誤
你的應用可能是一個你符號鏈接到 site-packages 文件夾的單個 .py 文件。請注意這不會正常工作,除非把這個文件放進 pythonpath 包含的文件夾中,或是把應用轉換成一個包。
這個問題同樣適用于非安裝的包,模塊文件名用于定位資源,而符號鏈接會獲取錯誤的文件名。
### 自動重加載支持
你可以激活自動重載入支持來協助部署工具。無論何時,當 .wsgi 文件,mod_wsgi 會為我們自動重新加載所有的守護進程。
為此,只需要直接在你的 Directory 節中添加如下內容:
~~~
WSGIScriptReloading On
~~~
### 使用虛擬環境
虛擬環境的優勢是它們永遠不在系統全局安裝所需的依賴關系,這樣你可以更好地控制使用什么。如果你想要同 mod_wsgi 使用虛擬環境,你需要稍微修改一下.wsgi 文件。
把下面的幾行添加到你 .wsgi 文件的頂部:
~~~
activate_this = '/path/to/env/bin/activate_this.py'
execfile(activate_this, dict(__file__=activate_this))
~~~
這根據虛擬環境的設置設定了加載路徑。記住這個路徑一經是絕對的。
? 版權所有 2013, Armin Ronacher.
- 歡迎使用 Flask
- 前言
- 給有經驗程序員的前言
- 安裝
- 快速入門
- 教程
- 介紹 Flaskr
- 步驟 0: 創建文件夾
- 步驟 1: 數據庫模式
- 步驟 2: 應用設置代碼
- 步驟 3: 創建數據庫
- 步驟 4: 請求數據庫連接
- 步驟 5: 視圖函數
- 步驟 6: 模板
- 步驟 7: 添加樣式
- 福利: 應用測試
- 模板
- 測試 Flask 應用
- 記錄應用錯誤
- 配置處理
- 信號
- 即插視圖
- 應用上下文
- 請求上下文
- 用藍圖實現模塊化的應用
- Flask 擴展
- 與 Shell 共舞
- Flask 代碼模式
- 大型應用
- 應用程序的工廠函數
- 應用調度
- 使用 URL 處理器
- 部署和分發
- 使用 Fabric 部署
- 在 Flask 中使用 SQLite 3
- 在 Flask 中使用 SQLAlchemy
- 上傳文件
- 緩存
- 視圖裝飾器
- 使用 WTForms 進行表單驗證
- 模板繼承
- 消息閃現
- 用 jQuery 實現 Ajax
- 自定義錯誤頁面
- 延遲加載視圖
- 在 Flask 中使用 MongoKit
- 添加 Favicon
- 數據流
- 延遲請求回調
- 添加 HTTP Method Overrides
- 請求內容校驗碼
- 基于 Celery 的后臺任務
- 部署選擇
- mod_wsgi (Apache)
- 獨立 WSGI 容器
- uWSGI
- FastCGI
- CGI
- 聚沙成塔
- API
- JSON 支持
- Flask 中的設計決策
- HTML/XHTML 常見問題
- 安全注意事項
- Flask 中的 Unicode
- Flask 擴展開發
- Pocoo 風格指引
- Python 3 支持
- 升級到最新版本
- Flask Changelog
- 許可證
- 術語表