网络文件系统(Network File System,NFS)是一种分布式文件系统协议,最初由Sun Microsystems公司开发,并于1984[1]年发布。其功能旨在允许客户端主机可以像访问本地存储一样通过网络访问服务器端文件。 NFS和其他许多协议一样,是基于Open Network Computing Remote Procedure Call(ONC RPC) 协议之上的。NFS在RFCs中是一个开放、标准的协议,任何人或组织都可以依据标准实现它。
其实NFS是通过RPC(Remote Procedure Call)叫做远程过程调用的方式来实现文件共享的,我们都知道如果一个进程想要用到某文件,需要同过系统调用向内核申请,而RPC就是将这一系统调用转换为通过网络向远端的另一主机发送文件的调用请求,这样就可以实现文件系统共享了。当然这也会产生很多问题,Client和NFS Server之间的存储格式不兼容怎么办,用户怎样认证、用户权限如何限定等。
为了解决格式不兼容我们使用了半结构化数据,这种数据可以自己完整描述自己数据的意义,不需要对方去解析,如有:XML,JSON,RESTful方式基于http传输。对于用户认证我们早先使用NIS(Network Information System,2049/tcp,2049/udp),这种协议将用户认证调离到远端的服务器上,而不是在本地。但是这种认证方式并不是加密的,而且容易形成单点故障,所以现在不太常见了。我们现在用到的是NFS服务端的两个进程idmapd和mountd。
idmapd:将远程用户映射为本地的nfsnobody,而远程看到的还是自己的用户
mountd:在访问nfs之前进行用户验证,验证过之后给用户一个令牌,用户拿到令牌再进行数据访问,端口随机
我们这里对NFS已经有了一个比较简单的了解了,我们本文的题目是使用LAMP结合NFS构建简单的博客站点,那么我们在构建过程中在详细的给出NFS的搭建,我们先来看一下物理拓扑图:
这个拓扑是这么规划的:客户端通过DNS的轮训调度,能够让用户访问两台web服务器来实现负载均衡,而网页中的动态内容则通过PHP Server来处理,用户博客的账号信息存储在MariaDB Server上,而页面文件通过NFS Server共享的文件系统来存放。
OK,我们来一步步构建这个拓扑,大家看到图上一共有六个服务器,我这里使用的是虚拟机而且只有三台,所以我把这个拓扑给压缩一下:
DNS Server&&Web1:IPà192.168.23.132
PHP Server&&Web2:IPà192.168.23.130,192.168.80.129
NFS Server&&MariaDB Server:IPà192.168.80.130
网络我已经调试通了,每个IP都可以相互ping通。
1.DNS Server已经建好,并且能够轮训调度两个web站点:
22.配置Web1/Web2站点
编译安装httpd-2.4我在以前的博客中讲过了,就不再详细解释了,就看一下配置就好了。
我这里为了节省时间就没有再使用虚拟主机了。至于PHP服务器编译安装,然后一启动就好了,没有什么额外的配置,如果不太清楚可以去看我以前的博客
vim /etc/httpd24/httpd.conf
216 DocumentRoot "/web/blog"
217 ProxyRequests Off
218 ProxyPassMatch ^/(.*\.php)$ fcgi://192.168.23.130:9000/web/blog/$1
219 <Directory "/web/blog">
251 <IfModule dir_module>
252 DirectoryIndex index.php index.html
253 </IfModule>
381 AddType application/x-httpd-php .php
382 AddType application/x-httpd-php-source .phps
115 LoadModule proxy_module modules/mod_proxy.so
119 LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
3.配置NFS
yum install nfs-utils
[root@db ~]# vim /etc/exports
/web/blog 192.168.23.132(rw,async,no_root_squash) 192.168.23.130(rw,async,no_root_squash) 192.168.80.129(rw,async,no_root_squash)
#这里的no_root_squash可以不加,因为我在做实验时客户端的写权限一直有问题所以在做诸多尝试
#还有一点需要提醒,我们可以建一个与web server上启动httpd进程的用户名和ID号相同的一个用户,然后给它设定facl,或者上httpd进程的启动用户为nobody
setfacl -R -m u:http:rwx /web/blog
tar xf /root/wordpress-4.2.2-zh_CN.tar.gz -C /web/
mv wordpress blog
cp wp-config-sample.php wp-config.php
vim wp-config.php
17 /** WordPress数据库的名称 */
18 define('DB_NAME', 'blog');
19
20 /** MySQL数据库用户名 */
21 define('DB_USER', 'buser');
22
23 /** MySQL数据库密码 */
24 define('DB_PASSWORD', 'bpass');
25
26 /** MySQL主机 */
27 define('DB_HOST', '192.168.80.130');
4.配置MariaDB
cat ~/.mysql_history #查看mysql的历史命令
create database blog;
grant user buser@'192.168.%.%' identified by 'bpass';
create user buser@'192.168.%.%' identified by 'bpass';
grant all on blog.* to buser@'192.168.%.%';
flush privileges;
#这里因为我以前做过搭建blog的实验所以遗留了很多数据也产生了一堆的问题,所以我又删除了很多表,这里就体现出phpMyadmin的好用之处了
5.在Web1&Web2挂载NFS
mount -t nfs 192.168.80.130:/web/blog /web/blog/
vim /etc/fstab
192.168.80.130:/web/blog /web/blog nfs defaults,_netdev 0 0
#开机自动挂载
6.测试访问,并上传数据