如果長期使用WordPress作為自媒體平台的朋友,應該可以發現資料備份是一個很大的問題。倘若將程式、資料庫以及媒體檔案,通通存放在一個空間裡面,不僅犯了風險管理議題中「把雞蛋放在同一個籠子裡」的謬誤,更造成自己的麻煩與不便。舉筆者自身的例子,經營的自媒體網站有高達40G的媒體檔案(多為圖片),每次備份便造成極大的困擾,因此使用第三方雲端儲存媒體(如 Amazon S3 )作為存放空間,不免是個輕鬆寫意的方案!
本文譯自 Tutorials and Tips for WordPress sites ,並由小弟輔以補充資料以利使用。
前提須準備
- Amazon S3帳號(請見 HKITBLOG 的教學)
- 本身有一定程度的 Linux 系統使用經驗,且您所使用的主機必須提供你系統管理者(root帳號)的權限。
- 須使用SSH的方式連接您的主機,以 Mac 作業系統為例,筆者使用的連接程式為免費軟體 iTerms。Windows 作業系統使用者亦可使用 putty,見 Yu-Pai 的教學。更甚之,您也可以使用 Mac 內建的 terminal (終端機)或是 Win 系統的命令提示字元,作為 SSH 的連接媒介。
提醒您,在進行系統變更前,請一定要記得備份您的檔案!!!(筆者在進行這些變動時,會把所有檔案下載到本機端,再上傳至本教學使用的雲端儲存媒體 Amazon S3,這樣的做法雖然蠢,但卻絕對安全。)
將媒體檔案移動到 S3 的步驟
- 在 Linux 系統安裝 S3FS 模組
- 於 Amazon S3 建立 Bucket 當作儲存空間
- 將原有媒體備(路徑應為 wp-content/uploads)備份至暫存資料夾
- 掛載S3 的 Bucket 至系統並指向 wp-content/uploads 資料夾
- 將原本媒體複製回指向 wp-content/uploads 的 S3 bucket
- 移除暫存資料夾
安裝 S3FS的前置作業
開啟您的終端機程式(筆者於 Mac 系統使用 iTerms)輸入指令,取得root權限
sudo su
更新您的系統套件,CentOS使用
yum update
Ubuntu或Debian系統使用
apt-get update
安裝 s3fs 所需套件,CentOS使用
yum install gcc libstdc++-devel gcc-c++ fuse fuse-devel curl-devel libxm12-devel openssl-devel mailcap
Ubuntu或Debian系統使用
apt-get install gcc libstdc++-devel gcc-c++ fuse fuse-devel curl-devel libxm12-devel openssl-devel mailcap
安裝s3fs(可於 FuseOverAmazon 檢視最新本版,本例為1.74)
下載s3fs
wget http://s3fs.googlecode.com/files/s3fs-1.74.tar.gz
解壓縮s3fs
tar -xzvf s3fs-1.74.tar.gz
安裝s3fs
cd s3fs-1.74 ./configure --prefix=/usr make make install
設定s3fs
vi /etc/fuse.conf
找到一行為 #user_allow_other ,移除前方的#啟用允許其他連入來源的功能後,儲存離開(如何修改請見 鳥哥 提供的教學。若您先前有經驗,筆者提示於vi程式下,按i可進行修改,完畢後按esc離開修改模式,並鍵入:wq存檔離開)
再來,請輸入以下指令設定您Amazon S3的金鑰與密鑰(見 mini box的教學)
vi /etc/passwd-s3fs
在這個檔案內,以「金鑰:密鑰」的格式輸入,即AccessKeyId:SecretAccessKey,完畢後鍵入以下指令,修改其存取權限提高其安全性。
chmod 640 /etc/passwd-s3fs
於S3建立一Bucket作為儲存媒介
在此請您登入 Amazon Management 後,選擇 Amazon S3 服務,建立一 Bucket,可見上述 HKITBLOG 教學,在此需注意的是您所建立的bucket須符合您的需求,事項如下:
- 伺服器區域:筆者建構的網站在亞洲區,Amazon於此提供新加坡(Singapore)與日本(Japan)二伺服器,其中日本伺服器須考量其國內增課8%的消費稅,因此筆者使用新加坡伺服器。
- 命名方式:您的bucket名稱需全為英文小寫,且僅能使用字母。
將既有 wp-content/uploads 移至暫存資料夾
mv /var/www/html/wp-content/uploads /var/www/html/wp-content/uploads-old
請注意 mv 指令後的 /var/www/html/ 須為您 WordPress 所在之根目錄,若您不知根目錄為何,可參考官方文獻於佈景主題內輸入語法後獲得絕對路徑。
掛載S3 Bucket並將其指向 wp-content/uploads
mkdir /var/www/html/wp-content/uploads
s3fs 您的bucket -o allow_other /var/www/html/wp-content/uploads -o use_cache=/tmp
透過以上指令,可將S3的Bucket指向您的 wp-content/uploads 資料夾,在此進行測試是否掛載成功,鍵入語法如下:
cd var/www/html/wp-content/uploads
touch myfile.txt
筆者於此透過s3fs掛載的s3 bucket,建立一名為 myfile.txt 的檔案,可前往至該bucket檢視myfile.txt是否成功建立,若有則掛載成功,可透過下列指令刪除此檔案。此為重要步驟,若bucket內已有檔案,則無法複製檔案至其內!
rm myfile.txt
複製暫存檔至已指向 wp-content/uploads 的 s3 bucket
於前已將既有媒體檔案複製製一暫存資料夾(wp-content/uploads-old),現在要將這些檔案複製回已掛載至s3 bucket的 wp-content/uploads/,輸入指令如下:
cp -r /var/www/html/wp-content/uploads-old/* .
再來,需將此資料夾的擁有者改為您伺服器允許的擁有者,以apache為例,預設擁有者為apache或apache-group,而nginx伺服器則為www,這一部份您需知曉您的伺服器程式為何。以nginx為例,可參考 柑仔雜想 對於nginx 伺服器設定的教學,進入nginx.conf,見user行內允許的擁有者為何(Apache伺服見 胖虎的秘密基地),知道自己伺服器的擁有者為何後,輸入以下指令(可見 鳥哥 對於權限的教學):
chown -R 擁有者 /var/www/html/wp-content/uploads
刪除最早複製的暫存檔案
rm -rf /var/www/html/wp-content/uploads-old
其他補充!
若欲卸載s3的bucekt,請用:
umount 欲卸載路徑
若伺服器重新啟動,要再掛載這個s3的bucket,可用以下指令:
s3fs 您的bucket -o allow_other 欲掛載路徑 -o use_cache=/tmp
遇到 Amazon S3-RequestTimeTooSkewed問題?
由於您的伺服器時間不一定與 Amazon S3 所提供的伺服器時間一致,因此在檔案轉換間,S3系統會判斷兩者間的傳輸時間落差過大,因此導致檔案傳輸失敗(在WordPress端會顯示您「沒有權限」),因此依照 emind 教學,需進行以下修正:
安裝NTP(Network Time Protocol,提供伺服器網路校正時間的模組),Ubuntu與Debian使用
apt-get install ntp
CentOS使用
yum install ntp
設置 NTP 使用 Amazon 伺服器校正時間
vi /etc/ntp.conf
在內建的網路校時伺服器前鍵入 # 使之作為註釋,並輸入 Amazon 的伺服器提供校時。
server 0.amazon.pool.ntp.org iburst server 1.amazon.pool.ntp.org iburst server 2.amazon.pool.ntp.org iburst server 3.amazon.pool.ntp.org iburst
儲存離開(esc :wq)vi編輯軟體後,重新啟動 NTP 校正程式
service ntpd restart