在apache2上使用fastcgi部署django應用

前幾天第一次嘗試使用fastcgi模塊,在apache服務器上部署django應用。由於需要在網上一臺只開放了sftp功能的linux服務器上安裝,沒有ssh,而且對方還不熟悉fastcgi和python,做起來有點麻煩。
google瞭解了大概的操作步驟,並在自己的虛擬機上試着裝(ubuntu系統),使用apt安裝apache2、fastcgi模塊,都很方便。修改apache配置,不同的linux系統apache配置文件存放的位置還不一樣,不過配置內容還是一樣的。在系統配置文件裏面,我覺得只需要將<VirtualHost>裏面對應目錄的“AllowOverride”改成All就好,這樣,其它的配置可以通過目錄裏面“.htaccess”文件來設置。
最終配置好的根目錄“.htaccess”文件內容:
AddHandler fastcgi-. .fcgi
SetEnv PYTHON_EGG_CACHE /tmp/trac-eggs
Options +ExecCGI
RewriteEngine .
RewriteBase /
#hello
RewriteRule ^(hello/.*)$ - [QSA,L]
#fckeditor
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(static/fckeditor/editor/filemanager/connectors/.*)$ fcgifck.fcgi/$1 [QSA,L]
#static file setting
RewriteRule ^(static/.*)$ - [L]
#adm_media file setting
RewriteRule ^(adm_media/.*)$ - [L]
#root
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ fcgirun.fcgi/$1 [QSA,L]
內容解釋(不熟悉apache配置,下面的內容都是瞭解到的或者猜的):
  1. AddHandler行,標示本目錄中後綴爲.fcgi的文件是fastcgi腳本
  2. setEnv行,設置python的egg臨時目錄
  3. Options +ExecCGI,允許本目錄執行CGI
  4. RewriteEngine .,打開Rewrite
  5. RewriteRule ^(hello/.*)$ - [QSA,L],/hello/浪點服務器上下過來的測試程序,hello目錄裏面也有“.htaccess”文件,用來設置hello程序的。這個RewriteRule前不需要RewriteCond。
  6. fckeditor,我這個應用裏面用到fckeditor編輯器,還好fckeditor自己帶有python的wsgi服務端程序,可以拿來直接使用,那兩行設置就是針對這個的。
  7. 靜態文件目錄和django管理模塊相關的靜態文件目錄設置
  8. fcgirun.fcgi,具體fastcgi腳本。
fcgirun.fcgi,是python腳本,apache中的fastcgi模塊會在請求時自動啓動該腳本。django裏面用到flup包來結合fastcgi。具體信息google。
由於在apache服務器上權限有限,部署也花了很多時間,現在總結一些經驗:
  1. 更新問題:我試過更新了應用和修改更新了fcgirun.fcgi,但大半天了網站內容還沒變。解決辦法:更新時,將fcgirun.fcgi改名,如:fcgirun1.fcgi,還需要修改.htaccess文件裏的對應文件名。這樣更新後,網站內容一定會馬上更新。
  2. 部署時,碰到問題的解決辦法:如果在django初始化時出了錯誤,那麼網頁上只會提示500內部錯誤,很難判斷具體錯誤信息是什麼?這個就是爲什麼花了我很多時間的原因。解決辦法:使用python logging模塊,將錯誤信息log到可訪問的目錄裏面(sftp登陸的用戶建立的目錄,默認情況下apache cgi腳本是不允許寫的,需要改權限設置)。將懷疑會在導入時出錯的模塊,嘗試在fcgirun.fcgi中導入。
  3. python egg問題:使用easy_install安裝包很方便,不過有時會將包以壓縮方式安裝,這時,導入該包,如果有.pyd模塊在壓縮文件裏面,就需要解壓到目錄裏,默認的目錄fastcgi模塊是不允許訪問的,這時,就需要設置:os.environ['PYTHON_EGG_CACHE'] = '/tmp/trac-eggs',將這代碼寫在fcgirun.fcgi裏面就好,“.htaccess”文件中的“SetEnv PYTHON_EGG_CACHE /tmp/trac-eggs ”好像不起作用。我就在導入MySQLdb模塊時碰到這問題。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章