1. 程式人生 > >搭建NFS共享目錄,解決wordpress負載均衡圖片上傳問題

搭建NFS共享目錄,解決wordpress負載均衡圖片上傳問題

NFS RPC WordPress

1.劇情回顧

在之前的博客裏面,我搭建了兩個WEB服務器,然後在前端搭建了一個Nginx負載均衡服務器,用來分發請求給兩個不同的服務器(http://blog.51cto.com/superpcm/2095324)。之前的測試沒有問題,原因在於測試程序是單純的靜態網站,不會發生變動的靜態網站。後來我搭建在兩臺WEB上都搭建了wordpress服務,然後上傳圖片的時候做測試。發現圖片上傳只傳到其中的一臺服務器上(比如說web01),當我關閉web01的時候,web02就沒法看到看到那個圖片了。

這是不行的,原因是這畢竟是兩臺服務器,就算做了負載均衡,還是兩個獨立的服務器,又不會像數據庫那樣主動去復制。除非我們的wordpress程序或者涉及到有文件上傳,文件變動的,都放在一個共用的目錄下,那樣才可以的。下面我們用nfs來搭建這樣一個共享的目錄,供web01和web02共用。

技術分享圖片

2.刪除原來的數據和程序

(1)到數據庫刪除,mysql01或者02上操作都行,會自動同步的

技術分享圖片

(2)分別到web01和web02上刪除虛擬主機blog的網站內容

rm -rf /usr/local/nginx/html/blog/

3.NFS介紹

NFS是Network File System的縮寫,中文名稱就是網絡文件系統。它的主要功能是通過網絡(一般是局域網)讓不同的主機系統之間可以共享文件或者目錄。NFS客戶端可以通過掛載的方式將NFS服務端共享的數據目錄掛載到NFS客戶端本地系統中。從客戶端本地來看,NFS服務端共享的目錄就好像是客戶端自己的磁盤分區或者目錄一樣,而實際上卻是遠端的NFS服務器的目錄。

NFS網絡文件系統很像windows系統的網絡共享、安全功能、網絡驅動器映射,這也與Linux系統的samba服務類似。只不過剛剛提到的兩個都是主要用在辦公局域網共享,而互聯網中小型網站集群後端常用NFS進行數據共享,如果是大型網站,那麽有可能還會用到更為復雜的分布式文件系統,例如GlusterFS,有機會再介紹。

4.NFS應用場景

在企業的集群架構中,NFS網絡文件系統一般用來存儲共享視頻、圖片、附件等靜態資源文件,通常網站用戶上傳的文件都會放到NFS共享裏,然後前端所有的節點訪問這些靜態資源時都可以讀取NFS存儲上的資源。NFS服務器所在的位置如下圖,前面的圖解是沒有用NFS前的,WEB02沒法訪問用戶上傳的圖片;後面的圖是用了NFS之後,WEB01和WEB02共享用戶上傳的圖片。

技術分享圖片技術分享圖片

5.NFS系統原理介紹

技術分享圖片

如上圖所示,NFS服務器設置一個共享的文件夾,然後設定好權限,其他有權限的NFS客戶端就可以訪問到這個目錄,然後用mount掛載到自己的目錄下。掛載之後,用df命令查看,基本信息是和本地磁盤一致的。

技術分享圖片

在前面我們說過NFS是通過網絡來傳輸數據的,那麽NFS究竟使用哪些端口來進行數據的傳輸呢?實際上,NFS傳輸數據時使用的端口是隨機的。之所以NFS客戶端知道NFS服務端的端口是因為一個叫做RPC(Remote Procedure Call)的協議來實現的。

因為NFS支持的功能比較多,一個端口是不能滿足這些功能的,所以會使用很多的端口。每啟動一個功能就用一個端口,這樣就有隨機性的了。為了解決這種隨機性帶來無法通信的問題,需要通過RPC服務來解決。RPC會記錄每個NFS對應端口號,並且在NFS客戶端請求時將該端口和功能對應的信息傳遞給請求數據的NFS客戶端,從而保證客戶端能夠正確來連接到NFS端口上去。可以把NFS服務端當作房源,NFS客戶端當作租客然後RPC當中介來理解這個關系。

6.部署NFS服務

說明,本次部署的Linux服務的版本都是CentOS6.5,然後防火墻針對同一網段開放了所有端口。下面進行NFS的部署

(1)用yum來安裝NFS和RPC軟件包,服務端和客戶端都要安裝。

yum install nfs-utils rpcbind -y

技術分享圖片

(2)啟動rpcbind和nfs服務,並把這兩個服務加入到開機啟動中去(只需要在服務端執行)

/etc/init.d/rpcbind start
/etc/init.d/nfs start
echo "/etc/init.d/rpcbind start" >>/etc/rc.local
echo "/etc/init.d/nfsstart" >>/etc/rc.local

可以看到開啟了好幾個端口,其中RPC的111端口是不會變動的

技術分享圖片

查看NFS服務向RPC服務註冊的端口信息,NFS啟動之後可以看到有很多

技術分享圖片

(3)常見的NFS進程簡介

[root@STORE-NFS-01 ~]# ps aux |egrep "nfs|rpc"
rpc         966  0.0  0.0  18976   956 ?        Ss   16:30   0:00 rpcbind
rpcuser     984  0.0  0.1  23348  1364 ?        Ss   16:30   0:00 rpc.statd        #<=檢查文件的一致性
root       1052  0.0  0.0      0     0 ?        S    16:30   0:00 [rpciod/0]
root       1060  0.0  0.1  21784  1380 ?        Ss   16:30   0:00 rpc.mountdx      #<=權限管理驗證等等
root       1066  0.0  0.0      0     0 ?        S    16:30   0:00 [nfsd4]
root       1067  0.0  0.0      0     0 ?        S    16:30   0:00 [nfsd4_callbacks]
root       1068  0.0  0.0      0     0 ?        S    16:30   0:00 [nfsd]        #<=NFS主進程
root       1069  0.0  0.0      0     0 ?        S    16:30   0:00 [nfsd]        
root       1070  0.0  0.0      0     0 ?        S    16:30   0:00 [nfsd]
root       1071  0.0  0.0      0     0 ?        S    16:30   0:00 [nfsd]
root       1072  0.0  0.0      0     0 ?        S    16:30   0:00 [nfsd]
root       1073  0.0  0.0      0     0 ?        S    16:30   0:00 [nfsd]
root       1074  0.0  0.0      0     0 ?        S    16:30   0:00 [nfsd]
root       1075  0.0  0.0      0     0 ?        S    16:30   0:00 [nfsd]        #<=NFS主進程
root       1097  0.0  0.0  25164   740 ?        Ss   16:31   0:00 rpc.idmapd    #<=名字映射後臺進程

(4)在NFS服務端新建需要共享的文件夾

mkdir /WebData
touch /WebData/111.txt    新建一個測試文件

(5)在NFS服務端新建一個nginx用戶,然後修改共享文件夾的所屬用戶

因為web服務器上已經有nginx用戶了,並且兩個web服務器的nginx用戶的uid、gid都是501,在NFS服務端也新建這樣的一個用戶。

技術分享圖片

useradd -u 501 -s /sbin/nologin -M nginx
chown -R nginx:nginx  WebData/

(6)NFS服務端修改配置文件exports,重新啟用nfs服務

nfs的配置文件/etc/exports文件的格式為:

NFS共享目錄 NFS客戶端地址1(參數1,參數2...) 客戶端地址2(參數1,參數2....)

技術分享圖片

這個參數文件的意思是:共享的目錄為/WebData 允許192.168.31.0這個網段的客戶端訪問NFS,擁有的權限是可讀可寫,數據同步寫入服務端磁盤裏面,並且指定了用戶的UID和GID(這個UID和GID必須是服務端和客戶端都有的) 具體的nfs參數可以百度了解下。

檢查exports文件的語法無誤之後,重啟nfs服務

exportfs -rv        #檢查exports文件的語法
/etc/init.d/nfs restart

(7)啟動RPC服務,客戶端上掛載目錄看看能不能成功(前面已經安裝了nfs和rpc軟件)

/etc/init.d/rpcbind start
mount -t nfs 192.168.31.30:/WebData /usr/local/nginx/html/blog/

掛載成功之後可以看到剛剛新建的空文件111.txt,可以用df查看掛載的情況

技術分享圖片

(8)NFS客戶端新建測試文件222.txt,查看所有者是否為nginx,然後把這兩個測試文件都刪除

技術分享圖片

(9)把RPC服務和掛載命令加入開機啟動(所有nfs客戶端執行),到這裏就NFS服務就搭建好了。

echo "/etc/init.d/rpcbind start" >>/etc/rc.local
echo "mount -t nfs 192.168.31.30:/WebData /usr/local/nginx/html/blog/" >>/etc/rc.local

7.在NFS共享目錄下搭建wordpress博客程序

這個就不說明怎麽搭建了,可以參考我的博客 http://blog.51cto.com/superpcm/2092937 ,然後測試圖片的問題,成功解決了。

PS:之所以把整個wordpress都裝在共享的nfs目錄下是為了方便,更好的做法是了解到那些目錄是上傳的圖片和文件的目錄,然後把那些目錄放在nfs共享目錄下。

搭建NFS共享目錄,解決wordpress負載均衡圖片上傳問題