W3Cschool
恭喜您成為首批注冊用戶
獲得88經驗值獎勵
FastCGI 是在像 nginx 、 lighttpd 和 cherokee 服務器上的一個部署選擇。 其它選擇見 uWSGI 和 獨立 WSGI 容器 章節(jié)。 在它們上的任何一個運行你的 WSGI 應用首先需要一個 FastCGI 服務器。最流行的一個 是 flup ,我們會在本指導中使用它。確保你已經安裝好它來跟隨下面的說明。
注意
請?zhí)崆按_保你在應用文件中的任何 app.run() 調用在 if __name__ == '__main__': 塊中或是移到一個獨立的文件。這是因為它總會啟動一個本地 的 WSGI 服務器,并且我們在部署應用到 uWSGI 時不需要它。
首先你需要創(chuàng)建一個 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 或類似的地方是有道理的。
確保這個文件有執(zhí)行權限,這樣服務器才能執(zhí)行它:
# chmod +x /var/www/yourapplication/yourapplication.fcgi
一個給 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 and Python 的部分(注意顯示傳遞一個 socket 到 run() 不再是必須的)。
在 nginx 上安裝 FastCGI 應用有一點不同,因為默認沒有 FastCGI 參數被轉 發(fā)。
一個給 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;
}
既然 Nginx 和其它服務器并不加載 FastCGI 應用,你需要手動這么做。 Supervisor 可以管理 FastCGI 進程。 你可以尋找其它 FastCGI 進程管理器或寫一個啟動時運行 .fcgi 文件的腳本, 例如使用一個 SysV init.d 腳本。對于臨時的解決方案,你總是可以在 GNU screen 中運行 .fcgi 。更多細節(jié)見 man screen ,注意這是一個手動 的解決方案,并且不會在系統(tǒng)重啟后保留:
$ screen
$ /var/www/yourapplication/yourapplication.fcgi
FastCGI 在大多數 web 服務器上的部署,對于調試趨于復雜。服務器日志最經常 告訴發(fā)生的事就是成行的“未預期的標頭結尾”。為了調試應用,唯一可以讓你了解 什么東西破碎的方案就是切換到正確的用戶并手動執(zhí)行應用。
這個例子假設你的應用叫做 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 路徑下。常見的 問題是:
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯系方式:
更多建議: