Amazon S3 當作 WordPress 媒體上傳空間

後端文章|2016.3.26.0403

如果長期使用WordPress作為自媒體平台的朋友,應該可以發現資料備份是一個很大的問題。倘若將程式、資料庫以及媒體檔案,通通存放在一個空間裡面,不僅犯了風險管理議題中「把雞蛋放在同一個籠子裡」的謬誤,更造成自己的麻煩與不便。舉筆者自身的例子,經營的自媒體網站有高達40G的媒體檔案(多為圖片),每次備份便造成極大的困擾,因此使用第三方雲端儲存媒體(如 Amazon S3 )作為存放空間,不免是個輕鬆寫意的方案!

本文譯自 Tutorials and Tips for WordPress sites ,並由小弟輔以補充資料以利使用。

前提須準備

  1. Amazon S3帳號(請見 HKITBLOG 的教學)
  2. 本身有一定程度的 Linux 系統使用經驗,且您所使用的主機必須提供你系統管理者(root帳號)的權限。
  3. 須使用SSH的方式連接您的主機,以 Mac 作業系統為例,筆者使用的連接程式為免費軟體 iTerms。Windows 作業系統使用者亦可使用 putty,見 Yu-Pai 的教學。更甚之,您也可以使用 Mac 內建的 terminal (終端機)或是 Win 系統的命令提示字元,作為 SSH 的連接媒介。

提醒您,在進行系統變更前,請一定要記得備份您的檔案!!!(筆者在進行這些變動時,會把所有檔案下載到本機端,再上傳至本教學使用的雲端儲存媒體 Amazon S3,這樣的做法雖然蠢,但卻絕對安全。)


將媒體檔案移動到 S3 的步驟

  1. 在 Linux 系統安裝 S3FS 模組
  2. 於 Amazon S3 建立 Bucket 當作儲存空間
  3. 將原有媒體備(路徑應為 wp-content/uploads)備份至暫存資料夾
  4. 掛載S3 的 Bucket 至系統並指向 wp-content/uploads 資料夾
  5. 將原本媒體複製回指向 wp-content/uploads 的 S3 bucket
  6. 移除暫存資料夾

安裝 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存檔離開)

スクリーンショット 2016-03-26 3.56.20
再來,請輸入以下指令設定您Amazon S3的金鑰與密鑰(見 mini box的教學)

vi /etc/passwd-s3fs

在這個檔案內,以「金鑰:密鑰」的格式輸入,即AccessKeyId:SecretAccessKey,完畢後鍵入以下指令,修改其存取權限提高其安全性。

chmod 640 /etc/passwd-s3fs

於S3建立一Bucket作為儲存媒介

在此請您登入 Amazon Management 後,選擇 Amazon S3 服務,建立一 Bucket,可見上述 HKITBLOG 教學,在此需注意的是您所建立的bucket須符合您的需求,事項如下:

  1. 伺服器區域:筆者建構的網站在亞洲區,Amazon於此提供新加坡(Singapore)與日本(Japan)二伺服器,其中日本伺服器須考量其國內增課8%的消費稅,因此筆者使用新加坡伺服器。
  2. 命名方式:您的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

スクリーンショット 2016-03-26 3.56.46

儲存離開(esc :wq)vi編輯軟體後,重新啟動 NTP 校正程式

service ntpd restart

標籤: , , ,

說些什麼吧

XHTML: 你可以使用以下標籤: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

沒有迴響