linux 常见服务器及配置

DHCP服务器

DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)是一种运行在应用层的网络协议,主要用于为局域网内的设备(如计算机、手机、物联网设备等)自动分配 IP 地址及其他网络配置参数,简化网络管理并避免 IP 地址冲突。

DHCP 的核心作用

  • 自动分配 IP 地址:无需管理员手动为每个设备设置 IP,DHCP 服务器会从预设的 IP 地址池中自动分配一个未被使用的 IP 给设备。
  • 统一配置网络参数:除 IP 地址外,还能自动分配子网掩码、默认网关、DNS 服务器地址、域名等关键网络参数,确保设备接入网络后可直接通信。
  • 高效管理 IP 资源:通过租期管理(IP 地址的使用期限),自动回收闲置 IP,提高 IP 地址利用率,尤其适用于设备频繁接入 / 断开的场景(如公共场所 WiFi)。

DHCP 的工作原理(四步握手过程)

设备接入网络后,通过以下四个步骤获取网络配置,称为 “DHCP 会话”:

  1. DHCP Discover(发现阶段)

    • 新接入的设备(客户端)在网络中广播发送DHCP Discover报文,寻找可用的 DHCP 服务器(此时客户端无 IP 地址,源 IP 为0.0.0.0,目标 IP 为255.255.255.255)。
  2. DHCP Offer(提供阶段)

    • 收到广播的 DHCP 服务器,从自身的 IP 地址池中选择一个未分配的 IP,连同子网掩码、网关、租期等信息,通过DHCP Offer报文广播回应客户端(此时客户端仍无 IP,服务器用自身 IP 作为源 IP)。
  3. DHCP Request(请求阶段)

    • 客户端若收到多个服务器的Offer,通常选择第一个回应的服务器,然后广播发送DHCP Request报文,明确请求使用该服务器分配的 IP,并告知其他服务器无需提供。
  4. 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为例)
  1. 本地缓存查询

    • 用户在浏览器输入www.baidu.com后,设备首先检查本地缓存(包括浏览器缓存、操作系统缓存)。若之前解析过该域名,直接使用缓存的 IP 地址,无需后续步骤。
  2. 本地 DNS 服务器查询

    • 若本地缓存无结果,设备向本地 DNS 服务器(如路由器或 ISP 提供的 DNS,如114.114.114.114)发送查询请求。
    • 本地 DNS 服务器先检查自身缓存,若有记录则直接返回 IP;若无,则进入层级查询。
  3. 根域名服务器查询

    • 本地 DNS 服务器向根域名服务器发送查询请求。根服务器不直接解析域名,但会返回.com顶级域名服务器的 IP 地址。
  4. 顶级域名服务器查询

    • 本地 DNS 服务器向.com顶级域名服务器发送请求,顶级服务器返回baidu.com对应的权威域名服务器的 IP 地址。
  5. 权威域名服务器查询

    • 本地 DNS 服务器向baidu.com的权威域名服务器发送请求,权威服务器返回www.baidu.com对应的 IP 地址(如180.101.50.242)。
  6. 结果返回与缓存

    • 本地 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. 连接建立阶段
  1. 目标端配置

    • 管理员在 iSCSI 目标端创建共享存储:将物理硬盘(如/dev/sdb)或逻辑卷(如/dev/vg01/lv01)定义为 LUN,并关联到一个目标(Target),同时设置目标的 IQN、允许访问的发起端 IQN 及 CHAP 认证信息(可选)。
    • 目标端启动 iSCSI 服务,监听 TCP 端口 3260(iSCSI 默认端口),等待发起端连接。
  2. 发起端发现目标

    • 发起端通过 iSCSI 发起端软件(如 Linux 的iscsi-initiator-utils)发送 “目标发现” 请求,指定目标端的 IP 地址,查询可用的 iSCSI 目标。
    • 目标端返回自身的 IQN 和 LUN 信息,发起端获取后记录目标端的 IQN 和 IP。
  3. 身份验证与连接建立

    • 发起端向目标端的 3260 端口发起 TCP 连接,发送自身的 IQN 和 CHAP 认证信息(若目标端启用了认证)。
    • 目标端验证发起端的 IQN 是否在允许列表中,且 CHAP 信息正确后,建立 TCP 连接,完成会话初始化。
2. 数据传输阶段

当发起端成功连接目标端后,对 LUN 的操作(如读写文件)会触发以下流程:

  1. SCSI 命令封装

    • 发起端的操作系统(如 Linux)对 “本地识别的 iSCSI 硬盘”(实际是目标端的 LUN)执行操作(如write写入数据),生成 SCSI 命令(如 “写入数据到 LUN 的某扇区”)。
    • 发起端的 iSCSI 驱动将 SCSI 命令、数据及目标端 IQN 封装到 IP 数据包中(即 “iSCSI 报文”),通过 TCP 协议发送到目标端的 3260 端口。
  2. IP 数据包传输

    • iSCSI 报文通过以太网传输,支持普通以太网、千兆以太网甚至 10G 以太网,传输过程依赖 TCP 的可靠性(确保数据不丢失、有序到达)。
  3. 解封装与 SCSI 命令执行

    • 目标端的 iSCSI 服务接收 IP 数据包,解封装出 SCSI 命令和数据,然后将 SCSI 命令发送到本地存储驱动(如硬盘控制器)。
    • 存储驱动执行 SCSI 命令(如将数据写入物理硬盘的对应扇区),并生成执行结果(如 “写入成功”)。
  4. 响应返回

    • 目标端将执行结果封装为 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-994be047bcf4	xfs	defaults,_netdev	0 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 的工作进程采用 “一个进程处理多个连接” 的模式,通过事件驱动机制高效管理连接:

    1. 事件监听:工作进程通过epoll(Linux)、kqueue(FreeBSD)、select等 IO 多路复用技术,同时监听多个客户端连接的事件(如 “连接建立”“数据可读”“数据可写”)。
    2. 非阻塞处理:当某个连接需要等待 IO 操作(如读取磁盘文件、等待后端服务器响应)时,工作进程不会阻塞等待,而是继续处理其他就绪的连接事件,直到该 IO 操作完成后再回头处理(通过回调函数触发)。
    3. 高效切换:通过事件驱动框架,工作进程在不同连接的事件间快速切换,几乎没有进程 / 线程切换的开销,因此能同时处理数万并发连接。
3. 请求处理流程

客户端请求到达 Nginx 后,处理流程可分为以下步骤:

  1. 连接建立
    客户端通过 TCP 协议与 Nginx 的监听端口(如 80、443)建立连接,Nginx 的工作进程通过 IO 多路复用机制感知 “连接建立” 事件。

  2. 请求解析
    工作进程读取客户端发送的 HTTP 请求(如请求方法、URL、头部信息),根据配置文件中的server块(虚拟主机配置)匹配对应的站点(如根据server_name匹配www.example.com)。

  3. 路由与处理
    根据请求的 URL 和配置文件中的location块,决定请求的处理方式:

    • 静态资源(如 HTML、CSS、图片):Nginx 直接从磁盘读取文件,通过非阻塞 IO 发送给客户端。
    • 反向代理:Nginx 作为代理,将请求转发给后端应用服务器(如 Tomcat、Node.js),等待后端响应后再返回给客户端(转发过程同样采用异步非阻塞模式)。
    • 负载均衡:若配置了多个后端服务器,Nginx 通过预设算法(如轮询、IP 哈希、权重)选择一个后端服务器转发请求,实现流量分发。
  4. 响应发送
    处理完成后,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/;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值