目录
NFS 服务器
一,NFS 服务器简介
二,NFS的使用
三,客户端使用 autofs 自动挂载
1,autofs产生的原因
四,autofs的安装与配置文件
五,autofs的使用
www服务器---cgi程序
CGI程序的应用
NFS(Network File System,网络文件系统)是 FreeBSD 支持的文件系统中的一 种,它允许网络中的计算机(不同的计算机、不同的操作系统)之间通TCP/IP 网络共享资源,主要在 unix 系列操作系统上使用。在 NFS 的应用中,本地NFS 的 客户端应用可以透明地读写位于远端 NFS 服务器上的文件,就像访问本地文件一 样。
NFS 服务器可以让 PC 将网络中的 NFS 服务器共享的目录挂载到本地端的文件系统中,而在本地端的系统中看来,那个远程主机的目录就好像是自己的一个磁盘分区一样。
由于NFS 支持的功能比较多,而不同的功能都会使用不同的程序来启动,每启动一个功能就会启用一些端口来传输数据,因此 NFS 的功能所对应的端口并不固 定,而是随机取用一些未被使用的小于 1024 的端口用于传输。但如此一来就会产 生客户端连接服务器的问题,因为客户端需要知道服务器端的相关端口才能够连接。
此时就需要 RPC(Remote Procedure Call,远程过程调用)的服务。由于当服务器在启动 NFS 时会随机选取数个端口号,并主动向 RPC 注册,所以 RPC 知道每个NFS 功能所对应的端口号,RPC 将端口号通知给客户端,让客户端可以连接到正确的端口上去。RPC 采用固定端口号port 111 来监听客户端的需求并向客户端响应正确的端口号。
注:在启动 NFS 之前,要先启动 RPC,否则 NFS 会无法向 RPC 注册。另外,RPC 若重新启动,原来注册的数据会消失不见,因此 RPC 重启后,它管理的所有服务都需要重新启动以重新向 RPC 注册。
Exportfs命令:
exportfs: 即编辑了配置文件:/etc/exports ->不需要重启服务,只需要使用exportfs重新更新资源就可以
Showmount命令:
showmount: show mount information for an NFS server: 显示NFS服务器提供共享的目录
使用方式: showmount -e IP
配置文件:/etc/exports
配置的语法:共享目录的路径 主机(权限);共享哪个目录,允许哪些主机来访问(权限是什么)
1,安装软件:
[root@kelong ~]# yum install nfs-utils.x86_64 -y
[root@kelong ~]# yum install rpcbind.x86_64 -y
2,查看主配置文件是否存在
[root@kelong ~]# ls -l /etc/exports
3,在服务器端配置/etc/exports文件,将目录/nfsdata共享,且允许192.168.206.0/24网段的ip访问
[root@kelong ~]# vim /etc/exports
/nfsdata 192.168.206.0/24(rw)
4,创建nfsdata目录
[root@kelong ~]# mkdir /nfsdata
5,在/nfsdata目录下面创建文件test.txt
[root@kelong nfsdata]# vim test.txt
this file is created on nfs-server
6,启动服务
[root@kelong nfsdata]# systemctl restart rpcbind[root@kelong nfsdata]# systemctl restart nfs-server
7,在服务器上查看目录/nfsdata是否已经共享
[root@kelong nfsdata]# showmount -e 192.168.206.132
8,在客户端上安装nfs-utils.x86_64 -y
[root@wangjingjing ~]# yum install nfs-utils.x86_64 -y
此时在客户端上查看目录/nfsdata是否已经共享
9,在客户端创建挂载的目录/mountdata
[root@wangjingjing ~]# mkdir /mountdata
10,在客户端挂载之前的挂载信息
[root@wangjingjing ~]# mount
11,把服务器的/nfsdata目录挂载到客户端/mountdata目录上
[root@wangjingjing ~]# mount 192.168.206.132:/nfsdata /mountdata
12,再次查看客户端的挂载信息,发现服务器的/nfsdata目录已经成功挂载到/mountdata目录
[root@wangjingjing ~]# mount
13,此时在客户端就可以看见服务器共享的目录/nfsdata以及目录下的文件
[root@wangjingjing ~]# cd /mountdata[root@wangjingjing mountdata]# ls -l
14,权限需要写在括号内,且括号是紧接着主机名的。权限相关参数可以写多个,多
个参数之间用逗号隔开,具体相关参数说明如下:
在服务器上给目录/nfsdata权限777,客户端才可以编辑文件内容
[root@kelong nfsdata]# chmod 777 /nfsdata
(1)root_squash: 表示将root用户以及root用户组,映射成匿名用户(nobody)
默认配置为root_squash,在客户端以root用户和用户组创建文件test3.txt,
查看到的所属者所属组为nobody
[root@wangjingjing mountdata]# cp test2.txt test3.txt[root@wangjingjing mountdata]# ls -l
(2)no_root_squash: 表示就显示root用户和root用户组
在服务器修改目录的权限为no_root_squash
[root@kelong nfsdata]# vim /etc/exports
/nfsdata 192.168.206.0/24(rw,no_root_squash)
重新加载配置文件/etc/exports
[root@kelong nfsdata]# exportfs -r
在客户端以root用户和用户组创建文件test4.txt,可以看到,
此时的用户者和用户组为root
[root@wangjingjing mountdata]# cp test2.txt test4.txt[root@wangjingjing mountdata]# ls -l
(3)no_all_squash:就显示普通用户以及用户组(默认配置): 当系统上没有这个uid和gid对应的用户的时候,就直接显示uid和gid
在客户端用普通用户redhat创建文件test5.txt
[redhat@wangjingjing mountdata]$ cp test3.txt test5.txt[redhat@wangjingjing mountdata]$ ls -l
(4)all_squash:将我们的普通用户以及用户组映射成匿名用户(nobody)
在客户端用普通用户redhat创建文件test.txt
在服务器的主配置文件/etc/exports中增加all_squash权限
/nfsdata 192.168.206.0/24(rw,no_root_squash,all_squash)
重启服务
[root@kelong nfsdata]# exportfs -r
在客户端用普通用户redhat创建文件test6.txt,此时的所属者与所属组为nobody
[redhat@wangjingjing mountdata]$ cp test3.txt test6.txt[redhat@wangjingjing mountdata]$ ls -l
(5)anonuid=anongid= 将文件的用户和组映射为指定的 UID 和 GID,若不
指定默认为 65534(nfsnobody)
指定匿名用户uid gid为2778 匿名用户为nfsuser3
[root@kelong ~]# useradd nfsuser3 -u 2778
[root@wangjingjing mountdata]# useradd nfsuser3 -u 2778
分别在用户端和客户端增加用户nfsuser3并制定uid gid,修改配置文件/etc/
/nfsdata 192.168.206.0/24(rw,no_root_squash,all_squash,anonuid=2778,anongid=2778)
重新加载配置文件
[root@kelong ~]# exportfs -r
此时创建文件test8.txt发现所属者与所属组为刚创建的nfsuser3
[redhat@wangjingjing mountdata]$ ls -l
在一般 NFS 文件系统的使用过程中,如果客户端要使用服务端所提供的文件系统,可以在/etc/rc.d/rc.local 中设置开机时自动挂载(/etc/rc.d/rc.local 文件中写入的命令,在每次启动系统用户登录之前都会执行一次);也可以在登录系 统后手动利用 mount 来挂载。由于网络的问题,NFS 服务器与客户端的连接不会一直存在,当我们挂载了 NFS 服务器之后,任何一方脱机都可能造成另外一方等待超时。为了解决这样的问题,就出现了下面的想法:
1、当客户端在有使用 NFS 文件系统的需求时才让系统自动挂载。
2、当 NFS 文件系统使用完毕后,让 NFS 自动卸载。
于是就产生了 autofs 这个服务。
autofs 这个服务是在客户端的上面,它会持续的检测某个指定的目录,并预先设
置当使用到该目录的某个子目录时,将会取得来自服务器端的 NFS 文件系统资
源,并进行自动挂载的操作。
1,在客户端安装autofs软件
[root@wangjingjing ~]# yum install autofs -y
2,查看有关auto的所有文件
[root@wangjingjing ~]# ls -l /etc | grep auto*
-rw-r--r--. 1 root root 15718 Feb 8 23:41 autofs.conf
-rw-r--r--. 1 root root 1040 Feb 8 23:41 auto.master
-rw-r--r--. 1 root root 519 Feb 8 23:41 auto.misc
autofs.conf-> 针对服务autofs的配置
auto.master -> 是针对目录对应的挂载配置文件
auto.xxx -> 对应的是:具体挂载信息
3,打开/etc/autofs.conf配置文件,主要针对nfs服务的配置
[root@wangjingjing mountdata]# vim /etc/autofs.conf
如果不使用挂载目录,300秒后自动断开挂载连接
dismount_interval = 300
4,打开/etc/auto.master配置文件,主要配置nfs挂载的配置
[root@wangjingjing mountdata]# vim /etc/auto.master[root@wangjingjing mountdata]# vim /etc/auto.master
样例配置:/misc这个目录自动挂载的信息autofs在 /etc/auto.misc中
配置语法: 目录 自动挂载配置文件的目录
/misc /etc/auto.misc
5,打开/etc/auto.mic配置文件,主要是挂载的信息
[root@wangjingjing mountdata]# vim /etc/auto.misc
cd -fstype=iso9660,ro,nosuid,nodev :/dev/cdrom
挂载的目录 挂载的选项 :要挂载的设备
1,在客户端的auto.master中顶部加入一行:
注意:/nfsclient这个目录本身不存在,autofs会帮我们创建
/nfsclient /etc/auto.nfs
2,打开文件/etc/auto.nfs
[root@wangjingjing mountdata]# vim /etc/auto.nfs
编辑内容:将192.168.206.132:/nfsdata目录挂载到nfsdir目录下
nfsdir 192.168.206.132:/nfsdata
3,把客户端之前挂载的目录解挂载
[root@wangjingjing ~]# umount /mountdata
4,启动autofs服务
[root@wangjingjing ~]# systemctl restart autofs
5,此时,/nfsclient目录已经存在
[root@wangjingjing ~]# ls -ld /nfsclient
6,但是此目录为空
[root@wangjingjing ~]# ls -l /nfsclient
7,触发自动挂载
进入到nfsdir目录中会发现自动挂载,/nfslient为父目录,nfsdir为子目录
[root@wangjingjing nfsclient]# cd nfsdir
[root@wangjingjing nfsdir]# mount
8,退出nfsdir目录,五分钟后在查看挂载,挂载自动断开
CGI程序的输入:
环境变量
环境变量中存储的叫做`Request Meta-Variables`,也就是诸如`QUERY_STRING`、`PATH_INFO`之类的,这些都是由Web服务器通过环境变量传递给CGI程序的,CGI程序也是从环境变量中读取的。
标准输出
存放的往往是用户通过`PUTS`或`POST`提交的数据,这些数据也是由Web服务器传递过来的。
CGI程序的输出:
CGI执行完成之后:标准输出
CGI程序通过标准输出(stdout)将输出信息传送给Web服务器。
http response报文的格式:
状态行
响应头
空行
响应体
响应给浏览器一个hello world: 如何去构建这个hello world
方法一:
1,先查看一下原有的配置中是否支持CGI程序
vim /etc/httpd/conf/httpd.conf
从主配置文件可以看出,访问/cgi-bin 等于访问/var/www/cgi-bin
它会把/var/www/cgi-bin目录中的文件当做程序执行
2,切换到/var/www/cgi-bin/目录下,创建可执行脚本文件test.sh
[root@kelong ~]# cd /var/www/cgi-bin/[root@kelong cgi-bin]# touch test.sh
3,打开脚本文件test.sh
[root@kelong cgi-bin]# vim test.sh
编辑test.sh脚本文件内容
#!/bin/bash
#状态行 /响应行:不需要管,web服务器会帮我们自动生成
# Content-Type: text/html;charset=utf-8
#空行: printf "\n"
#响应体:hello world
printf "Content-Type: text/html;charset=utf-8\n"
printf "\n"
printf "hello world\n"
4,给脚本test.sh增加执行权限
[root@kelong cgi-bin]# chmod +x test.sh
5,看脚本是否能执行
[root@kelong cgi-bin]# bash test.sh
6,此时访问192.168.206.132/cgi-bin/test.sh将会返回响应体的内容
方法二:
手动为目录增加执行的权限:options +ExecCGI , 然后设置目录下哪些文件为可执行的程序(设置后缀名)
1,给目录/www/ip/138增加可执行的权限,并设置以.cgi结尾的文件为可执行文件
AllowOverride None
AddHandler cgi-script .cgi
Options +ExecCGI
Require all granted
2,重启配置文件:
[root@kelong cgi-bin]# systemctl restart httpd
3,在/www/ip/138目录下创建以.cgi结尾的可执行文件
[root@kelong 138]# vim test.cgi
#!/bin/bash
#状态行 /响应行:不需要管,web服务器会帮我们自动生成
# Content-Type: text/html;charset=utf-8
#空行: printf "\n"
#响应体:hello world
printf "Content-Type: text/html;charset=utf-8\n"
printf "\n"
printf "welcome to page 138\n"
4,去给这个文件增加可执行的权限
[root@kelong 138]# chmod +x test.cgi
5,此时来访问test.cgi