在之前的博客里面,我搭建了两个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负载均衡图片上传问题
原文地址:http://blog.51cto.com/superpcm/2096552