在生產環境中一系統因架構變化後,把一模塊原有的單節點擴展成了兩個節點,前端採用用nginx作負載的架構,而這兩個節點須要一個公共的存儲來存放用戶上傳的圖片,用戶的併發不高,再因原有業務模塊是從nginx主機上剝離出來的,在原nginx主機上有「img」這個存儲圖片的目錄,因此考慮在nginx主機上安裝nfs服務,再在兩個節點上同點掛載「img」目錄實現集羣節點對圖片目錄的訪問。前端
NFS服務的安裝比較簡單,但在上生產環境時仍是應該在本身的測試環境先驗證,這裏把安裝過程記錄以下:nginx
服務端配置vim
NFS服務端系統環境:centos
[root@nginx-01 ~]# cat /etc/issue CentOS release 6.5 (Final) Kernel \r on an \m [root@nginx-01 ~]# uname -r 2.6.32-431.el6.x86_64
若是系統沒有安裝nfs服務,運行如下命令安裝:tomcat
[root@nginx-01 ~]# yum -y install nfs-utils rpcbind [root@nginx-01 ~]# service rpcbind start [root@nginx-01 ~]# service nfs start [root@nginx-01 ~]# chkconfig nfs on
配置共享目錄:安全
[root@nginx-01 ~]# vim /etc/exports /home/tomcat/img/ 192.168.207.128(insecure,rw,sync,anonuid=500,anongid=500)
#此文件的配置格式爲:<輸出目錄> [客戶端1 選項(訪問權限,用戶映射,其餘)] [客戶端2 選項(訪問權限,用戶映射,其餘)]bash
#註釋服務器
insecure 當mount監聽端口大於1024時須要使用此參數
架構
[root@nginx-01 ~]# ss -tnlp | grep mountd LISTEN 0 128 *:50288 *:* users:(("rpc.mountd",5354,8)) LISTEN 0 128 *:33842 *:* users:(("rpc.mountd",5354,16)) LISTEN 0 128 :::54325 :::* users:(("rpc.mountd",5354,14)) LISTEN 0 128 *:43992 *:* users:(("rpc.mountd",5354,12)) LISTEN 0 128 :::50657 :::* users:(("rpc.mountd",5354,10)) LISTEN 0 128 :::33795 :::* users:(("rpc.mountd",5354,18))
rw read-write,可讀寫;併發
sync:文件同時寫入硬盤和內存;
async:文件暫存於內存,而不是直接寫入內存;
no_root_squash:NFS客戶端鏈接服務端時若是使用的是root的話,那麼對服務端分享的目錄來講,也擁有root權限。顯然開啓這項是不安全的。
root_squash:NFS客戶端鏈接服務端時若是使用的是root的話,那麼對服務端分享的目錄來講,擁有匿名用戶權限,一般他將使用nobody或nfsnobody身份;
all_squash:不論NFS客戶端鏈接服務端時使用什麼用戶,對服務端分享的目錄來講都是擁有匿名用戶權限;
anonuid:匿名用戶的UID值,一般是nobody或nfsnobody,能夠在此處自行設定;
anongid:匿名用戶的GID值。
從新加載/etc/exports的配置:
[root@nginx-01 ~]# exportfs -r
查看本機共享的目錄:
[root@nginx-01 ~]# showmount -e localhost Export list for localhost: /home/tomcat/img 192.168.207.128
客戶端配置
客戶端系統環境:
root@rabbit-0:~# cat /etc/issue Debian GNU/Linux 8 \n \l root@rabbit-0:~# uname -r 3.16.0-4-amd64
在客戶端只須要安裝nfs-client端便可,若是沒有安裝請使用如下命令進行安裝:
root@rabbit-0:~# aptitude -y install nfs-client
列出nfs服務端共享的目錄:
root@rabbit-0:~# showmount -e 192.168.207.129 Export list for 192.168.207.129: /home/tomcat/img 192.168.207.128
因生產環境是須要把nfs服務器的tomcat用戶家目錄下的img目錄共享出來後讓現有的兩個節點的tomcat用戶來掛載到家目錄的img目錄下,因此須要先切換到tomcat用戶下建立img目錄,以下:
root@rabbit-0:~# su - tomcat -c "mkdir ~/img" root@rabbit-0:~# ls /home/tomcat/img/ -ld drwxr-xr-x 2 tomcat tomcat 4096 12月 4 15:23 /home/tomcat/img/
掛載nfs的共享目錄:
root@rabbit-0:~# mount -t nfs 192.168.207.129:/home/tomcat/img /home/tomcat/img -o proto=tcp -o nolock
mount.nfs: access denied by server while mounting 192.168.207.129:/home/tomcat/img
緣由:在centos 6 x64的系統下使用的是NFSv4,在/var/log/messages中能看到nfs啓動時的日誌輸出:
Dec 4 15:21:04 nginx-01 rpc.mountd[2178]: Version 1.2.3 starting Dec 4 15:21:04 nginx-01 kernel: NFSD: Using /var/lib/nfs/v4recovery as the NFSv4 state recovery directory Dec 4 15:21:04 nginx-01 kernel: NFSD: starting 90-second grace period Dec 4 15:21:58 nginx-01 kernel: svc: 192.168.207.128, port=748: unknown version (4 for prog 100003, nfsd)
使用NFSv4時,在nfs服務端作以下操做:
[root@nginx-01 ~]# vim /etc/sysconfig/nfs # Optional arguments passed to rpc.nfsd. See rpc.nfsd(8) # Turn off v2 and v3 protocol support RPCNFSDARGS="-N 2 -N 3" ----->啓用 # Turn off v4 protocol support RPCNFSDARGS="-N 4" ---->啓用
重啓服務:
[root@nginx-01 ~]# service nfs restart
再在客戶端再次嘗試掛載:
root@rabbit-0:~# mount -t nfs 192.168.207.129:/home/tomcat/img /home/tomcat/img -o proto=tcp -o nolock root@rabbit-0:~#
成功掛載。
root@rabbit-0:~# ls /home/tomcat/img/ #以前有兩個文件存在 fstab test
測試:直接用root用戶建立一個文件,但這個文件的權限仍是500的,在服務端uid爲500的用戶是tomcat,這正在我須要的效果。
root@rabbit-0:~# touch /home/tomcat/img/nfs.txt root@rabbit-0:~# ls -l /home/tomcat/img/nfs.txt -rw-r--r-- 1 500 500 0 12月 4 15:24 /home/tomcat/img/nfs.txt
最後讓此目錄自動在主機重啓後自動掛載,我這裏直接寫入到/etc/rc.local裏:
root@rabbit-0:~# cat /etc/rc.local #!/bin/sh -e # # rc.local # # This script is executed at the end of each multiuser runlevel. # Make sure that the script will "exit 0" on success or any other # value on error. # # In order to enable or disable this script just change the execution # bits. # # By default this script does nothing. mount -t nfs 192.168.207.129:/home/tomcat/img /home/tomcat/img -o proto=tcp -o nolock exit 0
重啓測試一下可否成功掛載。