### 導航
- [索引](# "總目錄")
- [下一頁](# "CGI") |
- [上一頁](# "uWSGI") |
- [Flask 0.10.1 文檔](#) ?
- [部署選擇](#) ?
# FastCGI
FastCGI 是在像 [nginx](http://nginx.org/) [http://nginx.org/] 、 [lighttpd](http://www.lighttpd.net/) [http://www.lighttpd.net/] 和 [cherokee](http://www.cherokee-project.com/) [http://www.cherokee-project.com/] 服務器上的一個部署選擇。其它選擇見 [*uWSGI*](#) 和 [*獨立 WSGI 容器*](#) 章節。在它們上的任何一個運行你的 WSGI 應用首先需要一個 FastCGI 服務器。最流行的一個是 [flup](http://trac.saddi.com/flup) [http://trac.saddi.com/flup] ,我們會在本指導中使用它。確保你已經安裝好它來跟隨下面的說明。
注意
請提前確保你在應用文件中的任何 app.run() 調用在 if__name__=='__main__': 塊中或是移到一個獨立的文件。這是因為它總會啟動一個本地的 WSGI 服務器,并且我們在部署應用到 uWSGI 時不需要它。
### 創建一個 .fcgi 文件
首先你需要創建一個 FastCGI 服務器文件。讓我們把它叫做yourapplication.fcgi:
~~~
#!/usr/bin/python
from flup.server.fcgi import WSGIServer
from yourapplication import app
if __name__ == '__main__':
WSGIServer(app).run()
~~~
這已經可以為 Apache 工作,而 nginx 和老版本的 lighttpd 需要傳遞一個顯式的 socket 來與 FastCGI 通信。為此,你需要傳遞 socket 的路徑到WSGIServer:
~~~
WSGIServer(application, bindAddress='/path/to/fcgi.sock').run()
~~~
這個路徑一定與你在服務器配置中定義的路徑相同。
把 yourapplication.fcgi 文件保存到你能找到的地方。保存在/var/www/yourapplication 或類似的地方是有道理的。
確保這個文件有執行權限,這樣服務器才能執行它:
~~~
# chmod +x /var/www/yourapplication/yourapplication.fcgi
~~~
### 配置 lighttpd
一個給 lighttpd 的基本的 FastCGI 配置看起來是這樣:
~~~
fastcgi.server = ("/yourapplication.fcgi" =>
((
"socket" => "/tmp/yourapplication-fcgi.sock",
"bin-path" => "/var/www/yourapplication/yourapplication.fcgi",
"check-local" => "disable",
"max-procs" => 1
))
)
alias.url = (
"/static/" => "/path/to/your/static"
)
url.rewrite-once = (
"^(/static.*)$" => "$1",
"^(/.*)$" => "/yourapplication.fcgi$1"
~~~
記得啟用 FastCGI ,別名和重寫模塊。這份配置把應用綁定到/yourapplication 。如果想要應用運行在 URL 根路徑,你需要用LighttpdCGIRootFix 中間件來處理一個 lighttpd 的 bug 。
確保只在應用掛載到 URL 根路徑時才應用它。同樣,更多信息請翻閱 Lighty的文檔關于 [FastCGI andPython](http://redmine.lighttpd.net/wiki/lighttpd/Docs:ModFastCGI) [http://redmine.lighttpd.net/wiki/lighttpd/Docs:ModFastCGI]的部分(注意顯示傳遞一個 socket 到 run() 不再是必須的)。
### 配置 nginx
在 nginx 上安裝 FastCGI 應用有一點不同,因為默認沒有 FastCGI 參數被轉發。
一個給 nginx 的基本的 FastCGI 配置看起來是這樣:
~~~
location = /yourapplication { rewrite ^ /yourapplication/ last; }
location /yourapplication { try_files $uri @yourapplication; }
location @yourapplication {
include fastcgi_params;
fastcgi_split_path_info ^(/yourapplication)(.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_pass unix:/tmp/yourapplication-fcgi.sock;
}
~~~
這份配置把應用綁定到 /yourapplication 。如果你想要綁定到 URL 跟了路徑會更簡單,因為你不需要指出如何獲取 PATH_INFO 和 SCRIPT_NAME:
~~~
location / { try_files $uri @yourapplication; }
location @yourapplication {
include fastcgi_params;
fastcgi_param PATH_INFO $fastcgi_script_name;
fastcgi_param SCRIPT_NAME "";
fastcgi_pass unix:/tmp/yourapplication-fcgi.sock;
}
~~~
### 運行 FastCGI 進程
既然 Nginx 和其它服務器并不加載 FastCGI 應用,你需要手動這么做。[Supervisor 可以管理 FastCGI 進程。](http://supervisord.org/configuration.html#fcgi-program-x-section-settings) [http://supervisord.org/configuration.html#fcgi-program-x-section-settings]你可以尋找其它 FastCGI 進程管理器或寫一個啟動時運行 .fcgi 文件的腳本,例如使用一個 SysV init.d 腳本。對于臨時的解決方案,你總是可以在 GNUscreen 中運行 .fcgi 。更多細節見 manscreen ,注意這是一個手動的解決方案,并且不會在系統重啟后保留:
~~~
$ screen
$ /var/www/yourapplication/yourapplication.fcgi
~~~
### 調試
FastCGI 在大多數 web 服務器上的部署,對于調試趨于復雜。服務器日志最經常告訴發生的事就是成行的“未預期的標頭結尾”。為了調試應用,唯一可以讓你了解什么東西破碎的方案就是切換到正確的用戶并手動執行應用。
這個例子假設你的應用叫做 application.fcgi 并且你的 web 服務器用戶是www-data:
~~~
$ su www-data
$ cd /var/www/yourapplication
$ python application.fcgi
Traceback (most recent call last):
File "yourapplication.fcgi", line 4, in <module>
ImportError: No module named yourapplication
~~~
在這種情況下,錯誤看起來是“yourapplication”不在 python 路徑下。常見的問題是:
- 使用了相對路徑。不要依賴于當前工作目錄
- 代碼依賴于不是從 web 服務器設置的環境變量
- 使用了不同的 python 解釋器
? 版權所有 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
- 許可證
- 術語表