1. 程式人生 > 其它 >NFS+一點點web服務(需內網,無內網可改成外網地址)

NFS+一點點web服務(需內網,無內網可改成外網地址)

第1章 儲存與nfs儲存概述

1.為什麼用共享儲存
2.儲存有哪些工具
3.共享儲存應用場景有哪些
4.部署nfs共享儲存
5.客戶端嘗試連線共享儲存
什麼是NFS?
NFS 是 Network File System 的縮寫及網路檔案系統。 NFS 主要功能是通過區域網絡讓不同的主機系統之間可以共享檔案或目錄。
NFS 系統和 Windows 網路共享、網路驅動器類似, 只不過 windows 用於區域網, NFS 用於企業叢集架構中, 如果是大型網站, 會用到更復雜的分散式檔案系統 FastDFS,glusterfs,HDFS
那麼我們為什麼要使用資料儲存共享服務?
1.實現多臺伺服器之間資料共享
2.實現多臺伺服器之間資料一致

1.1 NFS應用場景

下面我將通過圖解給大家展示叢集需要共享儲存服務的理由。
1.A 使用者上傳圖片經過負載均衡,負載均衡將上傳請求排程至 WEB1 伺服器上。
2.B 使用者訪問 A 使用者上傳的圖片,此時 B 使用者被負載均衡排程至 WEB2 上,因為 WEB2 上沒有這張圖片,所以 B使用者無法看到 A 使用者傳的圖片

如果有共享儲存的情況
1.A 使用者上傳圖片無論被負載均衡排程至 WEB1 還是 WEB2, 最終資料都被寫入至共享儲存
2.B 使用者訪問 A 使用者上傳圖片時,無論排程至 WEB1 還是 WEB2,最終都會上共享儲存訪問對應的檔案,這樣就可以訪問到資源了

1.2 nfs儲存工作原理實現

NFS工作原理

1.使用者程序訪問 NFS 客戶端,使用不同的函式對資料進行處理
2.NFS 客戶端通過 TCP/IP 的方式傳遞給 NFS 服務端
3.NFS 服務端接收到請求後,會先呼叫 portmap 程序進行埠對映。
4.nfsd 程序用於判斷 NFS 客戶端是否擁有許可權連線 NFS 服務端。
5.Rpc.mount 程序判斷客戶端是否有對應的許可權進行驗證。
6.idmap 程序實現使用者對映和壓縮
7.最後 NFS 服務端會將對應請求的函式轉換為本地能識別的命令,傳遞至核心,由核心驅動硬體。
注意: rpc 是一個遠端過程呼叫,那麼使用 nfs 必須有 rpc 服務

1.3 前提條件

1.nfs依賴於RPC服務來傳遞訊息
2.NFS服務啟動的埠號是隨機的,啟動之後會向本地的RCP註冊
3.先啟動RPC服務,再啟動NFS服務
4.NFS和RPC之間的通訊是他們自己內部完成的,對於使用者來說無感知
5.NFS客戶端和服務端不會直接溝通,必須通過RPC服務傳遞訊息
6.防火牆要開放RPC服務的埠

第2章 nfs服務端部署

2.1 安裝nfs

yum install nfs-utils -y

2.2 配置引數

nfs 服務程式的配置檔案為/etc/exports,需要嚴格按照共享目錄的路徑 允許訪問的 NFS 客戶端(共享許可權引數)格式書寫,定義要共享的目錄與相應的許可權,具體書寫方式如下圖所示

配置檔案引數解釋:

執行 man exports 命令,然後切換到檔案結尾,可以快速檢視如下樣例格式:
nfs共享引數	引數作用
rw           讀寫許可權
ro	       只讀許可權
root_squash	
當 NFS 客戶端以 root 管理員訪問時,對映為 NFS 伺服器的匿名使用者(不常用)
no_root_squash
當 NFS 客戶端以 root 管理員訪問時,對映為 NFS 伺服器的 root 管理員(不常用)
all_squash
無論 NFS 客戶端使用什麼賬戶訪問,均對映為 NFS 伺服器的匿名使用者(常用)
no_all_squash
無論 NFS 客戶端使用什麼賬戶訪問,都不進行壓縮
sync
同時將資料寫入到記憶體與硬碟中,保證不丟失資料
async
優先將資料儲存到記憶體,然後再寫入硬碟;這樣效率更高,但可能會丟失資料
anonuid
配置 all_squash 使用,指定 NFS 的使用者 UID,必須存在系統

anongid
配置 all_squash 使用,指定 NFS 的使用者 UID,必須存在系統

2.3 配置NFS服務端

寫入配置檔案:注意!IP地址和後面的小括號沒有空格

[root@nfs01 ~]# cat > /etc/exports <<EOF
/data 172.16.1.0/24(rw,sync,all_squash)
EOF

建立資料目錄和授權:

[root@nfs01 ~]# mkdir /data -p
[root@nfs01 ~]# chown -R nfsnobody:nfsnobody /data/

2.4 啟動nfs

[root@nfs01 ~]# systemctl start nfs-server.service

2.5 檢查命令

[root@nfs01 ~]# showmount -e 172.16.1.31
Export list for 172.16.1.31:
/data 172.16.1.0/24

2.6 加入開機自啟動

在使用 NFS 服務進行檔案共享之前,需要使用 RPC(Remote Procedure Call 遠端過程呼叫服務將 NFS 伺服器的IP 地址和埠號資訊傳送給客戶端。因此,在啟動 NFS 服務之前,需要先重啟並啟用 rpcbind 服務程式,同時都加入開機自啟動

[root@nfs01 ~]# systemctl enable rpcbind nfs-server
[root@nfs01 ~]# systemctl restart rpcbind nfs-server

2.7 客戶端掛載命令

客戶端安裝nfs服務十分簡單,只需要安裝nfs軟體包即可

[root@backup ~]# yum install nfs-utils rpcbind -y

安裝完成後只需要啟動rpcbind,不需要啟動nfs

[root@backup ~]# systemctl restart rpcbind

使用showmount命令檢視nfs共享資訊查詢 NFS 伺服器的遠端共享資訊,其輸出格式為“共享的目錄名稱 允許使用客戶端地址”。

[root@backup ~]# showmount -e 172.16.1.31
Export list for 172.16.1.31:
/data 172.16.1.0/24	

掛載命令: 建立掛載目錄
在 NFS 客戶端建立一個掛載目錄, 使用 mount 命令並結合-t 引數, 指定要掛載的檔案系統的型別, 並在命令後面寫上伺服器的 IP 地址, 以及伺服器上的共享目錄, 最後需要寫上要掛載到本地系統(客戶端)的目錄

[root@backup ~]# mkdir /data -p
[root@backup ~]# mount -t nfs 172.16.1.31:/data /data

檢視是否掛載成功:

[root@backup ~]# df -h
檔案系統           容量  已用  可用 已用% 掛載點
/dev/sda3           18G  1.9G   17G   11% /
devtmpfs           480M     0  480M    0% /dev
tmpfs              489M     0  489M    0% /dev/shm
tmpfs              489M   32M  458M    7% /run
tmpfs              489M     0  489M    0% /sys/fs/cgroup
/dev/sda1         1014M  110M  905M   11% /boot
tmpfs               98M     0   98M    0% /run/user/0
172.16.1.31:/data   18G  1.9G   17G   11% /data

測試寫入資料是否正常

[root@backup ~]# echo "111" > /data/111.txt
[root@backup ~]# cat /data/111.txt 
oldzhang

寫入開機自動掛載

[root@backup ~]# vim /etc/fstab 
[root@backup ~]# tail -1 /etc/fstab       
172.16.1.31:/data                         /data                   nfs     defaults        0 0
[root@backup ~]# mount -a
[root@backup ~]# df -h
檔案系統           容量  已用  可用 已用% 掛載點
/dev/sda3           18G  1.9G   17G   11% /
devtmpfs           480M     0  480M    0% /dev
tmpfs              489M     0  489M    0% /dev/shm
tmpfs              489M   32M  458M    7% /run
tmpfs              489M     0  489M    0% /sys/fs/cgroup
/dev/sda1         1014M  110M  905M   11% /boot
tmpfs               98M     0   98M    0% /run/user/0
172.16.1.31:/data   18G  1.9G   17G   11% /data

解除安裝命令:注意!解除安裝的時候如果提示”umount.nfs: /nfsdir: device is busy”先切換到其他目錄再解除安裝

[root@backup ~]# umount /data/

強制解除安裝命令:

[root@backup ~]# umount -rl /data/

2.8 NFS 許可權驗證

2.8.1 驗證ro許可權

服務端配置:

[root@nfs01 ~]# cat /etc/exports
/data 172.16.1.0/24(ro,sync,all_squash)
[root@nfs01 ~]# systemctl restart nfs-server.service
[root@nfs01 ~]# showmount -e 172.16.1.31
Export list for 172.16.1.31:
/data 172.16.1.0/24

客戶端掛載:

[root@backup ~]# mount -t nfs 172.16.1.31:/data /data
[root@backup ~]# df -h
檔案系統           容量  已用  可用 已用% 掛載點
/dev/sda3           18G  1.9G   17G   11% /
devtmpfs           480M     0  480M    0% /dev
tmpfs              489M     0  489M    0% /dev/shm
tmpfs              489M   38M  452M    8% /run
tmpfs              489M     0  489M    0% /sys/fs/cgroup
/dev/sda1         1014M  110M  905M   11% /boot
tmpfs               98M     0   98M    0% /run/user/0
172.16.1.31:/data   18G  1.9G   17G   11% /data

測試讀取:

[root@backup ~]# cat /data/111.txt 
111

寫入測試:

[root@backup ~]# echo "backup" > /data/111.txt 
-bash: /data/111.txt: 許可權不夠

2.8.2 驗證all_squash、 anonuid、 anongid 許可權

服務端配置:

[root@nfs01 ~]# cat /etc/exports 
/data 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)

服務端建立使用者及授權:

[root@nfs01 ~]# useradd -s /sbin/nologin -M -u 666 -g 666 www
[root@nfs01 ~]# id www
uid=666(www) gid=666(www) 組=666(www)

重啟NFS服務:

[root@nfs01 ~]# systemctl restart nfs-server.service

更改目錄授權:

[root@nfs01 ~]# chown -R www:www /data/
[root@nfs01 ~]# ls -ld /data/
drwxr-xr-x 2 www www 35 7月  17 19:50 /data/

客戶端操作:

[root@backup ~]# mount -t nfs 172.16.1.31:/data /data
[root@backup ~]# ls -ld /data/
drwxr-xr-x 2 666 666 35 7月  17 19:50 /data/
[root@backup ~]# ll /data/
總用量 4
-rw-r--r-- 1 666 666 0 7月  17 19:50 123
-rw-r--r-- 1 666 666 9 7月  17 19:46 111.txt
[root@backup ~]# echo "111" > /data/111.txt 
[root@backup ~]# cat /data/111.txt                    
oldzhangy

我們會發現依然可以寫入,但是為了避免這種情況發生,建議客戶端也建立相同uid gid的使用者

[root@backup ~]# groupadd -g 666 www
[root@backup ~]# useradd -s /sbin/nologin -M -u 666 -g 666 www
[root@backup ~]# id www
uid=666(www) gid=666(www) 組=666(www)
[root@backup ~]# ls -ld /data/
drwxr-xr-x 2 www www 35 7月  17 19:50 /data/
[root@backup ~]# ll /data/    
總用量 4
-rw-r--r-- 1 www www  0 7月  17 19:50 123
-rw-r--r-- 1 www www 10 7月  17 21:31 111.txt

檢視nfs埠

[root@nfs01 ~]# rpcinfo -p
   program vers proto   port  service
    100000    4   tcp    111  portmapper
    100000    3   tcp    111  portmapper
    100000    2   tcp    111  portmapper
    100000    4   udp    111  portmapper
    100000    3   udp    111  portmapper
    100000    2   udp    111  portmapper
    100024    1   udp  43177  status
    100024    1   tcp  36750  status
    100003    3   tcp   2049  nfs
    100003    4   tcp   2049  nfs
    100227    3   tcp   2049  nfs_acl
    100003    3   udp   2049  nfs
    100003    4   udp   2049  nfs
    100227    3   udp   2049  nfs_acl
    100021    1   udp  41388  nlockmgr
    100021    3   udp  41388  nlockmgr
    100021    4   udp  41388  nlockmgr
    100021    1   tcp  43678  nlockmgr
    100021    3   tcp  43678  nlockmgr
    100021    4   tcp  43678  nlockmgr```

firewall防火牆配置

firewall-cmd --add-service=nfs --permanent
firewall-cmd --add-service=mountd --permanent
firewall-cmd --add-service=rpc-bind --permanent
firewall-cmd --reload

iptables防火牆配置

參考部落格

https://www.cnblogs.com/xiangsikai/p/10297233.html

啟動NFS會開啟如下埠:

1)portmapper 埠:111 udp/tcp;
2)nfs/nfs_acl 埠:2049 udp/tcp;
3)mountd 埠:"32768--65535" udp/tcp
4)nlockmgr 埠:"32768--65535" udp/tcp
系統 RPC服務在 nfs服務啟動時預設會給 mountd 和 nlockmgr 動態選取一個隨機埠來進行通訊。

1.檢視NFS啟動後的埠

[root@nfs01 /opt/sersync]# rpcinfo -p
   program vers proto   port  service
    100000    4   tcp    111  portmapper
    100000    3   tcp    111  portmapper
    100000    2   tcp    111  portmapper
    100000    4   udp    111  portmapper
    100000    3   udp    111  portmapper
    100000    2   udp    111  portmapper
    100024    1   udp  43177  status
    100024    1   tcp  36750  status
    100003    3   tcp   2049  nfs
    100003    4   tcp   2049  nfs
    100227    3   tcp   2049  nfs_acl
    100003    3   udp   2049  nfs
    100003    4   udp   2049  nfs
    100227    3   udp   2049  nfs_acl
    100021    1   udp  41388  nlockmgr
    100021    3   udp  41388  nlockmgr
    100021    4   udp  41388  nlockmgr
    100021    1   tcp  43678  nlockmgr
    100021    3   tcp  43678  nlockmgr
    100021    4   tcp  43678  nlockmgr

2.將隨機的埠號設定固定

[root@nfs01 ~]# vim /etc/sysconfig/nfs
[root@nfs01 ~]# tail -5 /etc/sysconfig/nfs
RQUOTAD_PORT=4001
LOCKD_TCPPORT=4002
LOCKD_UDPPORT=4002
MOUNTD_PORT=4003
STATD_PORT=4004

3.重啟nfs和rpc服務

[root@nfs01 ~]# systemctl restart rpcbind.service nfs-server.service

4.再次檢視埠資訊,發現埠號已經固定了

[root@nfs01 ~]# rpcinfo -p
   program vers proto   port  service
    100000    4   tcp    111  portmapper
    100000    3   tcp    111  portmapper
    100000    2   tcp    111  portmapper
    100000    4   udp    111  portmapper
    100000    3   udp    111  portmapper
    100000    2   udp    111  portmapper
    100024    1   udp  43177  status
    100024    1   tcp  36750  status
    100005    1   udp   4003  mountd
    100005    1   tcp   4003  mountd
    100005    2   udp   4003  mountd
    100005    2   tcp   4003  mountd
    100005    3   udp   4003  mountd
    100005    3   tcp   4003  mountd
    100003    3   tcp   2049  nfs
    100003    4   tcp   2049  nfs
    100227    3   tcp   2049  nfs_acl
    100003    3   udp   2049  nfs
    100003    4   udp   2049  nfs
    100227    3   udp   2049  nfs_acl
    100021    1   udp   4002  nlockmgr
    100021    3   udp   4002  nlockmgr
    100021    4   udp   4002  nlockmgr
    100021    1   tcp   4002  nlockmgr
    100021    3   tcp   4002  nlockmgr
    100021    4   tcp   4002  nlockmgr

5.設定iptables

-A INPUT -p tcp -m tcp --dport 111 -j ACCEPT
-A INPUT -p udp -m udp --dport 111 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 2049 -j ACCEPT
-A INPUT -p udp -m udp --dport 2049 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 4001:4004 -j ACCEPT
-A INPUT -p udp -m udp --dport 4001:4004 -j ACCEPT

6.儲存配置

iptables-save 
iptables -nL

NFS故障案例

如果設定了開機自啟動,但是系統啟動的時候NFS並沒有提供服務,就會導致開機自檢的時候卡在掛在那一步

開機啟動時新增rd.break
ctrl+x
mount -o remount,rw /sysroot/
chroot /sysroot/

第3章搭建考試系統

3.1、搭建WEB服務

1、安裝web軟體
[root@web01 opt]# yum install httpd php php-devel -y

2、將程式碼放置於網站的根目錄
[root@web01 opt]# cd /var/www/html/

# 上傳程式碼

3、授權
[root@web01 html]# chown -R www.www /var/www/html

4、關閉selinux和防火牆
[root@nfs ~]# setenforce 0
[root@nfs ~]# systemctl disable --now firewalld

5、修改web軟體的使用者
[root@web01 html]# vim /etc/httpd/conf/httpd.conf
User www
Group www

6、啟動web軟體
[root@web01 html]# systemctl start httpd

7、測試

	1、上傳
	
	2、訪問
    http://172.16.1.7/upload/1_linux.jpg

3.2、配合NFS實現檔案共享

1、修改NFS配置檔案
[root@nfs nfs1]# vim /etc/exports
/web/upload  172.16.1.0/20(rw,sync,all_squash,anonuid=666,anongid=666)

2、建立掛載點
[root@nfs nfs1]# mkdir /web/upload -p
[root@nfs nfs1]# chown www.www /web/upload

3、重啟NFS
[root@nfs nfs1]# systemctl restart nfs-server rpcbind

4、客戶端安裝NFS軟體
[root@web01 html]# yum install nfs-utils -y
[root@web02 html]# yum install nfs-utils -y
[root@web03 html]# yum install nfs-utils -y

5、掛載
[root@web01 html]# mount -t nfs 172.16.1.31:/web/upload /var/www/html/upload
[root@web02 html]# mount -t nfs 172.16.1.31:/web/upload /var/www/html/upload
[root@web03 html]# mount -t nfs 172.16.1.31:/web/upload /var/www/html/upload

6、測試
用web2上傳,web3檢視

效果圖如下:

第4章 NFS小結

NFS 儲存優點
1.NFS 檔案系統簡單易用、方便部署、資料可靠、服務穩定、滿足中小企業需求。
2.NFS 檔案系統記憶體放的資料都在檔案系統之上,所有資料都是能看得見
NFS 儲存侷限
1.存在單點故障, 如果構建高可用維護麻煩 web->nfs()->backup
2.NFS 資料明文, 並不對資料做任何校驗。
3.客戶端掛載 NFS 服務沒有密碼驗證, 安全性一般(內網使用)
NFS 應用建議
1.生產場景應將靜態資料儘可能往前端推, 減少後端儲存壓力
2.必須將儲存裡的靜態資源通過 CDN 快取 jpg\png\mp4\avi\css\js
3.如果沒有快取或架構本身歷史遺留問題太大, 在多儲存也無用