08-27-周三_17-09-29

This commit is contained in:
2025-08-27 17:10:05 +08:00
commit 86df397d8f
12735 changed files with 1145479 additions and 0 deletions

1579
Linux服务/Apache.md Normal file

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 99 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 108 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 237 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 294 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 113 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 118 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 469 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 135 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 371 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 122 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 160 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 125 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 129 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 605 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 283 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 175 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 125 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 371 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 134 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

View File

@@ -0,0 +1,405 @@
# FTP (File Transfer Protocol)
FTPFile Transfer Protocol是用于在计算机网络中进行文件传输的协议。它使用客户端-服务器模式允许文件在客户端和服务器之间上传或下载。FTP 服务通常用于在不同主机间传输大容量文件,特别是在网络环境中需要频繁进行文件交换时。
FTP 运行在 OSI 模型的应用层,并利用传输协议 TCP 在不同的主机之间提供可靠的数据传输。并且在文件传输中 FTP 还支持断点续传功能,可以大幅度减少 CPU 网络带宽的开销。
## 工作原理
FTP 使用客户端与服务器之间的通信来传输文件。它通过两条连接来工作:一条用于命令传输(控制连接),另一条用于数据传输(数据连接)。
## 相关端口
**控制连接端口**21
- **功能**FTP 的控制连接使用端口 21。这条连接用于客户端与服务器之间交换命令和响应。当你在 FTP 客户端中输入命令(例如 `LIST``RETR``STOR`)时,这些命令是通过端口 21 发送的。
- **数据流向**:控制连接是全双工的,客户端和服务器都可以发送消息,但所有数据传输操作(如文件上传、下载)都不会通过控制连接进行。
**数据连接端口**20
- **功能**:端口 20 在 FTP 协议中用于数据传输连接,特别是在 **主动模式**PORT 模式)下。它用于通过数据连接传输实际的文件数据。
- **数据流向**:当 FTP 客户端在主动模式下与服务器建立连接时,服务器通过端口 20 向客户端的指定端口发起数据连接。这条连接用于传输文件内容。
# FTP 工作模式
FTP 支持两种不同的模式主动模式PORT和被动模式PASV
## 主动模式Active Mode
在主动模式下,客户端向服务器发起连接请求,服务器在数据传输时主动连接客户端。具体来说,客户端使用端口 21 与服务器建立控制连接,而数据连接则由服务器从端口 20 发起到客户端的指定端口。
### 连接过程
1. **建立控制连接**:客户端通过任意端口(例如随机的高端口,通常是 1024 以上的端口)向服务器的 **端口 21** 发起连接,建立 **控制连接**。这个连接用于发送 FTP 命令和接收响应。例如:客户端使用端口 1025连接到服务器的端口 21控制连接
2. **客户端发送命令**:客户端通过控制连接发送 FTP 命令(如 `USER``PASS``LIST` 等),请求服务器执行操作。
3. **客户端告诉服务器监听的端口**:当客户端希望传输文件时,它会告诉服务器自己希望通过哪个端口进行数据传输。这是通过 **PORT 命令** 完成的。客户端指定了一个端口(例如 1026供服务器使用。
4. **服务器发起数据连接**:服务器收到客户端的 **PORT 命令** 后,会使用 **端口 20** 连接到客户端指定的端口(例如 1026。这条连接用于传输数据如文件内容或目录列表。
5. **数据传输**:当服务器与客户端的指定端口建立数据连接后,数据传输就开始了。文件会通过这个数据连接进行传输。
6. **断开数据连接**:数据传输完成后,数据连接会关闭,控制连接保持打开,直到用户结束会话(通过 `QUIT` 命令)。
### 优缺点
**优点**:服务器主动发起数据连接,因此客户端无需配置其防火墙以允许入站连接。
**缺点**:如果客户端位于 NAT 或防火墙后面,客户端很难接受来自服务器的入站连接。由于 NAT 会改变客户端的 IP 地址和端口,服务器可能无法正确连接到客户端。
## 被动模式Passive Mode
在被动模式下,服务器不会主动连接客户端,而是客户端主动与服务器建立数据连接。服务器会提供一个端口范围,客户端可以通过控制连接(端口 21请求服务器提供一个可用端口客户端再通过这个端口与服务器建立数据连接。
### 连接过程
1. **建立控制连接**:客户端首先向服务器的 **端口 21** 发起连接,建立控制连接。这个过程和主动模式相同。
2. **客户端请求服务器进入被动模式**:客户端发送 **PASV 命令**,请求服务器进入被动模式。此时,服务器会选择一个高端口(通常在 1024 以上),并向客户端返回该端口的信息。例如,服务器可能返回 `227 Entering Passive Mode (192,168,1,2 120,232)`,这意味着服务器的 IP 地址是 `192.168.1.2`,并且它希望客户端连接到端口 `29832`
3. **客户端连接到服务器的被动端口**:客户端接收到服务器返回的 IP 地址和端口信息后,会从任意端口连接到服务器提供的被动端口(例如 29832。这条连接用于文件数据的传输。
4. **数据传输**:一旦数据连接建立,客户端和服务器就可以通过该连接传输文件数据或目录列表。
5. **断开数据连接**:数据传输完成后,数据连接会关闭。控制连接仍然保持打开,直到用户结束会话(通过 `QUIT` 命令)。
### 优缺点
**优点**:被动模式解决了客户端处于 NAT 或防火墙后面时的问题,因为客户端只需要发起对服务器的外向连接,不需要接受来自服务器的入站连接。
**缺点**:服务器需要预先开放一个端口范围,并且在某些情况下,如果服务器的防火墙配置不当,仍然可能会遇到问题。
# FTP 常用服务软件
许多操作系统和第三方软件都提供 FTP 服务的实现。常见的 FTP 服务器软件有:
- **vsftpd**Very Secure FTP Daemon在 Linux 上广泛使用的高安全性 FTP 服务器。
- **ProFTPD**:功能丰富的 FTP 服务,支持多种认证机制。
- **Pure-FTPd**:简单易用的 FTP 服务器,适用于 Unix/Linux 系统。
- **FileZilla Server**:在 Windows 上使用的开源 FTP 服务器。
# Vsftpd
## 相关介绍
- 软件包vsftpd
- 服务类型由Systemd启动的守护进程
- 配置单元:`/usr/lib/systemd/system/vsftpd.service`
- 守护进程:`/usr/sbin/vsftpd`
- 端口:`21(ftp)`,`20(ftpdata)`
- 主配置文件:`/etc/vsftpd/vsftpd.conf`
- 用户访问控制配置文件:`/etc/vsftpd/ftpusers /etc/vsftpd/user_list`
- 日志文件:`/etc/logrotate.d/vsftpd`
配置文件参数
| 参数 | 作用 |
| :---| :--- |
| listen=NO | 是否以独立运行的方式监听服务 |
| listen_address=ip地址 | 设置要监听的IP地址 |
| listen_port=21 | 设置FTP服务的监听端口 |
| download_enable=YES | 是否允许下载文件 |
| userlist_enable=YES | 设置用户列表为"允许" |
| userlist_deny=YES | 设置用户列表为"禁止" |
| max_clients=0 | 最大客户端连接数0为不限制 |
| max_per_ip=0 | 同一IP地址的最大连接数0为不限制 |
| anonymous_enable=YES | 是否允许匿名用户访问 |
| anon_upload_enable=YES | 是否允许匿名用户上传文件 |
| anon_umask | 匿名用户上传文件的umask |
| anon_root=/var/ftp | 匿名用户的ftp根目录 |
| anon_mkdir_write_enable=YES | 是否允许匿名用户创建目录 |
| anon_other_write_enable=YES | 是否开放匿名用户的其他写入权限(重命名、删除等) |
| anon_max_rate=0 | 匿名用户的最大传输速率0为不限制 |
| local_enable=yes | 是否允许本地用户登录 |
| local_umask=022 | 本地用户上传文件的umask值 |
| local_root=/vat/ftp | 本地用户的ftp根目录 |
| chroot_local_user=YES | 是否将用户权限禁锢在ftp目录以确保安全 |
| local_max_rate=0 | 本地用户的最大传输速率0为不限制 |
## 基本操作
* 安装vsftpd软件
```shell
[root@localhost ~]# yum -y install vsftpd
```
* 准备共享分发的文件
```shell
[root@localhost ~]# touch /var/ftp/test.txt # /var/ftp/ 是默认的共享目录
[root@localhost ~]# echo "hello ftp server" > /var/ftp/test.txt
```
- 配置文件中开启匿名用户登录
```bash
[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf
......
anonymous_enable=YES
......
```
- 启动服务
```shell
[root@localhost ~]# systemctl start vsftpd
[root@localhost ~]# systemctl enable vsftpd
```
* 关闭防火墙
```shell
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0
```
到此我们的FTP服务端就部署完成了。接下来我们应该通过一些客户端软件来连接到服务端上进行文件的传输。
## 客户端工具
### Linux
* 第一种
```shell
[root@localhost ~]# ftp 192.168.88.10
Connected to 192.168.88.10 (192.168.88.10).
220 (vsFTPd 3.0.5)
Name (192.168.88.10:root): anonymous # 匿名用户anonymous
331 Please specify the password.
Password: # 直接回车
230 Login successful. # 看到successful说明连接成功
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>
# 退出的话执行exit命令
```
* 第二种
```shell
[root@localhost ~]# lftp 192.168.88.10 # 默认使用匿名账户登录
lftp 192.168.88.10:~> ls
drwxr-xr-x 2 0 0 6 Nov 06 17:49 pub
-rw-r--r-- 1 0 0 17 Jan 04 01:39 test.txt
```
**区别:**
* ftp 工具是一定要输入用户名称和密码的,登录成功或者失败会给出提示。
* lftp 不会直接给出登录成功或者失败的提示,需要输入 ls 工具才可以发现是否连接成功,优点在于连接更加方便
**注意:**
FTP 有个名单列表。里面会有一些用户名。配合配置文件中的 userlist配置如果是userlist_enable=YES 表示允许该名单的用户登录(白名单),反之,如果是 userlist_deny=YES 表示拒绝名单里的用户登录(黑名单)。
```bash
[root@localhost ~]# cat /etc/vsftpd/user_list
# vsftpd userlist
# If userlist_deny=NO, only allow users in this file
# If userlist_deny=YES (default), never allow users in this file, and
# do not even prompt for a password.
# Note that the default vsftpd pam config also checks /etc/vsftpd/ftpusers
# for users that are denied.
root
bin
...
```
### Windows
**第一种:**
可以在资源管理器或者运行窗口中输入 `ftp://192.168.88.10` 去连接到 ftp 服务器如果我们想连接共享目录下面的具体某个目录比如默认存在的pub目录我们可以通过 `ftp://192.168.88.10/pub` 这样的方式来连接。
<img src="FTP文件服务器/FTP客户端连接01.png" alt="image-FTP客户端连接01" style="zoom:80%;" />
**第二种:**
可以打开 cmd 窗口,在 cmd 中通过 `ftp 192.168.88.10` 访问即可,跟 Linux 中使用 ftp 工具连接时的操作一致。
<img src="FTP文件服务器/FTP客户端连接02.png" alt="image-FTP客户端连接02" style="zoom: 80%;" />
# 主被动模式配置
## 主动模式
在主动模式下,客户端告诉服务器使用哪个端口进行数据传输,服务器通过主动连接客户端的指定端口进行数据传输。
修改 `vsftpd` 配置文件
```bash
# 主动模式配置
connect_from_port_20=YES
```
## 被动模式
在被动模式下,服务器告诉客户端使用哪个端口传输数据,客户端会主动连接到这些端口。被动模式更适合穿越防火墙的网络环境。
修改`vsftpd`配置文件,添加以下内容
```bash
# 被动模式配置
pasv_enable=YES
pasv_min_port=30000
pasv_max_port=31000 # 随机端口范围(但是会有些许误差)
```
## 主被动切换测试
通过user01或者anonymous用户从客户端连接上来以后通过passive切换主被动模式
```bash
[root@localhost ~]# ftp 192.168.88.10
Connected to 192.168.88.10 (192.168.88.10).
220 (vsFTPd 3.0.5)
Name (192.168.88.10:root): user01
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> dir
227 Entering Passive Mode (192,168,88,10,120,145). # 默认是被动模式192,168,88,10,120,145 这里表示随机端口
150 Here comes the directory listing.
226 Directory send OK.
ftp> passive # 通过passive切换主被动
Passive mode off.
ftp> dir
200 PORT command successful. Consider using PASV. # 主动模式使用20做为数据端口所以没有提示端口
150 Here comes the directory listing.
226 Directory send OK.
ftp>
```
# 案例分析01
自定义匿名用户访问目录,能够上传和下载文件
**服务端配置**
```shell
# 准备匿名用户访问的目录和文件
[root@server ~]# mkdir /share/pub && chmod 777 /share/pub && chown ftp:ftp /share/pub
[root@server ~]# echo "anonymous Test download..." > download.txt
# 修改相关配置
[root@server ~]# echo "anon_root=/share" >> /etc/vsftpd/vsftpd.conf
[root@server ~]# echo "anon_upload_enable=YES" >> /etc/vsftpd/vsftpd.conf
[root@server ~]# systemctl restart vsftpd.service
```
**客户端测试验证**
```shell
[root@client ~]# echo "anonymous Test upload..." > upload.txt
# 访问、上传和下载测试
[root@client ~]# lftp 172.16.175.129
lftp 172.16.175.129:~> cd pub
cd 成功, 当前目录=/pub
lftp 172.16.175.129:/pub> ls
lftp 172.16.175.129:/pub> get download.txt
lftp 172.16.175.129:/pub> put upload.txt
```
# 案例分析02
使用本地用户成功登录以后,默认的访问目录为该用户的家目录
**服务端配置**
```shell
# 确保local_enable是否开启
[root@server share]# grep 'local_enable' /etc/vsftpd/vsftpd.conf
local_enable=YES
# 新建用户和测试文件
[root@server ~]# useradd user01
[root@server ~]# echo 123 | passwd --stdin user01
[root@server ~]# su - user01
[user01@server ~]$ echo "user01 Test download..." > download.txt
```
**客户端测试验证**
```shell
[root@client ~]# echo "user01 Test upload..." > upload.txt
# 访问,上传和下载测试
[root@client ~]# ftp lftp -u user01 172.16.175.129
密码:
lftp user01@172.16.175.129:~> ls
-rw-r--r-- 1 1000 1000 13 Jul 08 17:41 download.txt
lftp user01@172.16.175.129:~> get download.txt
13 bytes transferred
lftp user01@172.16.175.129:~> put upload.txt
2686 bytes transferred
```
# 案例分析03
虚拟用户访问控制:虚拟用户为 eagleslab001 和 eagleslab002服务端本地代理用户为 vusereagleslab001 默认访问 `/home/vsftpd/eagleslab01` 且能够创建/删除/上传/下载文件eagleslab002 不做额外配置。
**服务端配置**
```shell
# 创建用于进行FTP认证的用户数据库其中奇数行为用户名偶数行为密码
[root@server ~]$ cat << EOF > /etc/vsftpd/vuser.list
eagleslab001
00123456
eagleslab002
00234567
EOF
# HASH哈希工具(db_load):将明文信息转为密文
[root@localhost ~]# yum install -y libdb-utils
[root@localhost ~]# db_load -T -t hash -f /etc/vsftpd/vuser.list /etc/vsftpd/vuser.db
# 查看文件描述以及修改权限 & 删除明文信息
[root@localhost ~]# file /etc/vsftpd/vuser.db
/etc/vsftpd/vuser.db: Berkeley DB (Hash, version 9, native byte-order)
[root@localhost ~]# chmod 600 /etc/vsftpd/vuser.db
[root@localhost ~]# rm -rf vuser.list
# 创建虚拟用户的本地代理用户 & 用户目录
[root@localhost ~]# useradd -d /home/vsftpd -s /sbin/nologin vuser
[root@localhost ~]# mkdir -p /home/vsftpd/{eagleslab001,eagleslab002}
[root@localhost ~]# chmod -Rf 755 /home/vsftpd/
# 新建用于虚拟用户认证的PAM文件
[root@localhost ~]# cat << EOF > /etc/pam.d/vsftpd_vuser
auth required pam_userdb.so db=/etc/vsftpd/vuser
account required pam_userdb.so db=/etc/vsftpd/vuser
EOF
# 更新配置文件
[root@localhost ~]# cat << EOF >> /etc/vsftpd/vsftpd.conf
pam_service_name=vsftpd_vuser
userlist_enable=YES
guest_enable=YES
guest_username=vuser
allow_writeable_chroot=YES
chroot_local_user=YES
user_config_dir=/etc/vsftpd/conf.d
EOF
# 针对 eagleslabl001 设置不同权限
[root@localhost ~]# cat << EOF > /etc/vsftpd/conf.d/eagleslab001
local_root=/home/vsftpd/eagleslab001
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
EOF
# 重启服务
[root@localhost ~]# systemctl restart vsftpd
# 准备一些测试文件
[user01@server ~]$ echo "eagleslab001 Test download..." > /home/vsftpd/eagleslab001/download001.txt
[user01@server ~]$ echo "eagleslab002 Test download..." > /home/vsftpd/eagleslab002/download002.txt
```
**客户端测试验证**
```shell
# eagleslab001
[root@client ~]# lftp -u eagleslab001,00123456 172.16.175.129
...
# eagleslab002 put: 访问失败: 550 Permission denied.
[root@client ~]# lftp -u eagleslab002,00234567 172.16.175.129
```

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

181
Linux服务/HTTP协议.md Normal file
View File

@@ -0,0 +1,181 @@
# HTTP 协议介绍
HTTPHyperText Transfer Protocol超文本传输协议是用于在客户端通常是浏览器和服务器之间传输超文本如HTML的应用层协议。它是无状态的、面向请求-响应的协议基于TCP/IP传输。
HTTP有不同版本号不同版本号区别如下
- HTTP0.9:仅支持 GET 方法,仅能访问 HTML 格式的资源
- HTTP1.0:增加 POST 和 HEAD 方法MIME 支持多种数据格式,开始支持 Cache支持 tcp 短连接
- HTTP1.1:支持持久连接(长连接),一个 TCP 连接允许多个请求,新增 PUT、PATCH、DELETE 等
- HTTP2.0性能大幅提升新的二进制格式多路复用header 压缩,服务端推送
# HTTP 工作原理
HTTP的工作过程可以总结为以下几个步骤
1. **建立连接:** 客户端如浏览器与服务器之间通过TCP三次握手建立连接。
2. **发送请求:** 客户端向服务器(Apache、Nginx、IIS服务器)发送HTTP请求报文请求资源或操作。
3. **服务器处理请求:** HTTP服务器接收到请求后处理请求并生成响应。
4. **返回响应:** 服务器将响应报文返回给客户端。
5. **断开连接:** 通常在响应完成后关闭TCP连接HTTP/1.0默认短连接HTTP/1.1支持长连接)。
# URL 与 URI
## URIUniform Resource Identifier
URI 是统一资源标识符用于标识互联网上的资源。URI 分为两种
- **URLUniform Resource Locator** 统一资源定位符,用于描述资源的地址。
- **URNUniform Resource Name** 统一资源名称,用于标识资源的名称,不依赖物理位置
## URLUniform Resource Locator
HTTP 使用统一资源标识符Uniform Resource Identifiers, URI来传输数据和建立连接。URL 是一种特殊类型的URI包含了用于查找某个资源的足够的信息
URL 全称是 UniformResourceLocator, 中文叫统一资源定位符,是互联网上用来标识某一处资源的地址。以下面这个URL为例介绍下普通URL的各部分组成
```shell
http://iproute.cn:80/news/search?keyword=123&enc=utf8#name=321
```
从上面的URL可以看出一个完整的URL包括以下几部分
1. **协议部分:** 该URL的协议部分为 `http`这代表网页使用的是HTTP 协议。在 Internet 中可以使用多种协议,如 HTTPFTP 等等本例中使用的是 HTTP 协议。在 `http:` 后面的 `//` 为分隔符
2. **域名(主机)部分:** 该 URL 的域名部分为 `iproute.cn`。一个URL 中,也可以使用 IP 地址作为域名使用
3. **端口部分:** 跟在域名后面的是端口,域名和端口之间使用 `:` 作为分隔符。端口不是一个 URL 必须的部分,如果省略端口部分,将采用默认端口
4. **虚拟目录部分:** 从域名后的第一个 `/` 开始到最后一个 `/` 为止,是虚拟目录部分。虚拟目录也不是一个 URL 必须的部分。本例中的虚拟目录是 `/news/`
5. **文件名部分:** 从域名后的最后一个 `/` 开始到 `?` 为止,是文件名部分,如果没有 `?` ,则是从域名后的最后一个 `/` 开始到 `#` 为止,是文件部分,如果没有 `?``#`,那么从域名后的最后一个 `/` 开始到结束,都是文件名部分。本例中的文件名是 `search` 。文件名部分也不是一个 URL 必须的部分,如果省略该部分,则使用默认的文件名
6. **参数部分:**`` 开始到 `#` 为止之间的部分为参数部分,又称搜索部分、查询部分。本例中的参数部分为 `keyword=123&enc=utf8`。参数可以允许有多个参数,参数与参数之间用 `&` 作为分隔符
7. **锚部分:**`#` 开始到最后,都是锚部分。本例中的锚部分是`name`。锚部分也不是一个 URL 必须的部分
# HTTP 注意事项
1. HTTP 是无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
2. HTTP 是媒体独立的:这意味着,只要客户端和服务器知道如何处理的数据内容,任何类型的数据都可以通过 HTTP 发送。客户端以及服务器指定使用适合的 MIME-type 内容类型。
3. HTTP 是无状态HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息则它必须重传这样可能导致每次连接传送的数据量增大。另一方面在服务器不需要先前信息时它的应答就较快。
# HTTP 消息结构
- HTTP 是基于客户端/服务端C/S的架构模型通过一个可靠的链接来交换信息是一个无状态的请求/响应协议。
- HTTP 客户端是一个应用程序Web 浏览器或其他任何客户端),通过连接到服务器达到向服务器发送一个或多个 HTTP 的请求的目的。
- HTTP 服务端是一个应用程序(通常是一个 Web 服务,如 Apache Web服务器或IIS服务器等通过接收客户端的请求并向客户端发送 HTTP 响应数据。
- HTTP 使用统一资源标识符Uniform Resource Identifiers, URI来传输数据和建立连接。
- HTTP 响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文。
![img-CS架构](HTTP协议/CS架构.png)
## HTTP 请求报文
客户端发送一个 HTTP 请求到服务器的请求消息包括以下格式:
![img](HTTP协议/请求报文格式.png)
![img](HTTP协议/请求报文示例.png)
## POST 和 GET 请求方法区别
- 提交的过程
- GET 提交请求的数据会附在URL之后就是把数据放置在 HTTP 协议头中),以?分割URL和传输数据多个参数用&连接
- POST 提交把提交的数据放置在是HTTP包的包体中
- 传输数据的大小
- 首先声明HTTP协议没有对传输的数据大小进行限制HTTP 协议规范也没有对URL长度进行限制
- GET 提交特定浏览器和服务器对URL长度有限制
- POST 提交由于不是通过URL传值理论上数据不受限
- 安全性
- POST 的安全性要比 GET 的安全性高
- 登录页面有可能被浏览器缓存,而缓存的是 URL
- 其他人查看浏览器的历史纪录,那么别人就可以拿到你的账号和密码
- 使用 GET 提交数据还可能会造成 Cross-site request forgery 攻击
## 常见请求报文头部属性
- Accpet
- 告诉服务端,客户端接收什么类型的响应
- Referer
- 表示这是请求是从哪个URL进来的比如想在网上购物,但是不知道选择哪家电商平台你就去问百度说哪家电商的东西便宜啊然后一堆东西弹出在你面前第一给就是某宝当你从这里进入某宝的时候这个请求报文的Referer 就是 `http://www.baidu.com`
- Cache-Control
- 对缓存进行控制,如一个请求希望响应的内容在客户端缓存一年,或不被缓可以通过这个报文头设置
- Accept-Encoding
- 这个属性是用来告诉服务器能接受什么编码格式,包括字符编码,压缩格式
- Host
- 指定要请求的资源所在的主机和端口
- User-Agent
- 告诉服务器,客户端使用的操作系统、浏览器版本和名称
## HTTP 响应报文
服务的相应信息格式如下:
![img-响应报文格式](HTTP协议/响应报文格式.png)
<img src="HTTP协议/响应报文示例.png" alt="img-响应报文示例" style="zoom:80%;" />
## 常见响应报文头部属性
- Cache-Control
- 响应输出到客户端后,服务端通过该属性告诉客户端该怎么控制响应内容的缓存
- ETag
- 表示客户端请求资源的版本,如果该资源发生了变化,那么这个属性也会跟着变
- Location
- 在重定向中或者创建新资源时使用
- Set-Cookie
- 服务端可以设置客户端的 cookie
-
# HTTP 状态码
- 状态代码有三位数字组成,第一个数字定义了响应的类别,共分五种类别:
- 1xx指示信息--表示请求已接收,继续处理
- 2xx成功--表示请求已被成功接收、理解、接受
- 3xx重定向--要完成请求必须进行更进一步的操作
- 4xx客户端错误--请求有语法错误或请求无法实现
- 5xx服务器端错误--服务器未能实现合法的请求
- 常见状态码
```xml
200 OK //客户端请求成功
400 Bad Request //客户端请求有语法错误,不能被服务器所理解
401 Unauthorized //请求未经授权这个状态代码必须和WWW-Authenticate报头域一起使用
403 Forbidden //服务器收到请求,但是拒绝提供服务
404 Not Found //请求资源不存在eg输入了错误的URL
500 Internal Server Error //服务器发生不可预期的错误
503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常
```
# HTTP 请求方法
根据 HTTP 标准HTTP 请求可以使用多种请求方法。
HTTP1.0 定义了三种请求方法: GET, POST 和 HEAD方法。
HTTP1.1 新增了五种请求方法OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。
- GET请求指定的页面信息并返回实体主体。
- HEAD类似于 get 请求,只不过返回的响应中没有具体的内容,用于获取报头
- POST向指定资源提交数据进行处理请求例如提交表单或者上传文件。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。
- PUT从客户端向服务器传送的数据取代指定的文档的内容。
- DELETE请求服务器删除指定的页面。
- CONNECTHTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
- OPTIONS允许客户端查看服务器的性能。
- TRACE回显服务器收到的请求主要用于测试或诊断。
# 长连接与短连接
HTTP1.1 规定了默认保持长连接HTTP persistent connection 也有翻译为持久连接数据传输完成了保持TCP连接不断开不发RST包、不四次握手等待在同域名下继续用这个通道传输数据相反的就是短连接。
在实际使用中HTTP 头部有了 Keep-Alive 这个值并不代表一定会使用长连接,客户端和服务器端都可以无视这个值,也就是不按标准来。毕竟 TCP 是一个双向连接的协议,双方都可以决定是不是主动断开。
客户端的长连接不可能无限期的拿着,会有一个超时时间,服务器有时候会告诉客户端超时时间。下图中的 Keep-Alive: timeout=20表示这个TCP通道可以保持20秒
![img-Keep-Alive报文](HTTP协议/Keep-Alive报文.png)
# 课后作业
- [扩展]了解更多请求/响应报文头属性
- [扩展]了解更多响应状态码

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

View File

@@ -0,0 +1,631 @@
# NFS网络文件共享
NFSNetwork File System是一种分布式文件系统协议最初由Sun Microsystems在1984年开发。NFS允许计算机在网络上共享文件和目录就像这些文件和目录位于本地计算机上一样。它广泛应用于UNIX和类UNIX系统中但也可以在其他操作系统上使用如Windows和macOS。
## NFS简介与RPC简介
### NFS服务介绍
NFS是一种网络协议NFS依赖RPC才能工作。
NFS 的基本原则是“容许不同的客户端及服务端通过一组RPC分享相同的文件系统”它是独立于操作系统容许不同硬件及操作系统的系统共同进行文件的分享。可以理解为把一个电脑上的硬盘挂载到另一个电脑上使用另一个电脑能够像使用自己本地硬盘使用挂载的硬盘。
NFS在文件传送或信息传送过程中依赖于RPC协议。RPC远程过程调用 (Remote Procedure Call) 是能使客户端执行其他系统中程序的一种机制。NFS本身是没有提供信息传输的协议和功能的但NFS却能让我们通过网络进行资料的分享这是因为NFS使用了一些其它的传输协议。而这些传输协议用到这个RPC功能的。可以这么理解RPC和NFS的关系NFS是一个文件系统而RPC是负责信息的传输。
### RPC协议介绍
RPCRemote Procedure Call远程过程调用它是一种通过网络从远程计算机程序上请求服务而不需要了解底层网络技术的协议。其工作在TCP/UDP的111端口。建立在Socket之上的主要是简化编程的工作在底层提供网络之间的通信。
RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息的到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。
#### RPC 远程过程调度
* NFS 协议本身并没有网络传输功能,而是基于远程过程调用协议实现的
* 提供一个面向过程的远程服务的接口
* 可以通过网络从远程主机程序上请求服务,而不需要了解底层网络技术的协议
* 工作在 OSI 模型的会话层,它可以为遵从 RPC 协议应用层协议提供端口注册功能
* 事实上有很多服务NFS 和 NIS 等)都可以向 RPC 注册端口
* RPC 使用网络端口 111 来监听客户端的请求
#### RPC 协议模型
1. 基于 rpc 的服务(此处是指 nfs 服务,在别处有可能是代表其他服务)在启动时向 portmapper 注册端口
2. 基于 rpc 的客户端联系服务端 portmapper 询问服务的端口号
3. portmapper 告知客户端基于 rpc 服务使用的端口号
4. 基于 rpc 的客户端访问被告知单某基于 rpc 服务的端口
5. 基于 rpc 的服务响应客户端的请求
![img](NFS%E7%BD%91%E7%BB%9C%E6%96%87%E4%BB%B6%E5%85%B1%E4%BA%AB/re3f2X3JWT0K4foH.png!thumbnail)
### NFS工作流程
1. 首先服务器端启动RPC服务并开启111端口
2. 然后还需要服务器端启动NFS服务并向RPC注册端口信息
3. 客户端启动RPCportmap服务向服务端的RPC(portmap)服务请求服务端的NFS端口
4. 服务端的RPC(portmap)服务反馈NFS端口信息给客户端。
5. 客户端通过获取的NFS端口来建立和服务端的NFS连接并进行数据的传输。
<img src="NFS%E7%BD%91%E7%BB%9C%E6%96%87%E4%BB%B6%E5%85%B1%E4%BA%AB/VgPgforTeyQakK6L.png!thumbnail" alt="img" />
### 挂载原理/过程
当我们在NFS服务器设置好一个共享目录/opt 后,其他人是有权访问/opt这个共享目录的NFS客户端就可以将这个目录挂载到自己文件系统的某个挂载点这个挂载点可以自己定义路径不同也可以如下图客户端A与客户端B挂载的目录就不相同。并且挂载好后我们在本地能够看到服务端/opt下的所有数据。
<img src="NFS%E7%BD%91%E7%BB%9C%E6%96%87%E4%BB%B6%E5%85%B1%E4%BA%AB/image-20250109102300565.png" alt="image-20250109102300565" style="zoom:80%;" />
# NFS共享实战
## 准备工作
一、服务器信息:
```bash
主机 IP 服务 端口
服务端: 192.168.88.10 nfs rpc 2049 111
客户端: 192.168.88.20 nfs rpc 2049 111
```
二、关闭防火墙
```bash
# 关闭防火墙
systemctl stop firewalld
# 禁止防火墙开机自启
systemctl disable firewalld
```
如果必须开启防火墙我们可以通过firewalld放行nfs和rpc服务
```bash
# 开启nfs和rpc服务
firewall-cmd --permanent --add-service=nfs
firewall-cmd --permanent --add-service=rpc-bind
# 重载防火墙规则
firewall-cmd --reload
```
三、关闭SELinux
```bash
setenforce 0
```
四、检查内核是否支持
```bash
modinfo nfs
```
## NFS软件介绍
相关软件包nfs-utils、rpcbind
端口2049(nfsd),其它端口由 portmap(111)分配。CentOS 6 开始 portmap 进程由 rpcbind 代替
NFS 服务主要进程:
* rpc.nfsd 最主要的 NFS 进程, 管理客户端是否可登录
* rpc.mountd 挂载和卸载 NFS 文件系统,包括权限管理
* rpc.lockd 非必要,管理文件锁,避免同时写出错
* rpc.statd 非必要, 检查文件-致性, 可修复文件
* 日志:/var/lib/nfs
配置文件:
* /etc/exports
* /etc/exports.d/*.exports
## NFS部署
一、安装rpcbind和nfs服务
```bash
[root@localhost ~]# yum -y install rpcbind nfs-utils
```
二、启动服务
```bash
[root@localhost ~]# systemctl enable --now rpcbind
[root@localhost ~]# systemctl enable --now nfs-server
Created symlink /etc/systemd/system/multi-user.target.wants/nfs-server.service → /usr/lib/systemd/system/nfs-server.service.
```
三、验证服务
```bash
[root@localhost ~]# systemctl status rpcbind
● rpcbind.service - RPC Bind
Loaded: loaded (/usr/lib/systemd/system/rpcbind.service; enabled; preset: enabled)
Active: active (running) since Thu 2025-01-09 10:54:21 CST; 51s ago
TriggeredBy: ● rpcbind.socket
Docs: man:rpcbind(8)
Main PID: 26847 (rpcbind)
Tasks: 1 (limit: 10888)
Memory: 1.6M
CPU: 28ms
CGroup: /system.slice/rpcbind.service
└─26847 /usr/bin/rpcbind -w -f
Jan 09 10:54:21 localhost.localdomain systemd[1]: Starting RPC Bind...
Jan 09 10:54:21 localhost.localdomain systemd[1]: Started RPC Bind.
[root@localhost ~]# systemctl status nfs-server
● nfs-server.service - NFS server and services
Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; enabled; preset: disabled)
Active: active (exited) since Thu 2025-01-09 10:54:39 CST; 42s ago
Docs: man:rpc.nfsd(8)
man:exportfs(8)
Process: 27817 ExecStartPre=/usr/sbin/exportfs -r (code=exited, status=0/SUCCESS)
Process: 27818 ExecStart=/usr/sbin/rpc.nfsd (code=exited, status=0/SUCCESS)
Process: 27836 ExecStart=/bin/sh -c if systemctl -q is-active gssproxy; then systemctl reload gssproxy ; fi (code=exited, st>
Main PID: 27836 (code=exited, status=0/SUCCESS)
CPU: 35ms
Jan 09 10:54:38 localhost.localdomain systemd[1]: Starting NFS server and services...
Jan 09 10:54:39 localhost.localdomain systemd[1]: Finished NFS server and services.
# 端口号验证
[root@localhost ~]# ss -nlt
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 64 0.0.0.0:2049 0.0.0.0:*
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 4096 0.0.0.0:111 0.0.0.0:*
LISTEN 0 4096 0.0.0.0:56973 0.0.0.0:*
LISTEN 0 64 0.0.0.0:46725 0.0.0.0:*
LISTEN 0 4096 0.0.0.0:20048 0.0.0.0:*
LISTEN 0 64 [::]:2049 [::]:*
LISTEN 0 128 [::]:22 [::]:*
LISTEN 0 4096 [::]:111 [::]:*
LISTEN 0 64 [::]:35931 [::]:*
LISTEN 0 4096 [::]:35405 [::]:*
LISTEN 0 4096 [::]:20048 [::]:*
```
### NFS配置文件格式
```shell
/dir 主机 1(opt1,opt2) 主机 2(opt1,opt2)
```
* 主机格式
* 单个主机: ipv4, ipv6, FQDN
* IP networks: 两种掩码格式均支持
* 172.18.0.0/255.255.0.0
* 172.18.0.0/16
* wildcards:主机名通配,例如*.iproute.cnIP 不可以
* netgroups: NIS 域的主机组,@group_ name
* anonymous:表示使用*通配所有客户端
* 选项格式
* 默认选项
* (ro,sync,root_squash, no_all_squash)
* ro, rw
* 只读和读写
* async
* 异步,数据变化后不立即写磁盘,等磁盘空闲时再写入,性能高
* sync
* 同步(1.0.0 后为默认),数据在请求时立即写入共享存储磁盘
* root_squash
* 远程 root 映射为 nfsnobody(默认)UID 为 65534Centos8 为 nobody, 早期版本是 4294967294 (nfsnobody)
* no_root_squash
* 远程 root 映射成 root 用户
* all_squash
* 所有远程用户(包括 root)都变成 nfsnobody , Centos8 为 nobody
* no_all_squash
* 保留共享文件的 UID 和 GID (默认)
* anonuid 和 anongid
* 指明匿名用户映射为特定用户 UID 和组 GID而非 nfsnobody ,可配合 all_squash 使用
### NFS相关工具
#### rpcinfo
rpcinfo 工具可以查看 RPC 相关信息
查看注册在指定主机的 RPC 程序
```shell
rpcinfo -p hostname
```
查看 rpc 注册程序
```shell
rpcinfo -s hostname
```
#### exportfs
可用于管理 NFS 导出的文件系统
常见选项:
* **-v**:查看本机所有 NFS 共享
* **-r**:重读配置文件,并共享目录
* **-a**:输出本机所有共享
* **-au**:停止本机所有共享
#### showmount
常见用法:
```shell
showmount -e hostname
```
### 配置共享目录
服务端上创建共享目录;这里我们要挂载的目录是`/myshare`
```bash
[root@localhost ~]# mkdir -p /myshare
```
### 手动挂载案例
```bash
# 服务端
[root@localhost ~]# vim /etc/exports
/myshare 192.168.88.0/24
[root@localhost ~]# cd /myshare
[root@localhost myshare]# echo "hello" > file
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0
# 客户端:
[root@localhost ~]# yum install -y nfs-utils rpcbind
[root@localhost ~]# showmount -e 192.168.88.10
Export list for 192.168.88.10:
# 虽然我们自己配置共享了,但是没有重读配置文件,所以读不到
# 服务端:
[root@localhost myshare]# exportfs -r
exportfs: No options for /myshare 192.168.88.0/24: suggest 192.168.88.0/24(sync) to avoid warning
[root@localhost myshare]# exportfs -v
/myshare 192.168.88.0/24(sync,wdelay,hide,no_subtree_check,sec=sys,ro,secure,root_squash,no_all_squash)
# 客户端:
[root@localhost ~]# showmount -e 192.168.88.10
Export list for 192.168.88.10:
/myshare 192.168.88.0/24
[root@localhost ~]# mkdir /mnt/nfs
[root@localhost ~]# mount -t nfs 192.168.88.10:/myshare /mnt/nfs
[root@localhost ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 4.0M 0 4.0M 0% /dev
tmpfs 872M 0 872M 0% /dev/shm
tmpfs 349M 5.2M 344M 2% /run
/dev/mapper/rl-root 17G 1.7G 16G 10% /
/dev/nvme0n1p1 960M 261M 700M 28% /boot
tmpfs 175M 0 175M 0% /run/user/0
192.168.88.10:/myshare 17G 1.7G 16G 10% /mnt/nfs
[root@localhost ~]# cd /mnt/nfs/
[root@localhost nfs]# ls
file
[root@localhost nfs]# cat file
hello
[root@localhost ~]# rm -f file
rm: cannot remove 'file': Read-only file system
[root@localhost ~]# umount /mnt/nfs
# 现在是只读模式,想要修改模式要去改配置文件,先卸载挂载
# 服务端:
[root@localhost ~]# vim /etc/exports
/myshare 192.168.88.0/24(rw,sync,root_squash,no_all_squash)
[root@localhost myshare]# exportfs -v
/myshare 192.168.88.0/24(sync,wdelay,hide,no_subtree_check,sec=sys,ro,secure,root_squash,no_all_squash)
[root@localhost myshare]# exportfs -r
[root@localhost myshare]# exportfs -v
/myshare 192.168.88.0/24(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash)
# 客户端:
[root@localhost ~]# showmount -e 192.168.88.10
Export list for 192.168.88.10:
/myshare 192.168.88.0/24
[root@localhost ~]# mount -t nfs 192.168.88.10:/myshare /mnt/nfs
[root@localhost ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 4.0M 0 4.0M 0% /dev
tmpfs 872M 0 872M 0% /dev/shm
tmpfs 349M 5.2M 344M 2% /run
/dev/mapper/rl-root 17G 1.7G 16G 10% /
/dev/nvme0n1p1 960M 261M 700M 28% /boot
tmpfs 175M 0 175M 0% /run/user/0
192.168.88.10:/myshare 17G 1.7G 16G 10% /mnt/nfs
[root@localhost ~]# cd /mnt/nfs/
[root@localhost nfs]# rm -f file
rm: cannot remove 'file': Permission denied
# 虽然给了rw权限但是目录权限被linux控制
# 服务端:
[root@localhost myshare]# ll -d /myshare/
drwxr-xr-x. 2 root root 18 Jan 9 15:59 /myshare/
[root@localhost myshare]# chmod a+w /myshare/
# 客户端:
[root@localhost nfs]# rm -f file
[root@localhost nfs]# echo "Hello, This is server2" > file
[root@localhost nfs]# ll
total 4
-rw-r--r--. 1 nobody nobody 23 Jan 9 16:14 file
[root@localhost nfs]# su - user01
[user01@localhost ~]$ cd /mnt/nfs/
[user01@localhost nfs]$ touch file1
[user01@localhost nfs]$ ll
总用量 4
-rw-r--r-- 1 nfsnobody nfsnobody 6 7月 16 22:08 file
-rw-rw-r-- 1 user01 user01 0 7月 16 22:11 file1
# 服务端:
[root@localhost myshare]# ll
总用量 4
-rw-r--r--. 1 nfsnobody nfsnobody 6 7月 16 22:08 file
-rw-rw-r--. 1 1000 1000 0 7月 16 22:11 file1
[root@localhost myshare]# useradd -u1000 zhangsan
[root@localhost myshare]# ll
总用量 4
-rw-r--r--. 1 nfsnobody nfsnobody 6 7月 16 22:08 file
-rw-rw-r--. 1 zhangsan zhangsan 0 7月 16 22:11 file1
[root@localhost ~]# vim /etc/exports
/myshare 192.168.88.0/24(rw,sync,no_root_squash,all_squash)
[root@localhost myshare]# exportfs -r
[root@localhost myshare]# exportfs -v
/myshare 192.168.88.0/24(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,no_root_squash,all_squash)
# 客户端:
[root@localhost ~]# umount /mnt/nfs/
[root@localhost ~]# mount -t nfs 192.168.88.10:/myshare /mnt/nfs
[root@localhost ~]# df -h
[root@localhost ~]# cd /mnt/nfs/
[root@localhost ~]# touch file{2,3}
[root@localhost nfs]# ll
总用量 4
-rw-r--r-- 1 nfsnobody nfsnobody 6 7月 16 22:08 file
-rw-rw-r-- 1 user01 user01 0 7月 16 22:11 file1
-rw-r--r-- 1 nfsnobody nfsnobody 0 7月 16 22:26 file2
-rw-r--r-- 1 nfsnobody nfsnobody 0 7月 16 22:26 file3
```
## mount.nfs挂载选项
客户端 NFS 挂载
NFS 相关的挂载选项:`man 5 nfs`
* **fg**(默认)前台挂载,失败直接退出
* **bg**:后台挂载,失败后会再次尝试
* **hard**(默认)持续请求
* **soft**:非持续请求
* **intr 和 hard 配合**:请求可中断
* **rsize 和 wsize**一次读和写数据最大字节数rsize=32768
* **nosuid**忽略文件的suid特殊权限
* **_netdev**:提示标志,表示挂载的是网络设备,启动时候先简历网络连接,再挂载设备
* **noexec**:表示不允许执行
提示:基于安全考虑,建议使用`nosuid,_netdev,noexec`挂载选项
范例:临时挂载 NFS 共享
```shell
mount -o rw,nosuid,fg,hard,intr 192.168.88.10:/myshare /mnt/nfs
```
范例:开机挂载
```shell
vim /etc/fstab
192.168.88.10:/myshare /mnt/nfs nfs defaults,_netdev 0 0
```
# 自动挂载
由于NFS的应用场景需要我们挂载远程硬盘本地使用所以我们可以使用autofs服务按需要挂载外围设备NFS共享等并在空闲5分钟后后自动卸载。
主要用于客户端上,在客户端上自动挂载服务端提供的共享目录。
## 相关包和文件
* 软件包: autofs
* 服务文件: /usr/lib/systemd/system/autofs.service
* 配置文件: /etc/auto.master
客户端安装:
```bash
[root@localhost ~]# yum install -y autofs
[root@localhost ~]# systemctl enable --now autofs
```
## 配置autofs
`autofs` 的主要配置分为 **主配置文件****挂载映射文件**
### **主配置文件 **
`/etc/auto.master``autofs` 的主配置文件,用于定义挂载点及其对应的映射文件。
示例:
```bash
/mnt/nfs /etc/auto.nfs --timeout=300
```
配置说明:
- `/mnt/nfs`:挂载点的根目录。
- `/etc/auto.nfs`:挂载点对应的映射文件。
- `--timeout=300`挂载超时时间单位为秒300 秒后未访问的挂载点将自动卸载。
**注意**:修改 `/etc/auto.master` 后需要重新加载 `autofs` 服务。
```bash
systemctl reload autofs
```
### 挂载映射文件 `/etc/auto.nfs`
挂载映射文件定义了具体的 NFS 挂载规则。
示例:
```bash
share1 -fstype=nfs4,rw,soft nfs-server:/export/share1
share2 -fstype=nfs4,ro,hard nfs-server:/export/share2
```
#### 配置说明:
- `share1``share2`:挂载点名称,最终挂载路径为 `/mnt/nfs/share1``/mnt/nfs/share2`
- `-fstype=nfs4`: 指定文件系统类型为 NFSv4。
- `rw`/`ro`:挂载权限,`rw` 表示读写,`ro` 表示只读。
- soft/hard
- **soft**:如果 NFS 服务器未响应,客户端将返回错误。
- **hard**:客户端将无限期尝试连接,直到服务器恢复正常。
- `nfs-server:/export/share1`NFS 服务器地址及其共享路径。
**注意**:修改挂载映射文件后无需重启服务,`autofs` 会动态加载。
## 挂载案例
一、创建挂载点目录
```bash
[root@localhost ~]# mkdir /mnt/nfs
```
二、配置autofs自动挂载
```bash
# 编辑auto.master主配置文件
[root@localhost ~]# vim /etc/auto.master
/mnt/nfs /etc/auto.nfs
[root@localhost ~]# systemctl restart autofs
# 编辑挂载映射文件
[root@localhost ~]# vim /etc/auto.nfs
share -fstype=nfs4,rw,soft 192.168.88.10:/myshare
```
三、验证挂载
```bash
# 访问挂载点以触发自动挂载
[root@localhost ~]# ls /mnt/nfs/share
dir file file1
[root@localhost ~]# cd /mnt/nfs/share/
[root@localhost share]# ls
dir file file1
[root@localhost share]# cat file
Hello, This is server2
```
### 其他配置选项
在挂载映射文件中可以使用多种选项,以下是常用参数的详细说明:
#### 文件系统类型选项 (`-fstype=`)
- **nfs**:适用于 NFSv3 文件系统。
- **nfs4**:适用于 NFSv4 文件系统。
#### 挂载选项
- **rw**:读写权限。
- **ro**:只读权限。
- **soft**:允许客户端在超时后返回错误。
- **hard**:客户端会一直尝试连接,直到服务器恢复正常。
- **intr**允许中断挂载操作NFSv3 使用)。
- **timeo=<value>**:超时时间(默认 600 分钟)。
- **bg**:后台挂载操作。
### 变量支持
映射文件中可以使用变量。例如:
```bash
* -fstype=nfs4,rw 192.168.88.10:/myshare/&
```
在此配置中,`*` 代表通配符,`&` 将被替换为对应挂载点名称。例如,访问 `/mnt/nfs/test` 时将挂载 `192.168.88.10:/myshare/test`
# 实战案例
将NFS的共享目录通过autofs 发布出来,做为远程主机用户的家目录
<img src="NFS%E7%BD%91%E7%BB%9C%E6%96%87%E4%BB%B6%E5%85%B1%E4%BA%AB/image-20250110151646824.png" alt="image-20250110151646824" style="zoom:80%;" />
## 环境准备
将server1中的用户家目录共享出来server2在登录相同用户的时候看到的家目录下的文件是一致的
## 实验过程
一、NFS服务器(server1)创建用户和对应的目录将用户user01的家目录共享出来
```bash
[root@localhost ~]# mkdir /data
[root@localhost ~]# useradd -d /data/user01 user01
[root@localhost ~]# id user01
uid=1000(user01) gid=1000(user01) groups=1000(user01)
[root@localhost ~]# vim /etc/exports
[root@localhost ~]# cat /etc/exports
# /myshare 192.168.88.0/24(rw,sync,root_squash,no_all_squash)
/data/user01 192.168.88.0/24(rw,sync,anonuid=1000,anongid=1000,all_squash)
[root@localhost ~]# exportfs -r
[root@localhost ~]# exportfs -v
/data/user01 192.168.88.0/24(sync,wdelay,hide,no_subtree_check,anonuid=1000,anongid=1000,sec=sys,rw,secure,root_squash,all_squash)
```
二、在NFS客户端(server2)中配置autofs
```bash
[root@localhost ~]# vim /etc/auto.master
/- /etc/auto.user
[root@localhost ~]# vim /etc/auto.user
[root@localhost ~]# cat /etc/auto.user
/data/user01 -fstype=nfs4,rw,soft 192.168.88.10:/data/user01
[root@localhost ~]# systemctl restart autofs
```
三、在server2中创建user01用户
```bash
[root@localhost ~]# useradd -d /data/user01 -u 1000 user01
useradd: warning: the home directory /data/user01 already exists.
useradd: Not copying any file from skel directory into it.
```
四、测试
```bash
# 在server1中登录到user01用户创建一个文件
[root@localhost ~]# su - user01
[user01@localhost ~]$ echo "The file is created by server1-user01" > file
# 在server2中登录到user01用户查看是否共享了该文件
[root@localhost ~]# su - user01
[user01@localhost ~]$ ls
file
[user01@localhost ~]$ cat file
The file is created by server1-user01
[user01@localhost ~]$ pwd
/data/user01
# 检查server2中挂载情况
[user01@localhost ~]$ df -h
df: /mnt/nfs/share: Stale file handle
Filesystem Size Used Avail Use% Mounted on
devtmpfs 4.0M 0 4.0M 0% /dev
tmpfs 872M 0 872M 0% /dev/shm
tmpfs 349M 6.6M 343M 2% /run
/dev/mapper/rl-root 17G 1.7G 16G 10% /
/dev/nvme0n1p1 960M 261M 700M 28% /boot
tmpfs 175M 0 175M 0% /run/user/0
192.168.88.10:/data/user01 17G 1.7G 16G 10% /data/user01
```
五、总结
从该实验结果中可以看出我们通过nfs和autofs工具的配合使用实现了两台主机共享同一个目录的效果。
NFS工具主要目的在于将远程存储设备共享出来其他主机能够将分享出来的目录进行挂载。达到跟使用自己本地硬盘一样的效果。有效的解决了本地硬盘空间不足部分文件需要共享数据存储持久化等问题。是目前企业里使用较多的文件共享服务器最佳实践方案。

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

1689
Linux服务/Nginx.md Normal file

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 227 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 308 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 231 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 158 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 230 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 248 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 605 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 283 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 175 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 125 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 371 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 124 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 754 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 754 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 754 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 668 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 710 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 921 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 872 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 803 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 744 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 650 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 173 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB

Some files were not shown because too many files have changed in this diff Show More