Bluehost 從1/19用了將近一個月以來,感覺還蠻不錯的。提供的空間、硬體等級都不錯,雖然SSL設定有些波折,但客服反應也都很即時。所以想說就提早”續約” (renewal)好了,一看才嚇了一跳。因為網站的宣傳是 $2.95/m ,最多到60個月。但續約的價格貴了很多,要到 $6.99/m。我還特地問了一下客服,才知道原來這是普遍的行銷手段,俗稱「套、養、殺」。先用低價讓你使用-套,讓你開始用他來寫文章-養,等約到要續才發現漲了很多-殺。
網路有人說可以殺價,但不同的客服反應會不一樣,或者是要抱怨好幾次才有用,但也沒辦法降到跟重新註冊的價格一樣。這樣不免讓人有點小擔心,以後會不會變待肥羊,任人魚肉。想說目前 WordPress 都有在定期備份了,乾脆就來實際練習一下是不是可以成功的還原到自己裝的 Linux 上。這樣以後想搬家自然也不是問題了。
先提一下,本文主要是驗証 WordPress 可否復原,有些設定可能沒有考慮網站的安全性,以方便為主。實用上,還是請注一下這方面的問題,另外全程都是用 root 來操作。
Linux 版本
我測試用 Ubuntu 16.04 64bits 的版本。14.04 32bits 我有試過,但因為他的軟體套件比較舊,會需要做一些修改。為了方便紀錄,我就用 Ubuntu 16.04。選定好 Linux 版本後,就將他裝在實體機器上或虛擬機器裡,就可以繼續軟體的操作了。
備份檔
備份檔就是你的 WordPress 所有的相關資料。這個比較麻煩的是,有的 WordPress 代管網站不會提供很完整的備份功能,給你所有的東西。我記得當初從 WordPress.com 移出來時,只拿到資料庫的檔案,也許是沒特別去要的關係。Bluehost 因為可以 ssh 登入,能備的我都備了,包含:
- WordPress 資料庫 dump 檔,是放文章的內容
- WordPress 資料夾,上傳的圖片、外掛、佈景主題,Apache的.htaccess檔
如果你也可以用 ssh 登入,備份的方法下面簡單提一下
備份資料庫檔案
1 |
mysqldump -p你的資料庫密碼 --user=資料庫用戶名稱 資料庫名稱 > ~/wp.sql |
資料庫的名稱、用戶、密碼,存放在 WordPress 目錄下的 wp-config.php 檔內,找 DB_NAME, DB_USER, DB_PASSWORD 就有了。
備份 WordPress 資料夾
1 |
tar -c -J -f wp.tar.xz public_html wp.sql |
這部份比較簡單,就把所有東西 tar 起來加上剛的資料庫檔就好了,然後想辦法傳回自己的電腦上。
Linux 設定 WebServer (Apache2)
不廢話,如果你也是裝 Ubuntu 16.04 ,就照下面的貼上去就好了(假設你已經切換成 root 身份了)。主要是裝 Apache2, PHP。
1 2 3 4 5 6 7 8 9 10 |
apt-get update apt-get -y install apache2 apt-get -y install php5 apt-get -y install php5-mysql apt-get -y install libapache2-mod-php5 apt-get -y install php5-xml #與 Wordpress.com app時需此套件才能管理 apt-get install php5-gd php5-imagick # 影像處理套件,上傳圖檔時才可以自動產生三種size縮圖 a2enmod rewrite a2ensite default-ssl a2enmod ssl |
修改 Apache 設定檔,允許 .htaccess 覆蓋設定,編輯 /etc/apache2/apache2.conf,把它修改如下。主要是 AllowOverride 那行
1 2 3 4 5 6 |
<Directory /var/www/> Options Indexes FollowSymLinks # AllowOverride none AllowOverride all Require all granted </Directory> |
安裝 MySQL Server ,中間會問你 root 的密碼要設成什麼,因為是測試,直接設成123456。
1 |
apt-get -y install mysql-server |
新增 Host Name
因為我的 WordPress 有申請 Domain name ,但驗証復原的過程中是在私人機器上,資料庫和設定檔裡還是都用 domain name 去連,這樣會造成連線失敗。或者如果你的機器有連到網上,你會連線到網路上目前的網站,讓你誤以為設定完成。所以我們要把 domain name 設到新架的機器上,可以透過 Linux 的 /etc/hosts 檔來完成這個目的。下面是以本站的domain name 為例
1 |
echo "127.0.0.1 moon-half.info" >> /etc/hosts |
復原 WordPress
伺服器的設定差不多都完成了,接下來就是復原 WordPress 的備份檔。由於流程有點鎖碎,就直接以操作命令當解釋。我自己的備份檔是一個 .tar.xz 檔案,解開後就是 public_html 目錄和 wp.sql 檔案。基本上把 wp.sql 倒回去,public_html 改一下名就可以了。注意!這邊也是假設你用 root 的身份執行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
cd #切回 /root 方便工作 tar Jvfx /home/ubuntu/moon-half_2018_02_28.tar.xz #解壓縮備份檔 mv /var/www/html /var/www/html.old #將原本的 HTML 根目錄改名,以免發生什麼遺憾 mv public_html/ /var/www/html #把備份的HTML資料夾,移到系統的位置 cd /var/www/html #切到 HTML 位置,方便操作 DBNAME=`cat wp-config.php | grep DB_NAME | cut -d"'" -f4` # 取得Wordpress的資料庫名稱 mysql -p123456 -u root -e "create database $DBNAME" # 新增資料庫到 MySQL # 在 wp-config.php 找到 DB_USER 和 DB_PASSWORD,將其修改如下 #define('DB_USER', 'root')# 將 Wordpress 的資料庫用戶設成 root #define('DB_PASSWORD', '123456')# 將 Wordpress 的資料庫用戶密碼設成 123456 sed -i "s/Header set X-Endurance/#Header set X-Endurance/" .htaccess # Wordpress 可能有用 Cache 套件,但 Ubuntu 預設不支援,直接注解掉 sed -i 's/https:\/\/moon-half.info/http:\/\/moon-half.info/g' ~/wp.sql # 若你得網址是 https 的,因為我們是本機測試,直接用 http 取代就好了,簡化流程 mysql -p123456 -u root $DBNAME < ~/wp.sql # 把資料庫備份倒回去系統上的 MySQL chmod 777 /var/www/html/ -R # 為了方便操作,直接把 HTML 的權限改成所有人都可以寫 apachectl restart # 重啟 Apache |
改成 Event MPM (2019.12)
為改善效能,近期已將 Apache MPM 從 Prefork 改成 Event。簡單的修改命令如下,完整文章可參考這。
在 /etc/apache2/sites-available/000-default.conf 與 /etc/apache2/sites-available/default-ssl.conf 開頭的位置加入以下設定:
用以下命令設定 Event MPM 和 php-fpm
1 2 3 4 5 6 7 |
a2dismod php7.0 # 停用原本 process base php a2dismod mpm_prefork # 停用 prefork MPM 模組 a2enmod mpm_event # 啟用 event MPM 模組 a2enmod proxy_fcgi # 啟用 FastCGI 模組以搭配 PHP FPM apt-get -y install php7.0-fpm # 安裝 php fpm 套件 service apache2 restart service php7.0-fpm restart |
驗証成果
經過上面的步驟,Wordpress 復原的工作就完成了。為避免你連到網路上的實體網站,建議你把網路線拔掉,以確保沒任何誤會。你可以從 Linux 系統內試著用原本的 domain name 去瀏覽你的網站,應該就可以了。但因為domain name的關係在, Linux 外是沒辦法連進去的。如果要可以連,可以在第11行改成取代成IP的方式,這樣應該就行了。或者比較麻煩在該機器上把 host name 設對,我們是驗証用的,應該簡單在 Linux 內瀏覽即可。
搬家到Google Compute Platform (GCP) 筆記
最近把東西都從 Bluehost 搬到GCP,中間有些小差異需要修改,就在這邊記下。
Google Search Console 更新 sitemap script
網誌有更新時,通知 Google Search Engine 來重新檢索
1 2 |
#!/bin/bash wget http://www.google.com/ping?sitemap=https://moon-half.info/sitemap.xml -O /dev/null |
PLink 自動備份
GCP 需要將 Public Key 登錄,才能用憑証登入。所以在備份時,指定key file和帳號。再透過遠端命令,將資料 tar 起來輸出到 stdout 再轉到 local 存起來。
1 2 3 4 |
@for /f "skip=1" %%x in ('wmic os get localdatetime') do if not defined MyDate set MyDate=%%x @set today=%MyDate:~0,4%_%MyDate:~4,2%_%MyDate:~6,2% cd/d d:\moon-half_backup plink -i SSH_KEY 帳號@DOMAIN "./sitemap.sh ;backup/backup_sql.sh;tar --exclude='public_html/webhd' -c -J public_html wp.sql" > moon-half_%today%.tar.xz |
MYSQL 備份 Script
backup_sql.sh 的內容
1 2 |
#!/bin/bash mysqldump -p資料庫密碼 --user=使用者名稱 資料㢑名稱 > ~/wp.sql |
MYSQL 創建使用者
在前面的測試流程,是用 root 來直接復原資料庫。在實際上這比較不安全,我們可以先創建一個與原 WordPress 資料庫的使用者,在由其去創建table。以下指令還是賦予全部的權限,安全性並沒有提升。
1 2 3 |
CREATE USER '使用者名稱'@'localhost' IDENTIFIED BY '使用者密碼'; GRANT ALL PRIVILEGES ON * . * TO '使用者名稱'@'localhost'; FLUSH PRIVILEGES; |
Virtual Host
前面測試的流程是把所有的WEB檔案放在 /var/www/html,實務上放在個人使用者的目錄,可以做一個修改。(/etc/apache2/sites-enabled/000-default.conf)
1 2 3 4 5 6 7 |
<VirtualHost *:80> ServerAdmin webmaster@localhost DocumentRoot /home/XXXX/public_html/ # 修改此處 . . . . |
Apache User
把 Apache 執行的使用者,改成跟上面的 Virtual Host 同樣的使用者,才能在上傳時操作。
1 2 3 4 5 |
# These need to be set in /etc/apache2/envvars #User ${APACHE_RUN_USER} #Group ${APACHE_RUN_GROUP} User XXXX #改這 Group XXXX #改這 |
SSL 憑証 (Let’s Encrypt)
參考 Let’S Encryption 網站,已有針對 Apache+Ubuntu16.04 的命令可以執行,自動修改設定檔和產生金鑰。據說3個月到期前還會自動更新~~~
自動備份檔驗証命令
由於上述講的備份流程自己用起來都稍嫌麻煩,為了能更容易的驗証備份檔。可以建立一個 VM 將所需套件都安裝好,並將備份檔目錄與 VM 內的 Linux 分享,這樣就可以達到快速解壓設定,再由 user 開啟網頁來驗証了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
#!/bin/bash clear_db() { for i in `mysql -p123456 -uroot -e 'show databases;' | xargs echo` do if [ "$i" = "information_schema" ] || [ "$i" = "mysql" ] || [ "$i" = "performance_schema" ] || [ "$i" = "Database" ];then continue else echo remove database "$i" mysql -p123456 -uroot -e "drop database $i;" fi done } echo 127.0.0.1 >> /etc/hosts clear_db ARFILE=`ls /mnt/hgfs/mh/ | grep "moon-half" | sort -r | head -n 1` cd #切回 /root 方便工作 rm -rf /var/www/html/ rm -rf public_html tar zvfx /mnt/hgfs/mh/$ARFILE > /dev/null #解壓縮備份檔 mv public_html/ /var/www/html #把備份的HTML資料夾,移到系統的位置 cd /var/www/html #切到 HTML 位置,方便操作 DBNAME=`cat wp-config.php | grep DB_NAME | cut -d"'" -f4` # 取得Wordpress的資料庫名稱 mysql -p123456 -u root -e "create database $DBNAME" # 新增資料庫到 MySQL sed -i "/DB_USER/c\define('DB_USER', 'root');" /var/www/html/wp-config.php sed -i "/DB_PASSWORD/c\define('DB_PASSWORD', '123456');" /var/www/html/wp-config.php sed -i 's/utf8mb4_unicode_520_ci/utf8mb4_unicode_ci/g' ~/wp.sql mysql -p123456 -u root $DBNAME < ~/wp.sql # 把資料庫備份倒回去系統上的 MySQL chmod 777 /var/www/html/ -R # 為了方便操作,直接把 HTML 的權限改成所有人都可以寫 apachectl restart # 重啟 Apache echo "先從本地登入管理頁面後,再將 Linux 的 eth0 關掉。然後關掉 Wordpress 的 Jetpack/Google Captcha 插件,這樣會比較快,再進行其它測試。" echo "請勿必按照此流程。先關掉eth0會無法登入 (Captcha 問題),登入沒關eth0直接關Jetpack會造成運作的版本Jetpack也被關掉,關eth0沒關Jetpack會圖片顯示不出,都不關則會看到 Jetpack 的圖片無法驗証備份狀況。" |
Latest Comments