本着个人的想法,搞个图片服务器多省事儿,但一想到要申请经费买云服务器、要开发的去改他的代码.......心里面一万头小白马掠过。
不过还好,经过NFS+ln实践,总算实现了自己想要的结果,也不管它低不低级了,反正能用了,贴上来看看,说不定以后还用得上呢?
说正事儿。
-------------------------------------------- 环境介绍 -----------------------------------------------------
(测试)服务器,系统均为CentOS 7:
web01 : 192.168.1.11 (NFS_master)
web02 : 192.168.1.12
web03 : 192.168.1.13
-------------------------------------------- 搭建NFS -----------------------------------------------------
负载均衡下三台web服务器,取 web01 ( 192.168.1.11 ) 作为 NFS_master 。
关闭防火墙:iptables -F
关闭selinux:setenforce 0
安装NFS相关服务:yum install nfs-utils rpcbind -y (这里可能安装不成功,报错说lvm2版本过低,只需要升级lvm2即可:yum upgrade lvm2 -y)
分别到web01、web02、web03三台机器上新建图片共享目录:mkdir -p /mydata/userfiles
编辑web01上的exports文件:
# vim /etc/exports
/mydata/userfiles 192.168.1.12/32(rw,sync,no_root_squash) /mydata/userfiles 192.168.1.13/32(rw,sync,no_root_squash)
以上参数中 :
rw: 代表 "读写",因为每一台web服务器都有客户上传图片,所以必须要都可读写共享磁盘,你可以选择ro只读;
sync:表示文件同时写入磁盘和内存,当然你可以选择async,文件暂存于内存,而不是直接写入磁盘;
no_root_squash:NFS客户端连接服务端时如果使用的是root的话,那么对服务端分享的目录来说,也拥有root权限,显然开启这项是不安全的,你可以选择root_squash或all_squash。
上述文件修改完保存后,先启动rpcbind服务(最好也加入开机自启动中:systemctl enable rpcbind):systemctl start rpcbind
再启动nfs服务(最好加入开机自启动中:systemctl enable nfs-server):systemctl start nfs
---------------------------------- 客户端挂载共享磁盘 --------------------------------------
查看服务端提供的共享磁盘:showmount -e 192.168.1.11
什么?没有showmount命令?
那就在客户端也这样吧:yum install nfs-utils rpcbind -y (这里可能安装不成功,报错说lvm2版本过低,只需要升级lvm2即可:yum upgrade lvm2 -y)
挂载磁盘到本地(最好写道开机自动挂载文件 /etc/fstab 里面去):mount -t nfs -o nfsvers=3 192.168.1.11:/mydata/userfiles /mydata/userfiles/
查看挂载后的情况:df -h (或 mount 或 showmount -a)
至此,NFS基本上搭建完成了,你可以自己测试下文件是否被共享了?!
---------------------------------- ln建立软连接实现个人需求 ---------------------------------
项目的根目录为web,部署在tomcat下,图片目录为userfiles,那么假设整个项目的图片目录路径为:/usr/local/tomcat-8080/webapps/web/userfiles
下面只需要这样:
首先,把你的项目图片目录下所有文件(前提是有文件,或者有用)拷贝走,例如:
mv /usr/local/tomcat-8080/webapps/web/userfiles /tmp/ (这一步只需要在三台web服务器中的一台上操作即可,本例中自然在192.168.1.11上操作的)
其次,建立一个软连接,把共享目录链接到项目根目录下,而且就叫userfiles:
ln -s /mydata/userfiles/ /usr/local/tomcat-8080/webapps/web/userfiles (这一步要在三台web服务器上分别操作)
最后,将之前移走的图片文件都“拿”回来:
mv /tmp/userfiles/* /usr/local/tomcat-8080/webapps/web/userfiles/ (这里一定要注意,不能把/tmp/userfiles移过来,只能把/tmp/userfiles/下的所有图片文件移到软连接userfiles里面)
等下次部署web项目时,即使删除了整个web目录(间接删除了userfiles软连接),但/mydata/userfiles中保存着最新的所有图片,等web部署完成,删除掉web中自带的userfiles目录,再重新创建一个软连接,瞬间所有图片就全回来了!这样的工作完全可以写到shell脚本中,一劳永逸咯!
到此为止,基本完成了整个需求了。
-------------------------- 需要注意的细节说明 ---------------------------
(1)任一服务器上被做成软连接的目录下的任一文件被删除或修改的话,共享目录中该文件也将被删除或修改;只有当软连接本身被删除时,不会影响共享目录;
(2)Linux系统默认拒绝创建目录硬链接(本身已有的除外),是为了避免硬链接导致在find或其他遍历查找文件时,陷入死循环,所以当你简单的使用ln创建目录硬链接时,都会报错“不支持目录硬链接”。如果你非要创建目录硬链接,那我也不会啊!
(3)如果谁有更牛X的方法,请在下方评论区分享!!!