云计算百科
云计算领域专业知识百科平台

linux 常见服务器及配置

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/;
    }

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » linux 常见服务器及配置
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!