前言

在規劃一個新網站,尤其是一個會放置大量圖檔的網站(如:購物網站),為了節省網站頻寬的成本,除了在設計管理平台的上傳圖檔功能時限制上傳檔案的大小以外,將檔案外放到免費空間也是常見的方法之ㄧ。不過假使直接把圖檔連結指到免費空間,如此直接顯示免費空間的網址,有可能會讓使用者的感覺不好;另外要考量到假使本站與免費空間在執行圖檔同步更新時,某個圖檔還來不及更新到免費空間,此時本站在顯示此圖時就會呈現破圖(所謂的叉燒包)。為了避免以上的情況發生,我們可以透過apache設定檔httpd.conf加上轉址設定,以及在免費空間上也設定htaccess轉址,在搭配rsync同步處理,來達到完整的圖檔同步分流機制。現在就讓我們來看看要怎麼作吧!

A主機規劃及細部設定

假設我們的本站是A主機,免費空間是B主機。
首先我們在A上開啟httpd.conf,先確認apache有開啟rewrite_module這個模組(註1),然後在httpd.conf上網站設定區塊加上如以下設定︰

<Directory "/www/webname">
RewriteEngine on
RewriteRule (.*)\.(jpg|jpeg|gif|png|bmp|swf)$ http://freehostspace/$1.$2 [L]
</Directory>

/www/webname 為網站http://A-HOST/放置在A的實體路徑。RewriteEngine on表示我們開啟rewrite_module這個模組,此模組主要功用即為轉址。RewriteRule表示我們要設定轉址的規則,這裡我們用到常規表示法(Regular expression),$的前面是被轉址的檔案原則,範例中的(.*)\.(jpg|jpeg|gif|png|bmp|swf) 表示所有副檔名為jpg/jpeg/gif/png/bmp/swf的檔案我們都希望作轉址動作;$的後面則是要轉址到何處的原則,範例中的http://freehostspace/$1.$2表示我們要把前面所設定的檔案都轉址到http://freehostspace/這個免費空間,而檔名則沿用原來的檔名($1.$2的意思),設定完畢存檔後重啟apache。所以總結來說,我們在A上的設定的用意在︰將所有在A主機上/www下的所有副檔名為jpg/jpeg/gif/png/bmp/swf的檔案都自動導到http://freehostspace/這個免費空間去。

再來我們要在A主機上設定一個Symbolic Link連結到網站,至於什麼是Symbolic Link可參考這篇(http://linux.vbird.org/linux_basic/0230filesystem.php#link)。設定指令參考如下︰

ln -s /www/webname /www/webname/symboliclink

這段指令是設定假使網站的網址為http://A-HOST,我們打http://A-HOST/symboliclink/一樣會連到http://A-HOST,至於為何要作這樣的設定容筆者在後面再做說明。

B主機規劃及細部設定

通常免費空間是不可能讓我們去更動到主機的apache設定,因此我們可以透過.htaccess檔的設定達到同樣的目的。首先我們在B的資料夾下開啟一個命名為.htaccess的檔案,然後在該檔案上加上以下設定︰

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*)\.(jpg|jpeg|gif|png|bmp|swf)$
http://A-HOST/symboliclink/$1.$2 [L]

同樣的我們使用到rewrite_module這個模組,RewriteCond %{REQUEST_FILENAME} !-f 和 RewriteCond %{REQUEST_FILENAME} !-d表示假使在資料夾找不到該檔案時,就做下面RewriteRule所設定的動作,而這裡RewriteRule其實就是把圖檔再次轉址到A主機去。或許有人會問為何要作這樣的設定,其實這就是為了解決筆者在第一段裡所提到免費網站因同步尚未完成時本站會產生破圖的狀況。眼尖的讀者或許會問,為何轉址到A主機會設成http://A-HOST/symboliclink/而不是http://A-HOST/?因為經過筆者實際測試,如果這裡設定成http://A-HOST/,會造成B主機因為找不到檔案轉址回A主機,而A主機又因為httpd.conf的設定又轉址到B主機,如此會造成無限迴圈的轉址。因此我們在上面設定A主機時要額外設定Symbolic Link連結的作用即在避免發生這種情形,http://A-HOST/symboliclink/就不受A主機上httpd.conf針對網站http://A-HOST/的轉址設定,因此從B主機轉址到A主機後就不會再轉址了。現在我們總結一下我們在A/B網站的設定流程就是如下︰

本站(A)所有指定檔案自動轉址到免費空間(B) => 假使B找不到某圖檔(尚未同步更新到B) => 轉址到A讀取該圖檔 => 轉址結束

如此就完成完整的圖檔分流機制的目的了。

同步更新rsync

網路關於rsync的介紹很多,像這篇(http://www.csie.nctu.edu.tw/~tsaiwn/course/introcs/history/linux/linux.tnc.edu.tw/techdoc/rsync.htm)就寫得很清楚,簡單說就是一種同步備份的機制,因為每次只更新有變動的部份,所以更新起來比較快速。同步更新的指令參考如下︰

rsync -avl --delete -e ssh /www/webname/* id@http://freehostspace:/www/webname

rsync有很多方式,這裡是透過ssh的方式,/www/webname/*就是本地端主機(A)的檔案路徑,id@http://freehostspace:/www/wabname 就是免費站(B)的相關設定,也就是︰

登入帳號@B主機網址:完整資料夾路徑

此時只要把該指令排入CRON定時執行即可。

總結

透過以上的說明希望在主機檔案的分流及同步更新上能對各位有更多的幫助,如果有其他更好的想法也歡迎回文分享給大家。

註1:確認httpd.conf中LoadModule rewrite_module modules/mod_rewrite.so此行的前方#號是否有拿掉,如無則拿掉後重起apache即可。

arrow
arrow
    全站熱搜

    山村有祐 發表在 痞客邦 留言(0) 人氣()