DHCP服务器
DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)是一种运行在应用层的网络协议,主要用于为局域网内的设备(如计算机、手机、物联网设备等)自动分配 IP 地址及其他网络配置参数,简化网络管理并避免 IP 地址冲突。
DHCP 的核心作用
- 自动分配 IP 地址:无需管理员手动为每个设备设置 IP,DHCP 服务器会从预设的 IP 地址池中自动分配一个未被使用的 IP 给设备。
- 统一配置网络参数:除 IP 地址外,还能自动分配子网掩码、默认网关、DNS 服务器地址、域名等关键网络参数,确保设备接入网络后可直接通信。
- 高效管理 IP 资源:通过租期管理(IP 地址的使用期限),自动回收闲置 IP,提高 IP 地址利用率,尤其适用于设备频繁接入 / 断开的场景(如公共场所 WiFi)。
DHCP 的工作原理(四步握手过程)
设备接入网络后,通过以下四个步骤获取网络配置,称为 “DHCP 会话”:
DHCP Discover(发现阶段)
- 新接入的设备(客户端)在网络中广播发送DHCP Discover报文,寻找可用的 DHCP 服务器(此时客户端无 IP 地址,源 IP 为0.0.0.0,目标 IP 为255.255.255.255)。
DHCP Offer(提供阶段)
- 收到广播的 DHCP 服务器,从自身的 IP 地址池中选择一个未分配的 IP,连同子网掩码、网关、租期等信息,通过DHCP Offer报文广播回应客户端(此时客户端仍无 IP,服务器用自身 IP 作为源 IP)。
DHCP Request(请求阶段)
- 客户端若收到多个服务器的Offer,通常选择第一个回应的服务器,然后广播发送DHCP Request报文,明确请求使用该服务器分配的 IP,并告知其他服务器无需提供。
DHCP Acknowledge(确认阶段)
- 被选中的 DHCP 服务器收到Request后,广播发送DHCP Acknowledge报文,确认该 IP 地址分配给客户端,并包含最终的网络配置参数。
- 客户端收到确认后,即可使用分配的 IP 地址及参数接入网络
DHCP 的优势
- 简化网络管理:减少手动配置 IP 的工作量,降低人为错误(如 IP 冲突)。
- 提高灵活性:设备移动时自动获取新子网的 IP,无需重新配置。
- 节省 IP 资源:通过租期回收闲置 IP,避免地址浪费。
dhcp-server服务端配置
-
dhcp软件包安装: dnf -y install dhcp-server
-
dhcp配置文件:/usr/share/doc/dhcp-*/dhcpd.conf.example放到/etc/dhcp/dhcp.conf
-
dhcop -t:验证配置文件语法,echo$? 输出0代表没有问题
-
dhcpd配置文件:
[root@server ~]# cat /etc/dhcp/dhcpd.conf
# A slightly different configuration for an internal subnet.
#配置网段,子网掩码
subnet 10.1.8.0 netmask 255.255.255.0 {
#分配范围
range 10.1.8.150 10.1.8.254;
#DNS
option domain-name-servers 223.5.5.5,223.6.6.6;
#域名
option domain-name "zhiqiang.cloud";
#路由网关
option routers 10.1.8.2;
#广播域
option broadcast-address 10.1.8.255;
#使用最少时间
default-lease-time 600;
#使用最大时间
max-lease-time 7200;
}
# 设置静态地址,动态地址不用分配
# 分配客户端主机
host client {
#客户端MAC地址
hardware ethernet 00:0c:29:a4:5f:a8;
#指定分配IP地址:
fixed-address 10.1.8.122;
}
DNS服务器
DNS(Domain Name System,域名系统)是互联网的核心基础设施之一,其核心作用是将人类易记的域名(如www.baidu.com)转换为计算机可识别的 IP 地址(如180.101.50.242),实现域名与 IP 地址的映射,从而让用户无需记忆复杂的 IP 地址即可访问网络资源。
DNS 服务器的工作原理
1. DNS 的层级结构
DNS 服务器按层级划分,形成树状结构,从上到下依次为:
- 根域名服务器(Root Server):全球共 13 组(以字母 A-M 命名),负责管理顶级域名服务器的地址,是 DNS 解析的起点。
- 顶级域名服务器(TLD Server):管理顶级域名(如.com、.org、.cn、.net),记录下一级域名服务器的地址。
- 权威域名服务器(Authoritative Server):负责管理某个具体域名(如baidu.com)的解析记录,是域名解析的 “最终答案” 来源。
- 本地 DNS 服务器(Local DNS):由用户的 ISP(网络服务提供商,如电信、联通)或企业 / 家庭路由器提供,是用户设备首先查询的服务器,会缓存解析结果以提高效率。
2. DNS 解析的完整流程(以访问www.baidu.com为例)
本地缓存查询
- 用户在浏览器输入www.baidu.com后,设备首先检查本地缓存(包括浏览器缓存、操作系统缓存)。若之前解析过该域名,直接使用缓存的 IP 地址,无需后续步骤。
本地 DNS 服务器查询
- 若本地缓存无结果,设备向本地 DNS 服务器(如路由器或 ISP 提供的 DNS,如114.114.114.114)发送查询请求。
- 本地 DNS 服务器先检查自身缓存,若有记录则直接返回 IP;若无,则进入层级查询。
根域名服务器查询
- 本地 DNS 服务器向根域名服务器发送查询请求。根服务器不直接解析域名,但会返回.com顶级域名服务器的 IP 地址。
顶级域名服务器查询
- 本地 DNS 服务器向.com顶级域名服务器发送请求,顶级服务器返回baidu.com对应的权威域名服务器的 IP 地址。
权威域名服务器查询
- 本地 DNS 服务器向baidu.com的权威域名服务器发送请求,权威服务器返回www.baidu.com对应的 IP 地址(如180.101.50.242)。
结果返回与缓存
- 本地 DNS 服务器将 IP 地址返回给用户设备,并将结果缓存(缓存时间由域名的 TTL 参数决定,通常为几分钟到几小时)。
- 用户设备收到 IP 后,缓存该结果,并通过 IP 地址与目标服务器建立连接。
-
安装软件包: dnf install -y bind bind-utils
-
配置文件: /etc/named.conf
[root@server ~]# cat /etc/named.conf
…
…
options {
listen-on port 53 { 127.0.0.1;10.1.8.10; };
listen-on-v6 port 53 { ::1; };
directory "/var/named";
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
memstatistics-file "/var/named/data/named_mem_stats.txt";
secroots-file"/var/named/data/named.secroots";
recursing-file"/var/named/data/named.recursing";
//allow-query { localhost; };
allow-query { any; };
…
…
# 也可结合acl使用:acl允许可访问的主机
# acl:定义网段/主机允许访问
…
…
[root@server ~]# cat /etc/named.conf
acl interfaces { 127.0.0.1;10.1.8.10; }
acl interfacesv6 { ::1; 2001:db8:2020::5300; }
options {
listen-on port 53 { interfaces; };
listen-on-v6 port 53 { interfacesv6; };
directory "/var/named";
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
memstatistics-file "/var/named/data/named_mem_stats.txt";
secroots-file"/var/named/data/named.secroots";
recursing-file"/var/named/data/named.recursing";
//allow-query { localhost; };
allow-query { any; };
…
…
配置主机dns解析
[root@server ~]# cat /etc/named.conf
# 正向解析:
# 输入解析域名
zone "zhiqiang.cloud" IN {
type master;
# 解析域名的文件
file "zhiqiang.cloud.zone";
# allow-transfer {10.1.8.21;}; # 允许谁来下载我的数据库文件
};
# 反向解析
# 输入解析的反向IP地址:.in-addr.arpa固定格式
zone "8.1.10.in-addr.arpa" IN {
type master;
# 解析域名的文件
file "8.1.10.zone";
};
# 正向解析文件
[root@server ~]# vim /var/named/zhiqiang.cloud.zone
$TTL 1D # 解析域的主机完整名称 # 邮箱
@ IN SOA server.zhiqiang.cloud. root.zhiqiang.cloud. (
0 ; serial #
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
# 提供这个域的DNS服务器
IN NS server.zhiqiang.cloud.
# 将名称映射给ip
server IN A 10.1.8.10
dns IN A 10.1.8.10
client IN A 10.1.8.11
# 给指定主机起别名
student IN CNAME client.zhiqiang.cloud.
www IN A 10.1.8.200
# 邮箱服务器,指定使用的接收文件的邮箱
@ IN MX 10 mail.zhiqiang.cloud.
mail IN A 10.1.8.253
# 反向解析文件
[root@server ~]# vim /var/named/8.1.10.zone
$TTL 1D # 解析域的主机完整名称
@ IN SOA server.zhiqiang.cloud. root.zhiqiang.cloud. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
# 提供这个域的DNS服务器
IN NS server.zhiqiang.cloud.
# PTR 用于反向解析DNS
10 IN PTR server.zhiqiang.cloud.
10 IN PTR dns.zhiqiang.cloud.
11 IN PTR student.zhiqiang.cloud.
11 IN PTR client.zhiqiang.cloud.
100 IN PTR ns1.zhiqiang.cloud.
200 IN PTR www.zhiqiang.cloud.
253 IN PTR mail.zhiqiang.cloud.
# zone 文件需要named组拥有读写权限
[root@server ~]# chown root:named /var/named/*.zone
# 检查named zone 文件
[root@server ~]# named-checkzone zhiqiang.cloud \\n /var/named/zhiqiang.cloud.zone
[root@server ~]# named-checkzone zhiqiang.cloud \\n /var/named/zhiqiang.cloud.zone
zone zhiqiang.cloud/IN: loaded serial 0
OK
# 检查named conf 文件
[root@server ~]# named-checkconf /etc/named.conf
# 重启服务
[root@server ~]# systemctl restart named
vsftp服务器
vsftpd(Very Secure FTP Daemon)是一款运行在 Linux 系统上的轻量、安全、高效的 FTP(File Transfer Protocol,文件传输协议)服务器软件,主要用于在客户端与服务器之间通过网络传输文件(上传、下载)。其核心设计目标是安全性和稳定性,广泛应用于企业和个人的文件共享场景。
vsftpd 的核心原理
vsftpd 基于 FTP 协议工作,通过客户端与服务器之间的命令交互和数据传输,实现文件的上传、下载、删除、重命名等操作。FTP 协议采用双连接模式,即 “命令连接” 和 “数据连接” 分离,这是理解其工作原理的关键
vsftp服务配置
# 安装软件包
[root@server ftp]# dnf -y install vsftpd
[root@server ftp]# systemctl enable vsftpd.service –now
# 配置文件配置
[root@server ftp]# cat /etc/vsftpd/vsftpd.conf
# 允许匿名用户登录
anonymous_enable=YES
#
local_enable=YES
#
write_enable=YES
# 本地用户传输umask
local_umask=022
# 允许上传文件
anon_upload_enable=YES
# 允许读写目录
anon_mkdir_write_enable=YES
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
# 监听
listen=NO
# 监听ipv6
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES
# 设置ftp共享目录,默认值为/var/ftp
local_root=/var/ftp
# 启用用户登录清单
userlist_enable=YES
# 指定用户清单文件位置,该文件中用户禁止登录
# 默认/etc/vsftpd/ftpusers和/etc/vsftpd/user_list中的用户都无法登录
userlist_file=/etc/vsftpd/user_list
# 允许用户读写重命名
anon_other_write_enable=YES
# 重启vsftpd服务
[root@server ftp]# systemctl restart vsftpd.service
NFS服务器
NFS(Network File System,网络文件系统)是一种基于 TCP/IP 协议的网络文件共享协议,允许不同操作系统的计算机(主要是类 Unix 系统,如 Linux、Solaris)通过网络共享文件和目录,让远程主机可以像访问本地文件一样访问共享资源。其核心原理是通过远程过程调用(RPC,Remote Procedure Call) 实现跨网络的文件操作,简化分布式系统中的文件管理。
NFS 的核心原理
NFS 的工作依赖于客户端 – 服务器架构和RPC 协议,通过将远程文件系统挂载到本地,实现文件操作的透明化(用户无需感知文件位于远程服务器)。
服务端创建共享目录,并共享
#安装nfs软件包
[root@server ~]# dnf -y install nfs-untils
[root@server ~]# systemctl enable nfs –now
# 创建共享目录
[root@server ~]# mkdir /shares/web
# 共享目录
[root@server ~]# cat > /etc/exports << EOF
/shares/web 10.1.8.0/24(rw)
EOF
# 重启nfs服务
[root@server ~]# systemctl restart nfs-server.service
# 创建可读写的用户
[root@server ~]# useradd zhiqiang
# 修改指定用户读写权限
[root@server ~]# chown root:zhiqiang /shares/web
客户端挂载共享目录
# 安装nfs软件包
[root@client ~]# dnf -y install nfs-untils
# 查看服务端共享目录
[root@client ~]# showmount -e server
Export list for server:
/shares/web 10.1.8.0/24
# 创建挂载目录
[root@client ~]# mkdir /web
# 挂载服务端共享目录
[root@client ~]# mount -t nfs server:/shares/web
# 永久挂载
[root@client ~]# vim /etc/fstab
server:/shares/web /web nfs defaults 0 0
# 测试挂载目录
[root@client ~]# touch /web/1
ISCSI 服务器
iSCSI(Internet Small Computer System Interface,互联网小型计算机系统接口)是一种基于 TCP/IP 协议的存储网络技术,其核心原理是通过将 SCSI(小型计算机系统接口,用于本地存储设备通信的协议)命令封装到 IP 数据包中,实现远程存储设备(如硬盘、磁盘阵列)与主机之间的高效数据传输,让主机将远程存储识别为本地物理硬盘进行操作。
iSCSI 的核心目标
传统的 SCSI 协议仅支持本地存储设备(如主机直接连接的硬盘、U 盘),而 iSCSI 通过 IP 网络扩展了 SCSI 的应用范围,使主机可以通过以太网远程访问存储设备,实现 “存储设备网络化”,解决了传统本地存储难以扩展、不便共享的问题。
iSCSI 的工作原理(数据传输流程)
iSCSI 的工作流程可分为 “连接建立” 和 “数据传输” 两个阶段,核心是 SCSI 命令与 IP 协议的封装 / 解封装:
1. 连接建立阶段
目标端配置
- 管理员在 iSCSI 目标端创建共享存储:将物理硬盘(如/dev/sdb)或逻辑卷(如/dev/vg01/lv01)定义为 LUN,并关联到一个目标(Target),同时设置目标的 IQN、允许访问的发起端 IQN 及 CHAP 认证信息(可选)。
- 目标端启动 iSCSI 服务,监听 TCP 端口 3260(iSCSI 默认端口),等待发起端连接。
发起端发现目标
- 发起端通过 iSCSI 发起端软件(如 Linux 的iscsi-initiator-utils)发送 “目标发现” 请求,指定目标端的 IP 地址,查询可用的 iSCSI 目标。
- 目标端返回自身的 IQN 和 LUN 信息,发起端获取后记录目标端的 IQN 和 IP。
身份验证与连接建立
- 发起端向目标端的 3260 端口发起 TCP 连接,发送自身的 IQN 和 CHAP 认证信息(若目标端启用了认证)。
- 目标端验证发起端的 IQN 是否在允许列表中,且 CHAP 信息正确后,建立 TCP 连接,完成会话初始化。
2. 数据传输阶段
当发起端成功连接目标端后,对 LUN 的操作(如读写文件)会触发以下流程:
SCSI 命令封装
- 发起端的操作系统(如 Linux)对 “本地识别的 iSCSI 硬盘”(实际是目标端的 LUN)执行操作(如write写入数据),生成 SCSI 命令(如 “写入数据到 LUN 的某扇区”)。
- 发起端的 iSCSI 驱动将 SCSI 命令、数据及目标端 IQN 封装到 IP 数据包中(即 “iSCSI 报文”),通过 TCP 协议发送到目标端的 3260 端口。
IP 数据包传输
- iSCSI 报文通过以太网传输,支持普通以太网、千兆以太网甚至 10G 以太网,传输过程依赖 TCP 的可靠性(确保数据不丢失、有序到达)。
解封装与 SCSI 命令执行
- 目标端的 iSCSI 服务接收 IP 数据包,解封装出 SCSI 命令和数据,然后将 SCSI 命令发送到本地存储驱动(如硬盘控制器)。
- 存储驱动执行 SCSI 命令(如将数据写入物理硬盘的对应扇区),并生成执行结果(如 “写入成功”)。
响应返回
- 目标端将执行结果封装为 iSCSI 响应报文,通过 TCP 返回给发起端。
- 发起端解封装响应报文,将结果反馈给操作系统,完成一次数据传输。
ISCSI配置
服务端配置
# 安装软件包,启动服务
[root@server ~]# dnf install -y targetcli
[root@server ~]# systemctl enable target –now
# 进入交互式 targetcli
[root@server ~]# targetcli
/> ls
o- /
o- backstores # 配置共享的内容,需要自己创建,共享成块设备
| o- block # 共享的块
| o- fileio
| o- pscsi
| o- ramdisk
o- iscsi # 配置target可进行访问的客户和共享的指定块
o- loopback
# 创建可共享 lv 块
/backstores/block> create zhiqiang01 /dev/zhiqiang/zhiqiang01
Created block storage object zhiqiang01 using /dev/zhiqiang/zhiqiang01.
# 创建可共享的 dev 块
/backstores/block> create sdb /dev/sdb
4Created block storage object sdb using /dev/sdb
# 创建可共享配置模块,使用IQN表示,配置访问的客户和提供设备,访问端口,只允许一个客户端
/iscsi> create iqn.2025-04.cloud.zhiqiang.storage:zhiqiang01
Created target iqn.2025-04.cloud.zhiqiang.storage:zhiqiang01.
Created TPG 1.
Global pref auto_add_default_portal=true
Created default portal listening on all IPs (0.0.0.0), port 3260.
# tpg/luns/ 配置可以访问的块设备
/iscsi/iqn.20…iqiang01/tpg1> luns/ create /backstores/block/sdb
Created LUN 0.
# tpg/acls/ 配置允许访问的客户端
/iscsi/iqn.20…iqiang01/tpg1> acls/ create iqn.2025-04.cloud.zhiqiang:client
Created Node ACL for iqn.2025-04.cloud.zhiqiang:client
# tpg/ports 配置访问ip端口,可配置多个端口
/iscsi/iqn.20…iqiang01/tpg1> ports/ create 10.1.8.10 3260
Using default IP port 3260
Created network portal 10.1.8.10:3260
# exit保存退出
客户端配置
# 安装软件包
[root@client ~]# dnf -y install iscsi-initiator-utils
# 进行配置文件配置
[root@client ~]# cat /etc/iscsi/initiatorname.iscsi
InitiatorName=iqn.2025-04.cloud.zhiqiang:client
[root@client ~]# systemctl restart iscsi
# 寻找发现远程共享的目标 discovery:发现
# -m:模式 -t:发现的类型 -p: 寻找目标的ip以及端口
[root@client ~]# iscsiadm -m discovery -t sendtargets -p 10.1.8.10:3260
10.1.8.10:3260,1 iqn.2025-04.cloud.zhiqiang.storage:zhiqiang01
# -T:指定的iscsi的目标 -l:login登录目标
[root@client ~]# iscsiadm -m node -T iqn.2025-04.cloud.zhiqiang.storage:zhiqiang01 -l
Logging in to [iface: default, target: iqn.2025-04.cloud.zhiqiang.storage:zhiqiang01, portal: 10.1.8.10,3260]
Login to [iface: default, target: iqn.2025-04.cloud.zhiqiang.storage:zhiqiang01, portal: 10.1.8.10,3260] successful.
# 正常进行磁盘格式化挂载操作即可
[root@client ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 100G 0 disk
sdb 8:16 0 50G 0 disk
sr0 11:0 1 13.2G 0 rom /dvd
nvme0n1 259:0 0 100G 0 disk
├─nvme0n1p1 259:1 0 1G 0 part /boot
└─nvme0n1p2 259:2 0 99G 0 part
├─rl-root 253:0 0 61.2G 0 lvm /
├─rl-swap 253:1 0 7.9G 0 lvm [SWAP]
└─rl-home 253:2 0 29.9G 0 lvm /home
# 永久挂载: 不能使用default 需要defults,_netdev 且确保iscsid服务启动,使用uuid
[root@client ~]# cat /etc/fstab
UUID=12279361-55c7-4e7e-b880-994be047bcf4xfsdefaults,_netdev0 0
# 登录不上处理方法
# 断开连接,从iscsi注销
[root@client ~]# iscsiadm -m node -T iqn.2025- \\n 04.cloud.zhiqiang.storage:zhiqiang01 -p 10.1.8.10:3260 -u
Logging out of session [sid: 1, target: iqn.2025-04.cloud.zhiqiang.storage:zhiqiang01, portal: 10.1.8.10,3260]
Logout of [sid: 1, target: iqn.2025-04.cloud.zhiqiang.storage:zhiqiang01, portal: 10.1.8.10,3260] successful.
# 删除iscsi的本地记录
[root@client ~]# iscsiadm -m node -T iqn.2025- \\n 04.cloud.zhiqiang.storage:zhiqiang01 -p 10.1.8.10 -o delete
[root@client ~]# systemctl restart iscsid
# 当发现了目标却无法登录时,是因为iscsid服务缓存了之前客户端扫描时使用的IQN,因此需要停止ISCSI服务重新发现
多路径访问
# 寻找发现远程共享的目标 discovery:发现
# -m:模式 -t:发现的类型 -p: 寻找目标的ip以及端口
[root@client ~]# iscsiadm -m discovery -t sendtargets -p 10.1.8.10 -p \\n 10.1.1.11
# -T:指定的iscsi的目标 -l:login登录目标
[root@client ~]# iscsiadm -m node -T iqn.2025- \\n 04.cloud.zhiqiang.storage:zhiqiang01 -l
# 安装软件包
[root@server ~]# dnf install -y device-mapper-multipath
# 生成多路径文件
[root@client ~]# mpathconf –enable
# 已存在则修改文件内容
[root@client ~]# mpathconf –enable –with_multipathd y –with_chkconfig y
# 启动multipath服务
[root@client ~]# systemctl enable multipathd –now
# 挂载格式化多路径块, 固定在/dev/mapper/mpatha
[root@client ~]# mkfs.xfs /dev/mapper/mpatha
[root@client ~]# mount /dev/mapper/mpatha /data
# 监控多路径
[root@client ~]# multipath -ll
mpatha (36001405ef96fbed88694d19aa7dbcfa8) dm-3 LIO-ORG,zhiqiang01
size=50G features='0' hwhandler='1 alua' wp=rw
|-+- policy='service-time 0' prio=50 status=active
| `- 2:0:0:0 sda 8:0 active ready running
`-+- policy='service-time 0' prio=50 status=enabled
`- 3:0:0:0 sdb 8:16 active ready running
web服务器
服务器配置http
# 防火墙,selinux默认关闭
# 安装软件包
[root@server ~]# dnf -y install httpd
# 启动服务器
[root@server ~]# systemctl enable httpd
# hosts添加域名解析
[root@server ~]# echo '10.1.8.10 server.zhiqiang.cloud' > /etc/hosts
# 准备web主页
[root@server ~]# echo 'Welcome to my apache' > /var/www/html/index.html
# 客户端hosts添加域名解析
# C:\\Windows\\System32\\drivers\\etc/hosts
# 10.1.8.10 server.zhiqiang.cloud
# 配置文件位置
/etc/httpd/conf/httpd.conf
# 定义网站主目录位置
DocumentRoot "/var/www/html"
# 定义配置文件所在位置
ServerRoot "/etc/httpd"
# 定义 从 配置文件
Include conf.modules.d/*.conf
# 定义目录中主页文件名
<IfModule dir_module>
DirectoryIndex index.html
</IfModule>
# Userdir 可共享家目录主页
# 如需要访问root需要在加一次 <Directory "/root/public_html">
[root@server ~]# cat /etc/httpd/conf.d/userdir.conf
<IfModule mod_userdir.c>
UserDir enabled
UserDir public_html
</IfModule>
<Directory "/home/*/public_html">
AllowOverride FileInfo AuthConfig Limit Indexes
Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
Require method GET POST OPTIONS
</Directory>
# 重启服务器
[root@server ~]# systemctl restart httpd
# 准备测试页
[root@server ~]# useradd zhiqiang
[root@server ~]# mkdir /home/zhiqiang/public_html
[root@server ~]# chmod 711 /home/laoma
[root@server ~]# chmod 755 /home/laoma/public_html
[root@server ~]# cat << 'EOF' > /home/laoma/public_html/index.html
<html>
<body>
<div style="width: 100%; font-size: 40px; font-weight: bold; text-align: laomaer;">
UserDir Test Page
</div>
</body>
</html>
EOF
虚拟主机
# 基于主机名的虚拟主机
# 进行配置文件配置
[root@server www1]# cat > /etc/httpd/conf.d/vhost-www1.conf << EOF
# for www1 virtual domain
<VirtualHost *:80>
DocumentRoot /var/www/www1/ # 主页位置
ServerName www1.zhiqiang.cloud # 主机名称
ServerAdmin www1@zhiqiang.cloud # 服务器管理员
ErrorLog logs/www1.zhiqiang.cloud-error_log
CustomLog logs/www1.zhiqiang.cloud-access_log combined
</VirtualHost>
<Directory "/var/www/www1">
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
EOF
[root@server www1]# cat /etc/httpd/conf.d/vhost-www2.conf
# for www2 virtual domain
<VirtualHost *:80> # 监听端口号
DocumentRoot /var/www/www2/
ServerName www2.zhiqiang.cloud
ServerAdmin www2@zhiqiang.cloud
ErrorLog logs/www2.zhiqiang.cloud-error_log
CustomLog logs/www2.zhiqiang.cloud-access_log combined
</VirtualHost>
<Directory "/var/www/www2">
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
# 准备测试页
[root@server ~]# mkdir /var/www/www1
[root@server ~]# mkdir /var/www/www2
[root@server ~]# echo hello www1 > /var/www/www1/index.html
[root@server ~]# echo hello www2 > /var/www/www2/index.html
# 在windows与linux的hosts中写入域名解析
[root@server ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
10.1.8.10 server.zhiqiang.cloud
10.1.8.10 www1.zhiqiang.cloud
10.1.8.10 www2.zhiqiang.cloud
# 重启服务
[root@server ~]# systemctl restart httpd
# 测试访问
[root@server www1]# curl http://www2.zhiqiang.cloud/
hello www2
# 基于端口的虚拟主机
# 配置端口配置文件
[root@server ~]# cat /etc/httpd/conf.d/vhost-port.conf
Listen 8081 监听端口
<VirtualHost *:8081>
ServerAdmin site1@zhiqiang.cloud
DocumentRoot "/var/www/site1"
ServerName server.zhiqiang.cloud
ErrorLog "/var/log/httpd/site1.zhiqiang.cloud-error_log"
CustomLog "/var/log/httpd/site1.zhiqiang.cloud-access_log" common
</VirtualHost>
<Directory "/var/www/site1">
AllowOverride None
Require all granted
</Directory>
Listen 8082
<VirtualHost *:8082>
ServerAdmin site2@zhiqiang.cloud
DocumentRoot "/var/www/site2"
ServerName server.zhiqiang.cloud
ErrorLog "/var/log/httpd/site2.zhiqiang.cloud-error_log"
CustomLog "/var/log/httpd/site2.zhiqiang.cloud-access_log" common
</VirtualHost>
<Directory "/var/www/site2">
AllowOverride None
Require all granted
</Directory>
# 准备测试页
[root@server ~]# mkdir site1
[root@server ~]# mkdir site2
[root@server ~]# echo 'hello site1' > /var/www/site1/index.html
[root@server ~]# echo 'hello site2' > /var/www/site2/index.html
# 重启服务
[root@server ~]# systemctl restart httpd
# 测试端口虚拟机
[root@server ~]# curl server.zhiqiang.cloud:8081
hello site1
配置SSL/TLS
# 安装相应软件包
[root@server certs]# dnf -y install mod_ssl
# 配置文件配置
[root@server certs]# cat > /etc/httpd/conf.d/vhost-ssl.conf << EOF
<VirtualHost _default_:443>
DocumentRoot "/var/www/html"
ServerName server.zhiqiang.cloud:443
#使用私钥签名的证书
SSLCertificateFile /etc/ssl/certs/server.zhiqiang.cloud/server.crt
#私钥
SSLCertificateKeyFile /etc/ssl/certs/server.zhiqiang.cloud/server.key
</VirtualHost>
EOF
# 创建证书目录
[root@server certs]# mkdir /etc/ssl/certs
[root@server certs]# mkdir /etc/ssl/certs/server.zhiqiang.cloud
# 创建私钥
[root@server server.zhiqiang.cloud]# openssl genrsa -out server.key 2048
# 创建请求文件csr,该文件需要签名
[root@server server.zhiqiang.cloud]# openssl req -new -key server.key -out server.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
—–
# 所在国家
Country Name (2 letter code) [XX]:CN
# 所在省份
State or Province Name (full name) []:JS
# 所在城市
Locality Name (eg, city) [Default City]:NJ
# 所在公司
Organization Name (eg, company) [Default Company Ltd]:LM
# 所在部门
Organizational Unit Name (eg, section) []:DEVOPS
# 请求域名
Common Name (eg, your name or your server's hostname) []:server.zhiqiang.cloud
# 邮件地址
Email Address []:zhiqiang@zhiqiang.cloud
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
# 使用私钥对请求文件签名,生成证书
[root@server server.zhiqiang.cloud]# openssl x509 -req -days 3650 -in server.csr -signkey server.key -out server.crt
# 重启服务
[root@server ~]# systemctl restart httpd
# 测试网页
[root@server ~]# curl -k https://server.zhiqiang.cloud
# 重定向http到https
[root@server ~]# vim /etc/httpd/conf.d/vhost-Rewrite.conf
<VirtualHost *:80>
DocumentRoot /var/www/html
ServerName server.zhiqiang.cloud
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
</VirtualHost>
配置nginx
Nginx是一款高性能的 HTTP 和反向代理服务器,同时也支持 IMAP/POP3/SMTP 代理,其核心优势在于高并发处理能力、低内存占用和模块化设计,广泛应用于静态资源托管、负载均衡、反向代理、动静分离等场景。
Nginx 的核心原理
Nginx 的高性能得益于其独特的事件驱动架构和异步非阻塞 IO 模型,这使其能够在单机上高效处理数万甚至数十万并发连接,而不会像传统服务器(如 Apache 的 prefork 模型)那样因进程 / 线程切换导致性能损耗。
1. 架构设计:多进程模型
Nginx 启动后会生成三种进程,协同完成请求处理:
-
主进程(Master Process):
负责管理工作进程和信号处理,不直接处理客户端请求。主要功能包括:读取配置文件、初始化服务、创建工作进程、接收外界信号(如重启、停止)并转发给工作进程、监控工作进程状态(若工作进程异常退出,会自动重启新的工作进程)。
主进程通常以 root 用户运行(便于监听 80、443 等特权端口)。 -
工作进程(Worker Process):
由主进程创建(数量可在配置文件中设置,通常与 CPU 核心数一致),是实际处理客户端请求的进程。所有工作进程平等竞争客户端连接,通过共享内存实现进程间的配置信息同步。
工作进程以非 root 用户(如nginx用户)运行,降低安全风险。 -
缓存加载进程(Cache Loader Process):
可选进程,启动时加载磁盘上的缓存元数据到内存,完成后自动退出,不参与请求处理。 -
缓存管理进程(Cache Manager Process):
可选进程,定期清理过期的缓存文件,确保缓存目录不会占满磁盘空间。
2. 事件驱动与异步非阻塞 IO
Nginx 的高并发能力核心在于事件驱动(Event-Driven) 和异步非阻塞 IO 模型,具体表现为:
-
传统服务器的问题:
传统服务器(如 Apache 的 prefork 模型)为每个连接创建一个进程或线程,当并发量过高时,进程 / 线程切换会消耗大量 CPU 和内存资源,导致性能急剧下降(“C10K 问题”)。 -
Nginx 的解决方案:
Nginx 的工作进程采用 “一个进程处理多个连接” 的模式,通过事件驱动机制高效管理连接: - 事件监听:工作进程通过epoll(Linux)、kqueue(FreeBSD)、select等 IO 多路复用技术,同时监听多个客户端连接的事件(如 “连接建立”“数据可读”“数据可写”)。
- 非阻塞处理:当某个连接需要等待 IO 操作(如读取磁盘文件、等待后端服务器响应)时,工作进程不会阻塞等待,而是继续处理其他就绪的连接事件,直到该 IO 操作完成后再回头处理(通过回调函数触发)。
- 高效切换:通过事件驱动框架,工作进程在不同连接的事件间快速切换,几乎没有进程 / 线程切换的开销,因此能同时处理数万并发连接。
3. 请求处理流程
客户端请求到达 Nginx 后,处理流程可分为以下步骤:
连接建立:
客户端通过 TCP 协议与 Nginx 的监听端口(如 80、443)建立连接,Nginx 的工作进程通过 IO 多路复用机制感知 “连接建立” 事件。
请求解析:
工作进程读取客户端发送的 HTTP 请求(如请求方法、URL、头部信息),根据配置文件中的server块(虚拟主机配置)匹配对应的站点(如根据server_name匹配www.example.com)。
路由与处理:
根据请求的 URL 和配置文件中的location块,决定请求的处理方式:
- 静态资源(如 HTML、CSS、图片):Nginx 直接从磁盘读取文件,通过非阻塞 IO 发送给客户端。
- 反向代理:Nginx 作为代理,将请求转发给后端应用服务器(如 Tomcat、Node.js),等待后端响应后再返回给客户端(转发过程同样采用异步非阻塞模式)。
- 负载均衡:若配置了多个后端服务器,Nginx 通过预设算法(如轮询、IP 哈希、权重)选择一个后端服务器转发请求,实现流量分发。
响应发送:
处理完成后,Nginx 将响应数据(静态文件内容或后端返回的结果)通过 TCP 连接发送给客户端,发送完成后关闭连接(或保持长连接,由keepalive配置决定)。
4. 模块化设计
Nginx 的功能扩展依赖于模块化架构,核心模块和第三方模块共同构成其功能体系:
- 核心模块:如 HTTP 模块(处理 HTTP 请求)、事件模块(管理事件驱动)、配置模块(解析配置文件)。
- 功能模块:如反向代理模块(ngx_http_proxy_module)、负载均衡模块(ngx_http_upstream_module)、Gzip 压缩模块(ngx_http_gzip_module)、SSL 模块(ngx_http_ssl_module)。
- 第三方模块:可通过编译安装扩展功能,如防盗链、图片处理、Lua 脚本支持(ngx_http_lua_module)等。
模块化设计使 Nginx 轻量且灵活,用户可根据需求裁剪功能,减少资源占用。
配置nginx
# 安装服务包
[root@server ~]# dnf -y install nginx
# 查看配置文件
[root@server ~]# cat /etc/nginx/conf/nginx/conf
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
# Load dynamic modules. See /usr/share/doc/nginx/README.dynamic.
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024;
}
# 添加 autoindex on;参数可开启目录索引,访问目录
http {
log_format main '$remote_addr – $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
# 日志文件位置
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
# 默认目录配置下的配置文件均生效
include /etc/nginx/conf.d/*.conf;
server {
listen 80 default_server;
listen [::]:80 default_server;
# 服务域名称
server_name _;
# 默认访问目录
root /usr/share/nginx/html;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
location / {
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
}
# 根据域名提供多个访问站点
[root@server ~]# cat /etc/nginx/conf.d/vhost-web.conf
server {
server_name web1.zhiqiang.cloud;
root /usr/share/nginx/server1/;
}
server {
server_name web2.zhiqiang.cloud;
root /usr/share/nginx/server2/;
}
# 准备相应目录及访问网页
[root@server ~]# mkdir /usr/share/nginx/server1/
[root@server ~]# mkdir /usr/share/nginx/server2/
[root@server ~]# echo "Welcome to my web1" > /usr/share/nginx/server1/index.html
[root@server ~]# echo "Welcome to my web2" > /usr/share/nginx/server2/index.html
# 基于端口配置多站点访问
[root@server ~]# cat /etc/nginx/conf.d/vhost-port.conf
server {
listen 8081;
server_name server.zhiqiang.cloud;
root /usr/share/nginx/server1/;
}
server {
listen 8082;
server_name server.zhiqiang.cloud;
root /usr/share/nginx/server2/;
}
评论前必须登录!
注册