# Linux服务Day02 :NFS共享服务+WEB(HTTPD)服务基础

声明:本文仅作学习交流使用,引用需标明出处。

如有谬误,敬请指正

本次学习围绕Linux系统下NFS网络文件共享服务Apache httpd WEB服务展开,涵盖基础原理、服务端搭建、客户端访问、权限配置及虚拟主机实操,全程以实操命令为核心,配套服务端/客户端对应操作,是云计算基础入门的核心内容。

一、NFS共享服务

1.1 NFS共享服务概述

  • Network File System 网络文件系统
  • 作用:让客户端像使用本地目录一样,挂载并访问服务器上的共享目录,为客户机提供共享使用的实时更新的文件夹(确切说是文件系统
  • 协议:NFS(TCP/UDP 端口号:2049)、RPC(TCP/UDP 端口号:111)
  • 所需软件包:nfs-utilsrpcbind
  • 服务名: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 43 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 43 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 文件归属特性总结:
  1. NFS 服务端在识别客户端用户时,只认 UID,不认用户名
  2. 客户端 root(UID=0)写入文件时,服务端默认文件归属就是 UID 0(root)。
  3. 客户端普通用户(如 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 服务器软件是:

  1. Nginx
    高性能、轻量,多用于高并发场景、反向代理、负载均衡,现在市场占有率最高。

  2. Apache HTTP Server
    HTTPD,老牌经典,稳定、模块丰富,兼容性极强,传统网站和虚拟主机用得非常多。

  3. 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主机对默认站点的影响

配置虚拟主机后,需注意以下核心规则:

  1. 一旦使用了虚拟web主机,/etc/httpd/conf/httpd.conf中默认的站点(即默认网页根目录/var/www/html下的网页)将失效;如果想继续使用默认站点中的网页,需要为默认站点编写一个虚拟web主机配置。
  2. 配置了基于域名的虚拟web主机后,若继续使用IP地址访问,默认由加载的第一个虚拟web主机提供服务
  3. 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.htmla.html),读取文件内容后,封装成HTTP响应报文。

⑥ 响应报文回传(服务端→客户端)
服务端将封装好的响应报文,通过之前建立的TCP连接,发送回客户端。

⑦ 客户端接收并展示页面(客户端侧)
客户端浏览器接收到响应报文后,解析HTML、CSS、JS等资源,最终将网页内容渲染展示给用户,完成一次完整的访问流程。


全流程总结

域名解析 → 发起请求 → 服务端接收分发 → 读配置找文件 → 回传响应 → 客户端渲染展示

三、本次学习总结

  1. 掌握NFS服务的核心作用,能独立完成NFS服务端共享配置、客户端临时/永久挂载方式,熟练配置NFS客户端写入权限的两种方法;
  2. 理解B/S架构核心原理,能快速完成httpd服务的部署与客户端访问,掌握修改默认首页、创建/上传自定义页面的实操;
  3. 掌握httpd虚拟web主机的核心配置格式、完整实操步骤,理解虚拟主机的加载顺序和访问规则;
  4. 理解并掌握客户端访问web服务器的完整请求-响应流程;
  5. 熟练使用Linux常用命令完成服务搭建、配置修改、结果验证,掌握服务端/客户端的联动操作思路。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值