wordpress使用rsync加openvpn進行同步和備份
文章目錄
文:鐵樂與貓
2018-9-20
我以前有寫過一篇《wordpress利用rsync同步備份》
實踐了一年後發現,當中的策略存在很大的弊端。下面會詳說。
先介紹一下環境:
環境
- 阿里雲服務器
- 1核cpu,2G內存,1M帶寬
- 系統:openSUSE Leap 42.3
- 客戶端:win7 64位
- 己搭建好wordpress,網站目錄路徑爲
/www/wordpress
- wordpress使用mysql做數據庫
- 服務器上面已做腳本和計劃任務將wordpress使用的數據庫與web目錄每天壓縮備份放到
/data/backup
目錄下 - rsync 3.1.0及cwrsync5.5
- openVPN 2.3.4
普通同步策略的弊端
之前使用的備份手段是在服務器端使用腳本每天深夜對wordpress相關的數據庫做備份和導出到備份目錄下,數據庫的備份文件普遍只是1M多一點的大小,無礙同步。
關鍵的是我對整個wordpress項目的壓縮備份從以前的30多M慢慢上升到現在的每個文件都達100多M大小了。主要增長的是圖片,由於我將wordpress當成圖牀來用了,還曾經上傳過6M大小的一張圖片。
所以問題就出在一週過後對這些wordpress備份好的壓縮文件同步的時候,雲服務器1M的帶寬並不夠快,經常出現最多同步一到兩個壓縮文件就卡死了。
我是按天備份數據的,以致我從之前的保留15天到現在只保留5天了,就是因爲不想同步太多備份文件。
另外由於每次利用rsync去拉取服務器端的備份文件的時候,並沒有利用上rsync增量同步的優點,因爲你拉取的是備份文件,而壓縮過的備份文件必然是每一份都不同,每一次rsync都需要拉取至少達100多m的數據大小。
且由於這樣惡劣的環境,我是沒有每天去做rsync同步的事情了。
也就是,備份只在服務器上有做好,客戶端這邊想做異地備份沒法好好做。
既然分析出弊端了,相應的解決方案也就有了。
改良的同步方案
- 服務端的備份方案可以不變,甚至可以保留天數恢復到15天。
- 客戶端的rsync同步方案需要改變。
- 一是同步db數據文件;
- 二是直接同步wordpress整個項目目錄;
- 三是不再同步備份好的wordpress目錄的壓縮文件。
- 四是rsync同步時不再直接走公網ip,而是讓服務端搭建好openvpn後,客戶端直接走通過openvpn相連好的10.8.0.1 IP。穩定性比直接跑公網ip同步要好多了。
- 如此的優點有:
- 一是數據庫的備份文件小,很快就可以同步到客戶端,一直以來都是不受影響的。
- 二是直接同步wordpress整個項目目錄,可以最大程度的利用上了rsync的增量同步功能。
- 三是服務器端有保存wordpress項目的備份了,如果客戶端想做異地備份,可以在客戶端對相應己同步回來的wordpress項目對應的文件做壓縮備份操作。節省時間效率做到同樣的事情。
- 通過openvpn相連的客戶端與服務端,在做rsync同步時穩定性極大提升。
從頭細說起
以上只是在你有看完《wordpress利用rsync同步備份》一文後能看懂的說明。
下面就是你完全不看前面的也能跟着做的詳細說明了。
當然搭建wordpress博客網站和部署好mysql是不會再從頭說起的,這裏就從假設你搭建完成後說起吧。
備份數據
-
備份數據庫的腳本文件,供參考:
/data/shell/mysql_backup.sh #!/bin/bash ##本機每天自動備份wordpress數據庫到備份文件夾## backup='/data/backup/db' # 定義備份路徑 time=`date +%Y%m%d` dbhost="localhost" dbuser="wordpress" # 這裏填寫相應的數據庫用戶名 dbpass="這裏填寫你的wordpress數據庫的密碼" db="wordpress" # 這裏填的就是wordpress的數據庫名了 mysqldump -h${dbhost} -u${dbuser} -p${dbpass} ${db} 2>/dev/null | gzip > $backup/wordpress_$time.sql.gz ##導出數據庫備份文件到備份目錄並且進行壓縮成gz格式,解壓時使用gzid -d命令## sleep 10s cd $backup find ./ -type f -name "wordpress_*.sql.gz" -mtime +15 -exec rm -fv {} \; ##超過15天的備份文件自動清除##
-
定時器
-------------------定時器------------------ opensuse-wordpress:/data/shell # crontab -l # DO NOT EDIT THIS FILE - edit the master and reinstall. # (/tmp/crontab.D6KBVq installed on Wed Dec 20 17:30:03 2017) # (Cronie version 4.2) #每天凌晨0點備份數據庫 0 0 * * * sh /data/shell/mysql_backup.sh > /dev/null 2>&1
打包wordpress項目和備份
-
打包項目和備份的腳本,供參考:
/data/shell/wordpress_backup.sh #!/bin/bash ##本機每天自動備份打包wordpress主目錄## www='/www' backup='/data/backup/wordpress' time=`date +%Y%m%d` tar -zcf $backup/wordpress_$time.tar.gz $www #對wordpress的整個web目錄進行打包到備份文件夾下 sleep 12s cd $backup find ./ -type f -name "wordpress_*.tar.gz" -mtime +15 -exec rm -fv {} \; ##超過15天的備份文件自動清除##
-
定時器
---------------------定時器執行--------------- #每天凌晨0點備份數據庫 0 0 * * * sh /data/shell/mysql_backup.sh > /dev/null 2>&1 #每天凌晨1點備份wordpress主web目錄 0 1 * * * sh /data/shell/wordpress_backup.sh > /dev/null 2>&1
服務端安裝rsync
由於是openSUSE系統,使用的是zypper來安裝,如果你的中centos系統則相應使用yum安裝是了。
operation@opensuse-wordpress:~> sudo zypper in rsync
[sudo] password for root:
Loading repository data…
Reading installed packages…
Resolving package dependencies…
The following NEW package is going to be installed:
rsync
1 new package to install.
Overall download size: 323.2 KiB. Already cached: 0 B. After the operation, additional 625.5 KiB will be used.
Continue? [y/n/…? shows all options] (y): y
Retrieving package rsync-3.1.0-8.4.x86_64 (1/1), 323.2 KiB (625.5 KiB unpacked)
Retrieving: rsync-3.1.0-8.4.x86_64.rpm ……………………………………………………………[done]
Checking for file conflicts: …………………………………………………………………….[done]
(1/1) Installing: rsync-3.1.0-8.4.x86_64 ………………………………………………………….[done]
服務端配置rsync
- rsync服務器端需要兩個配置文件:
rsyncd.conf
rsyncd.conf
默認存放在/etc/
目錄下,同時它也是rsync服務器的主配置文件。- 該文件配置了rsync服務器的控制認證、訪問、日誌記錄等等。
rsyncd.secrets
rsyncd.secrets
主要用於存儲rsync用戶名和密碼。
如果是編譯安裝的rsync是不會生成以上這兩個配置文件的,需要我們手工進行創建。 不過在這我是用zypper安裝的,當然直接在/etc
下面就有rsyncd.conf
和rsyncd.secrets
文件。
- 編輯配置文件
sudo vim /etc/rsyncd.conf
gid = users
read only = true
use chroot = true
transfer logging = true
log format = %h %o %f %l %b
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
hosts allow = trusted.hosts
slp refresh = 300
use slp = false
secrets file=/etc/rsyncd.secrets
##以上是全局配置
#[Example]
#path = /home/Example
#comment = An Example
#auth users = user
#secrets file = /etc/rsyncd.secrets
# 這一段是給你參照的例子
[backup]
uid = root
gid = root
path = /data/backup/db
hosts allow = 10.8.0.0/255.255.255.0
ignore errors
read only = true
auth users = wordpress
secrets file = /etc/rsyncd.secrets
# 以上是針對數據庫備份文件所做的同步配置
[wordpress]
uid = root
gid = root
path = /www/wordpress
hosts allow = 10.8.0.0/255.255.255.0
ignore errors
read only = true
auth users = wordpress
secrets file = /etc/rsyncd.secrets
# 以上是針對wordpress網站項目文件夾所在的同步配置
rsync默認是在nobody用戶下運行的, 但是我們測試爲了同步時不爲各種權限的事情煩惱,就讓其在root用戶下運行。當然如果是生產環境下就要慎重了。個人使用的wordpress的話,且因爲後面是用openvpn相通才運行的話,安全還是有保障的。
-
創建密碼文件
配置文件修改完成後,創建密碼文件:
vim /etc/rsyncd.secrets
將wordpress的用戶和密碼編輯進去,例如: wordpress:ABCabc123
注:該密碼文件中的用戶和密碼可以進行自定義,同時該用戶不一定要在服務器中的系統用戶中存在。 -
密碼文件創建完畢後,還需要將其權限設置爲600,否則會在以後同步時提示驗證出錯。zypper安裝完成的不用再做此步驟也是600了。
chmod 600 /etc/rsyncd.secrets
一個rsync配置文件中可以包含多個認證模塊(比如上面列表的[backup]
),同時一個密碼文件中也可以存放多個用戶和其對應的密碼。其中每一個認證模塊可以對應不同的客戶端。
服務端啓動rsync
sudo rsync –daemon
可以pstree看rsync進程是否有運行和netstat看873端口開起來沒有。
之後修改rsync的配置文件的話,一般不需要重啓rsync進程也能自動生效。如果確實沒有生效,也可以使用systemctl命令來做啓動和重啓及查看狀態等。
例如:systemctl status rsync
就是查看rsync進程的狀態。
windows客戶端安裝cwrsync
官網鏈接:https://www.itefix.net/cwrsync
cwRsync-5.5.0-32
位的下載鏈接如下: https://www.itefix.net/dl/cwRsync_5.5.0_x86_Free.zip
下載解壓完成,雙擊目錄下的cwrsync.cmd
或在cmd命令提示窗口下運行完成批處理安裝。
-
rsync命令添加到系統環境變量:
右鍵“我的電腦(計算機)”-“屬性”-“高級系統設置”; 彈出“系統屬性”框,再點擊“高級”標籤-“環境變量”; 彈出“環境變量”框,選中下方的系統變量一欄中的“Path”,再點擊“編輯”進行編輯系統變量,如圖:
在Path的變量值一欄結尾,我們要續上cwRsync的絕對路徑進去,注意的是前面要替上一個變量值添加上分號區分。類似我的就是填入
;D:\PortableSoft\cwRsync\bin
,確定。 -
放行rsync端口
安裝完成後,阿里雲服務器安全組上開通873端口(放行rsync),當然如果你的服務器開啓了防火牆的同樣要在防火牆規則中對873端口進行放行。
-
建立密碼文件
新建一個單純存放密碼的文本文件, 將服務端設置的對應的用戶的密碼保存進去。比如我就是直接放在cwrsync安裝目錄下,起了個名叫passwd的txt文件。
-
相關腳本
新建一個
wordpress-rsync.bat
文件(也可以直接在記事本中寫好再另存爲bat文件):rsync -avz --progress [email protected]::wordpress /cygdrive/e/wordpress --password-file=/passwd.txt
上面是rsync命令的參考,其中
--password-file=/passwd.txt
表示使用的密碼就是passwd.txt
中的密碼。/cygdrive/e/wordpress
則表示同步保存到客戶端的e盤下的wordpress文件夾下。而
rsync -avz --progress [email protected]::wordpress
則表示客戶端拉取服務端10.8.0.1中rsync配置文件中的wordpress指代的目錄下的所有數據。前面我在服務端的rsync中wordpress指代的路徑就是path = /www/wordpress
。--progress
則是傳輸中顯示百分比。其實這個參數可以不加也行,加上會更好,能直觀的看到腳本運行的時候有沒有卡死。 -
rsync幾個重要參數
經常使用的幾個參數:-v,-a,-z -v, –verbose詳細模式輸出。 -a, –archive歸檔模式,表示以遞歸方式傳輸文件,並保持所有文件屬性不變。 -z, –compress對備份的文件在傳輸時進行壓縮處理。 –delete:刪除那些DST中存在而在SRC中沒有的文件。
-
rsync客戶端拉取服務端文件所用到的模式:
rsync [OPTION]… [USER@]HOST::SRC [DEST]
[email protected]
就是表示使用wordpress用戶去連接10.8.0.1服務器。當然你要先進行測試的話,就將10.8.0.1換成你測試連接的rsync服務器的公網ip地址好了。
我這裏之所以填10.8.0.1是因爲我在wordpress服務器中還安裝了openvpn服務,windows則作爲openvpn的客戶端10.8.0.6之類去進行連接,同步的穩定性會高很多。
使用openvpn連接
具體可點擊此鏈接:《openSUSE搭建OpenVPN》
這篇同樣是我寫的文章來參照安裝和連接使用。本文就不再重複詳述了。
這些準備工作都做好後,右鍵之前寫好的rsync腳本wordpress-rsync.bat
使用管理員身份運行,就可以看出效果了,如下圖:
運行腳本成功後,可看到己將服務端的wordpress整個目錄給同步下來了,
以後做計劃任務或手動運行同步之類的都是增量同步,效率大大提高。
而你如果想做異地備份的話,還可以在客戶端再做個腳本和計劃任務,
再對客戶端的wordpress目錄直接做本地壓縮,
比起在線拉取服務端的備份壓縮文件好太多了。
計劃任務
我們可以通過windows自帶的任務計劃,讓系統自行進行同步。儘管這個和服務器還是有一定的時間差的,但是有總比沒有好。 實際上要滿足實際需求做到實時同步還應使用inotifywait(雖然不像linux那樣支持inotify,但github上有人開發出windows上適用的inotifywait了) 又或者使用cygwin環境再實行安裝inotify會更適宜初學者去做實時同步。
-
例1:
打開任務計劃程序,創建任務,設置好計劃任務,觸發器是每天的3點半,操作是運行e盤上的批處理腳本
rsync_inetpub.bat
。看以上例子就可以知道,如果需要做到近似於實時同步,那就是可以將計劃任務相隔時間設置成一分鐘,而不是特定某一時刻。還有一種需求是自己做一個網站項目,在有需要更新線上服務器的時候才觸發rsync腳本推送到線上服務器集羣上增量同步更新,rsync配合jenkins構建就是這麼來的。
當然,現在我們的需求很簡單,就是每天對線上的wordpress數據做一個拉取同步而己。
-
結合我前面的配置,實際的計劃任務的例子如下:
【控制面板】-【管理工具】-【任務計劃程序】-【任務計劃程序庫】-【新文件夾】創建wordpress文件夾-【創建任務】
起名,【觸發器】填寫每天在什麼時間點進行,或選擇登錄時執行;
【操作】中瀏覽腳本,選中前面我們創建好的腳本文件,表示當觸發時運行該腳本。
-
另,之前安裝的openvpn windows客戶端本身就生成服務,可以開機啓動。而rsync也可以安裝成服務端,這樣有特殊需求的也可以做到互相推送同步。詳情可參考我的另一篇文章:《rsync在windows上的安裝和使用二》
【end】