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

1.劇情回顧

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

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

無標題.png

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

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

image.png

    (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共享用戶上傳的圖片。

image.pngimage.png

5.NFS系統原理介紹

    image.png

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

image.png

    在前面我們說過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

image.png

    (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端口是不會變動的

image.png

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

image.png    

    (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服務端也新建這樣的一個用戶。

image.png

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....)

   image.png

    這個參數文件的意思是:共享的目錄爲/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查看掛載的情況

image.png

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

image.png

    (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共享目錄下。 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章