搭建NFS共享目錄,解決wordpress負載均衡圖片上傳問題
在之前的博客裏面,我搭建了兩個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負載均衡圖片上傳問題