声明:本文仅作学习交流使用,引用需标明出处。
如有谬误,敬请指正
本次学习围绕Linux系统下NFS网络文件共享服务和Apache httpd WEB服务展开,涵盖基础原理、服务端搭建、客户端访问、权限配置及虚拟主机实操,全程以实操命令为核心,配套服务端/客户端对应操作,是云计算基础入门的核心内容。
一、NFS共享服务
1.1 NFS共享服务概述
- Network File System 网络文件系统
- 作用:让客户端像使用本地目录一样,挂载并访问服务器上的共享目录,为客户机提供共享使用的实时更新的文件夹(确切说是文件系统)
- 协议:NFS(TCP/UDP 端口号:2049)、RPC(TCP/UDP 端口号:111)
- 所需软件包:nfs-utils;rpcbind
- 服务名:nfs-server
- 依赖服务:rpcbind (相当于NFS 服务的前置服务,是NFS的 “服务地址中介”,没有它 NFS 将无法使用)
- 共享配置文件:/etc/exports
- NFS特点:
- 占用的是服务端的存储空间,不是客户端本地磁盘
- 数据实时同步、实时更新
- 不能跨平台
- 对比FTP:
- NFS 是直接读写远程文件,不用复制,效率更高
- 多客户端同时访问时,NFS 一致性、易用性更好
- NFS更加依赖网络,网络差时体验下降
1.2 服务端exports配置文件解析
- 服务端/etc/exports文件专门用于记录NFS服务共享记录
- 编写格式:
文件夹路径 客户机地址/网段(权限)
常用权限说明:
- rw:可读写
- ro:只读
- sync:同步写入(数据安全)
- async:异步写入(速度快)
- no_root_squash:客户端 root 拥有服务端 root 权限
- root_squash:客户端 root 会被降权(默认)
1.3 客户端访问NFS共享目录
NFS共享的是一个文件系统,因此想要访问它必须进行挂载。
- 查看有哪些NFS共享资源:
showmount -e 服务器地址 - 临时挂载NFS共享目录:
mount 服务器地址:文件夹路径 挂载点 - 永久挂载NFS共享目录:编写/etc/fstab配置文件
- 注:NFS共享目录的文件系统类型为nfs
- 注:永久挂载参数需要增加
_netdev(表示此设备为网络设备,防止开机进入救援模式)
1.4 实验环境
- 使用template模板机 链接克隆两台虚拟机,配置对应IP地址
- 使用WindTerm远程连接两台主机
1.5 服务端搭建NFS服务
启用NFS服务需要先启用rpcbind服务给nfs-server提供端口,nfs-server服务才能正常运行。
server主机完成安装软件、创建目录、配置规则、启动服务全流程,实操命令如下:
[root@server ~]# dnf -y install nfs-utils rpcbind # 1.安装软件包
[root@server ~]# mkdir /public # 创建共享目录
[root@server ~]# echo nfstest > /public/nfs.txt # 创建共享目录中的测试数据
[root@server ~]# vim /etc/exports # 2.修改配置文件,配置只读规则
/public 192.168.8.0/24(ro) # 共享/public目录,允许192.168.8.0/24网段主机以只读权限访问
[root@server ~]# systemctl restart rpcbind # 3.启动依赖服务
[root@server ~]# systemctl enable rpcbind # 将依赖服务设置为开机自启
[root@server ~]# systemctl restart nfs-server # 启动NFS服务
[root@server ~]# systemctl enable nfs-server # 将NFS服务设置为开机自启
[root@server ~]# ss -nutlp | grep :111 # 查看rpcbind端口号是否监听
[root@server ~]# ss -nutlp | grep :2049 # 查看NFS端口号是否监听
1.6 客户端访问NFS服务
client主机安装支持包,完成 永久挂载 NFS共享目录至本地/nfsdir目录,实操命令如下:
[root@client ~]# dnf -y install nfs-utils # 客户端安装nfs-utils,支持nfs文件系统即可
[root@client ~]# showmount -e 192.168.8.101 # 查看server主机的共享列表
[root@client ~]# mkdir /nfsdir # 创建本地挂载点
[root@client ~]# vim /etc/fstab # 编写配置文件,配置永久挂载
# 在配置文件最后一行下方追加写入
192.168.8.101:/public /nfsdir nfs defaults,_netdev 0 0
[root@client ~]# mount -a # 刷新挂载文件,使配置生效
[root@client ~]# df -Th # 查看挂载信息,验证挂载结果
[root@client ~]# ls /nfsdir # 查看挂载点,数据来自server主机的/pubic(NFS共享目录)
[root@client ~]# touch /nfsdir/client.txt # 客户端尝试写入数据,失败(服务端配置为ro只读权限)
1.7 NFS权限设置
为什么配置中给了rw权限,实际客户端操作并不能在挂载点文件夹进行文件创建等写入操作?
因为该行为本质上是以客户机root用户身份对服务端的共享目录进行操作,而核心规则会使客户机root在服务端自动降权为nobody用户。
核心规则:客户端向NFS设备对应的挂载点写入数据时若以客户端root身份,则会降权为服务端的nobody的身份进行写入;服务端nobody用户对于NFS共享目录(/public)是其他人的身份,默认无权写入。
若想向共享目录写入数据,有两种配置方法,同时涉及两个核心权限参数:
root_squash(默认):root身份压缩,客户端以root的身份执行创建,在服务端会降权为nobody用户no_root_squash:禁止root身份压缩,客户端以本机root(UID为0)的身份创建,服务端会切换为UID相同的用户(root)执行
1.7.1 方法一:为共享目录的其他人身份增加w权限
服务端修改权限规则+开放目录写入权限,客户端即可实现写入操作。实操命令:
# 服务端操作
[root@server ~]# vim /etc/exports # 修改配置文件,改为rw读写权限
/public 192.168.8.0/24(rw) # 将客户端权限设置为rw
[root@server ~]# systemctl restart nfs-server # 重启服务,使配置生效
[root@server ~]# chmod o+w /public # 服务端为NFS共享目录其他人增加w权限
# 客户端操作
[root@client ~]# touch /nfsdir/today.txt # 客户端创建测试文件,可以成功写入
# 服务端验证
[root@server ~]# ls -l /public/today.txt # 服务端查看新文件属性,归属为nobody
-rw-r--r-- 1 nobody nobody 0 4月 3 15:38 /public/today.txt
1.7.2 方法二:配置rw,no_root_squash参数(更安全)
服务端修改配置文件添加专属参数,无需开放目录其他人权限,即可实现客户端写入,实操命令:
# 服务端操作
[root@server ~]# vim /etc/exports # 修改配置文件,配置多权限组合
/public 192.168.8.0/24(rw,no_root_squash,sync) # rw=读写;no_root_squash=禁止root降权;sync=实时写磁盘
[root@server ~]# systemctl restart nfs-server # 重启服务,使配置生效
[root@server ~]# chmod o-w /public # 取消服务端共享目录的其他人w权限,提升安全性
# 客户端操作
[root@client ~]# touch /nfsdir/happy.txt # 客户端创建测试文件,可以成功写入
# 服务端验证
[root@server ~]# ls -l /public/happy.txt # 服务端查看新文件属性,归属为root
-rw-r--r-- 1 root root 0 4月 3 15:38 /public/happy.txt
注:如果客户端是普通用户执行创建,那么服务端会切换为与客户端用户相同UID的用户执行,且需要关注此用户对NFS共享目录是否拥有w权限。
NFS创建文件的归属特性:
客户端以root用户(uid=0)执行写入操作时,服务端创建的文件默认归属是uid=0的用户,即root。倘若客户端有用户tom(uid=1000),服务端有用户jim(uid=1000),客户端用户tom在服务端创建文件1.txt,则该文件归属于服务端uid=1000的用户,即jim。假设服务端没有uid=1000的用户,则文件1.txt的归属默认为uid=1000,直到服务端出现uid为1000的用户,该文件归属将为该用户。
NFS 文件归属特性总结:
- NFS 服务端在识别客户端用户时,只认 UID,不认用户名。
- 客户端 root(UID=0)写入文件时,服务端默认文件归属就是 UID 0(root)。
- 客户端普通用户(如 tom,UID=1001)创建文件:
- 服务端若有 UID=1001 的用户(如 jim),文件归属该用户 jim。
- 服务端若无 UID=1001 的用户,文件归属直接显示为数字 UID 1001,直到服务端新增 UID=1001 的用户,归属才会映射到该用户。

核心结论:NFS 是按 UID 进行权限映射的。
二、WEB服务基础
2.1 B/S架构概述
- B/S(Browser/Server),即浏览器与服务端架构
- 浏览器负责:连接DNS、建立请求,接受数据
- 服务端负责:提供资源或某种功能
- 核心基础:Hyper Text Markup Language(超文本标记语言,HTML)、Hyper Text Transfer Protocol(超文本传输协议,http://)
目前最主流的三大 Web 服务器软件是:
-
Nginx
高性能、轻量,多用于高并发场景、反向代理、负载均衡,现在市场占有率最高。 -
Apache HTTP Server
即HTTPD,老牌经典,稳定、模块丰富,兼容性极强,传统网站和虚拟主机用得非常多。 -
Tomcat
主要运行 Java Web 应用(JSP/Servlet),是 Java 开发最常用的 Web 应用服务器。
简单总结:
- 静态网站/高并发 → Nginx
- 通用稳定/虚拟主机 → Apache
- Java 项目 → Tomcat
本次实验以基础的httpd服务为例
2.2 httpd服务概述
httpd 是 Apache 基金会推出的开源、跨平台 Web 服务器软件,用于接收 HTTP/HTTPS 请求并向客户端返回网页、文件等资源,是经典稳定的网站服务程序。
- 所需软件:httpd
- 服务名:httpd
- 默认端口号:80(HTTP);443(HTTPS)
- 协议:http:// 超文本传输协议、https:// 加密超文本传输协议
- 配置文件:/etc/httpd/conf/httpd.conf(主配置)、/etc/httpd/conf.d/*.conf(自定义配置)
- 默认网页根目录(默认网页文件存放位置):/var/www/html
- httpd提供的默认配置:
- Listen:监听地址:端口号(默认本机所有地址监听80端口)
- ServerName:本站点注册的DNS名称,即域名(默认空缺)
- DocumentRoot:网页根目录(默认/var/www/html)
- DirectoryIndex:默认首页/首页文件名(index.html)
2.3 快速部署web站点
实验环境
- 使用template模板机 链接克隆虚拟机,配置IP地址
- 使用WindTerm远程连接两台主机
- 角色分配:
- 服务端:server,192.168.8.101/24
- 客户端:client,192.168.8.100/24;Windows真机,192.168.8.1/24
服务端部署实操
server主机安装httpd软件,启动服务并验证端口,命令如下:
[root@server ~]# dnf -y install httpd # 安装httpd服务
[root@server ~]# systemctl start httpd # 启动httpd服务
[root@server ~]# systemctl enabled httpd # 将httpd服务设置为开机自启
[root@server ~]# ss -ntulp | grep :80 # 查看默认端口,验证服务是否运行
2.4 访问web站点
2.4.1 URL概述
在浏览器中输入访问URL(网页地址)实现访问,核心规则:
- URL:Uniform Resource Locator,统一资源定位器
- 格式:
协议://服务器地址[:端口号]/目录/文件名 - 省略规则:默认协议为http://,默认端口为80,均可省略
2.4.2 客户端访问web站点
方式1:Windows客户端访问
推荐使用Google浏览器(谷歌浏览器),输入http://192.168.8.101:80(或省略端口为http://192.168.8.101),即可访问服务端默认测试页面。
方式2:Linux客户端(client)访问
使用命令行浏览器curl实现访问,格式:curl 协议://服务器地址:端口号,实操命令:
[root@server ~]# curl http://192.168.8.101:80 # 完整格式访问server主机的网站
[root@server ~]# curl 192.168.8.101 # 省略默认协议和端口,简化访问
2.5 修改默认首页
server主机直接编辑默认首页文件,修改后客户端可实时访问更新后的内容,实操命令:
[root@server ~]# echo MyWebSite > /var/www/html/index.html # 修改默认首页内容
[root@server ~]# curl 192.168.8.101 # 本地测试,验证网页已更新
修改后,Windows客户端浏览器、Linux客户端curl命令访问均可看到新内容。
2.6 自定义页面
2.6.1 简单自定义页面实操
server主机在默认网页根目录创建自定义页面,客户端通过IP+自定义文件名访问,实操命令:
[root@server ~]# echo abcabc > /var/www/html/a.html # 创建自定义页面a.html
[root@server ~]# curl 192.168.8.101/a.html # 本地测试,验证自定义页面
访问规则:
- Windows主机浏览器:
192.168.8.101/a.html - Linux客户端:
curl 192.168.8.101/a.html
2.6.2 上传静态页面实操
将《云计算学习环境》里的snake_game.html使用WindTerm远程工具上传至server主机的/var/www/html目录,Windows主机使用浏览器访问http://192.168.8.101/snake_game.html,即可打开静态小游戏页面。
2.6.3 网络路径与实际路径
核心映射规则:浏览器访问的网络路径,对应服务端的实际文件路径,根路径为httpd默认网页根目录,示例:
- 网络路径:http://192.168.8.101/index.html → 实际路径:/var/www/html/index.html
- 网络路径:http://192.168.8.101/a.html → 实际路径:/var/www/html/a.html
- 网络路径:http://192.168.8.101/snake_game.html → 实际路径:/var/www/html/snake_game.html
2.6.4 httpd配置文件解析
httpd服务的核心配置项均在主配置文件中定义,关键内容:
Listen 80 # 默认监听80端口
DocumentRoot “/var/www/html” # 指定默认网页根目录
IncludeOptional conf.d/*.conf # 指定调用自定义配置文件位置:/etc/httpd/conf.d/*.conf
2.7 虚拟web主机概述
核心概念
- 虚拟web主机:由统一服务器提供多个不同的web站点
- 分类:基于域名的虚拟web主机、基于端口的虚拟web主机、基于IP地址的虚拟web主机
- 核心配置文件:主配置
/etc/httpd/conf/httpd.conf、自定义配置/etc/httpd/conf.d/*.conf(推荐使用) - 核心配置标签:
<VirtualHost>,基础编写格式:
<VirtualHost IP地址:端口>
ServerName 域名
DocumentRoot 网页根目录
DirectoryIndex 网页默认首页
</VirtualHost>
注意!末尾中 / 易漏加
2.7.1 配置虚拟web主机
以基于域名的虚拟web主机为例,server主机配置要求:
- 域名:www.test.com
- 端口:本机所有地址监听80端口
- 网页根目录:/var/www/virtual1
- 默认首页文件:index.html
- 默认首页内容:This is my first VritualHost
实操命令如下:
[root@server ~]# vim /etc/httpd/conf.d/mysite.conf # 编写自定义调用配置文件
<VirtualHost *:80> # 虚拟web主机本机所有地址监听80端口
ServerName www.test.com # 指定网站的域名
DocumentRoot /var/www/virual1 # 指定网站的网页根目录
</VirtualHost>
[root@server ~]# mkdir /var/www/virtual1 # 创建自定义网页根目录
[root@server ~]# echo "This is my first VirtualHost" > /var/www/virtual1/index.html # 创建默认首页
[root@server ~]# systemctl restart httpd # 重启httpd服务,使配置生效
[root@server ~]# ss -nutlp | grep :80 # 查看端口是否正常启动
2.7.2 客户端访问虚拟web主机
由于未配置DNS服务器,客户端通过修改/etc/hosts文件实现域名解析,实操命令:
[root@client ~]# vim /etc/hosts
# 在此文件最后一行下方追加写入域名与IP的对应关系
192.168.8.101 www.test.com
[root@client ~]# curl www.test.com # 客户端通过域名访问,可看到虚拟主机首页内容
2.7.3 虚拟web主机对默认站点的影响
配置虚拟主机后,需注意以下核心规则:
- 一旦使用了虚拟web主机,/etc/httpd/conf/httpd.conf中默认的站点(即默认网页根目录/var/www/html下的网页)将失效;如果想继续使用默认站点中的网页,需要为默认站点编写一个虚拟web主机配置。
- 配置了基于域名的虚拟web主机后,若继续使用IP地址访问,默认由加载的第一个虚拟web主机提供服务。
- httpd虚拟web主机加载顺序:
- 同一个调用配置文件中写了多个虚拟web主机配置:从上到下依次加载
- 不同调用配置文件中写了多个虚拟web主机配置:按文件名加载(例如:aaa.conf 先于 bbb.conf)
当在配置文件配置完一个域名之后,对应域名的网页根目录为空,则会转向默认站点。
当在配置文件配置完一个域名之后,对应域名的网页根目录中的文件是index.html的时候,才不会转向默认站点。若不是index.html(假设是haha.html),且没有进行配置指向,则访问域名依旧会转向默认站点。除非用DirectoryIndex进行指向:DirectoryIndex haha.html
2.8 客户端访问网站流程
┌───────────────────────────────────────────────────────────────────────────────┐
│ 客户端访问网站流程 │
└───────────────────────────────────────────────────────────────────────────────┘
┌─────────────────────┐ ┌──────────────────────────────────────────────────────────┐
│ /etc/hosts │ ① │ ┌───────────────┐ ┌───────────────────────┐ │
│ /etc/resolv.conf │<───────┼─▶│客户端建立请求 │ ② │ │服务端接受请求 │ │
│ 解析域名 │ │ └───────────────┘<───────┼─▶└───────────────────────┘ │
└─────────────────────┘ │ ⑦ │ ③ │ │
│ │ ▼ │ │
│ │ ┌───────────────────────┐ │
│ │ │请求分发至服务 │ │
│ │ └───────────────────────┘ │
│ │ ④ │
│ │ ▼ │
│ │ ┌───────────────────────┐ │
│ │ │读取配置文件 │ │
│ │ └───────────────────────┘ │
│ │ ⑤ │
│ │ ▼ │
│ │ ┌───────────────────────┐ │
│ │ │查找网页文件 │ │
│ │ │回应客户端 │ │
│ │ └───────────────────────┘ │
│ │ ⑥ │
│ └──────────────────────────────┘
└──────────────────────────────────────────────────────────────────┘
① 域名解析(客户端侧)
用户在浏览器输入域名(如www.test.com)后,客户端首先会:
- 优先读取本地
/etc/hosts文件,匹配域名对应的IP地址 -
- 若hosts文件中有本地配置记录,将直接获取相关ip
-
- 若本地无记录,再通过
/etc/resolv.conf配置的DNS服务器进行远程解析
- 若本地无记录,再通过
- 最终拿到目标网站服务器的IP地址,为后续请求做准备
② 建立连接与发起请求(客户端→服务端)
客户端拿到IP后,基于TCP协议与服务端的80端口(HTTP默认端口)建立连接,同时向服务端发送HTTP请求报文,告知服务端“我要访问这个网站的资源”。
③ 服务端接收并分发请求(服务端内部)
服务端的httpd服务监听到80端口的请求后,会接收该请求,并根据请求的域名、端口等信息,将请求分发到对应的Web服务(比如匹配到对应的虚拟主机)。
④ 读取配置文件(服务端内部)
服务端根据分发结果,读取对应的httpd配置文件(主配置httpd.conf或自定义conf.d/*.conf),获取该站点的网页根目录、权限等关键配置信息。
⑤ 查找网页文件并生成响应(服务端内部)
服务端根据配置的DocumentRoot,在服务器磁盘中查找用户请求的网页文件(如index.html、a.html),读取文件内容后,封装成HTTP响应报文。
⑥ 响应报文回传(服务端→客户端)
服务端将封装好的响应报文,通过之前建立的TCP连接,发送回客户端。
⑦ 客户端接收并展示页面(客户端侧)
客户端浏览器接收到响应报文后,解析HTML、CSS、JS等资源,最终将网页内容渲染展示给用户,完成一次完整的访问流程。
全流程总结
域名解析 → 发起请求 → 服务端接收分发 → 读配置找文件 → 回传响应 → 客户端渲染展示
三、本次学习总结
- 掌握NFS服务的核心作用,能独立完成NFS服务端共享配置、客户端临时/永久挂载方式,熟练配置NFS客户端写入权限的两种方法;
- 理解B/S架构核心原理,能快速完成httpd服务的部署与客户端访问,掌握修改默认首页、创建/上传自定义页面的实操;
- 掌握httpd虚拟web主机的核心配置格式、完整实操步骤,理解虚拟主机的加载顺序和访问规则;
- 理解并掌握客户端访问web服务器的完整请求-响应流程;
- 熟练使用Linux常用命令完成服务搭建、配置修改、结果验证,掌握服务端/客户端的联动操作思路。
1002

被折叠的 条评论
为什么被折叠?



