我在 jifty.org 上撰寫了此頁,在此以中文簡單說明一次。

Nginx 內附的 fastcgi 已經可以直接配合 Jifty application,請對照著 Wiki 上的設定內容,幾個重點如下:

fastcgi_param PATH_INFO $fastcgi_script_name;Jifty 跟 Catalyst 內附的 fastcgi server 都需要 PATH_INFO 這個環境變數,FreeBSD 跟 Linux 上安裝好的 nginx 的預設 fastcgi 設定裡面並沒有此值,必需要手動加入。root /APP/share/web/;目錄設定到 share/web 就可以fastcgi_pass localhost:9000;這裡是指定 fastcgi server 的所在之處。似乎沒有方法讓 nginx 自動啟動 fastcgi server。因此需要另外啟動。

手動啟動 jifty fastcgi server 的方式為:

FCGI_SOCKET_PATH="localhost:9000" bin/jifty fastcgi &

此外,原本 Jifty 有附許多 static assets,但不知為何我給的設定並不會使 jifty fastcgi server 去 serve 那些 static assets。解決辨法之一是直接全部複製到 share/web/static 底下來:

cp -rn /usr/local/lib/perl5/site_perl/5.8.8/auto/Jifty/web/static/* share/web/static

此處的 -n 參數是「不要覆蓋現有檔案」之意,有些系統的 cp 沒有這個參數,多半可用 cp -i 替代

這組設定應該還可以再調整以解決此問題。但我覺得這種解法反而對佈署有益。因為讓 fastcgi server 來 serve static assets 完全是以牛刀殺雞。也無法善用 nginx async io,能很快回應靜態檔案的這個大優點。

更新:後來發現可以使用 Nginx 的 rewrite 規則來解決這個問題,只要你知道系統上的 @INC 路徑中,放 Jifty 那些 asset 的路徑是哪條。方法如下:

location /__jifty/static { alias /usr/local/lib/perl5/site_perl/5.8.8/auto/Jifty/web/static; }

location /static { if (!-f $request_filename) { rewrite ^(.*)$ /__jifty$1 last; } }

第一條規則其實是使 /__jifty/static 這個 URL 對應到 Jifty 所用來存放其內附的 asset 路徑。第二條 location 規則中則定義,如果找不到檔案的話,則重導到 /__jifty/static 去。說是重導其實也不太正確,因其並非經過瀏覽器的重導,只是在 Nginx 內部而已。

Labels: deploy, fastcgi, jifty, nginx