满分方案!手把手教你用LNMP搭建轻量化博客平台

满分方案!手把手教你用LNMP搭建轻量化博客平台

摘要:针对LNMP搭建博客平台实训考核模拟题,完整记录整套落地流程。从项目需求背景切入,依次完成Linux基础环境、Nginx服务、MySQL数据库、PHP解析环境部署,实操博客站点、反向代理、负载均衡、数据备份等高可用配套模块,所有配置附带验证步骤,是适配课程阶段考核的完整实操参考文档。

一、项目背景

在内容消费与创作需求爆发的当下,博客平台已成为个人知识分享、品牌内容沉淀与垂直领域社群构建的核心载体。随着全球博客创作者规模预计 2025 年突破 5 亿人,个人博主与中小型内容团队亟需通过轻量化博客平台打破流量获取的渠道限制与技术开发的门槛壁垒。

LNMP(Linux+Nginx+MySQL+PHP)架构凭借其开源免费、稳定高效的特性,成为构建轻量化博客平台的理想技术方案。该技术组合不仅能有效降低 70% 以上的初期部署成本,其完善的生态系统还支持快速集成文章编辑、评论互动、内容检索等核心功能,完美契合日均万级访问量的博客运营需求。

二、项目内容

  1. 博客平台部署
  2. 博客平台维护

三、实验环境

(一)实验拓扑

(二)主机清单

主机名 IP 地址 角色
ha1.linux.com 10.1.8.41 负载均衡器和高可用服务器-1
ha2.linux.com 10.1.8.42 负载均衡器和高可用服务器-2
proxy1.linux.com 10.1.8.43 代理服务器-1
proxy2.linux.com 10.1.8.44 代理服务器-2
company1.linux.com 10.1.8.45 公司站点服务器-1
company2.linux.com 10.1.8.46 公司站点服务器-2
blog1.linux.com 10.1.8.47 博客站点服务器-1
blog2.linux.com 10.1.8.48 博客站点服务器-2
db1.linux.com 10.1.8.49 数据库服务器-1
db2.linux.com 10.1.8.50 数据库服务器-2
storage.linux.com 10.1.8.51 存储服务器(NFS、iSCSI、yum仓库)
backup.linux.com 10.1.8.52 备份服务器(备份博客和数据库数据)
network.linux.com 10.1.8.53 网络服务器(DHCP、DNS)
client.linux.com 10.1.8.54 测试客户端
虚拟主机 IP 地址 角色
yum.linux.com 10.1.8.51 yum 仓库
dns.linux.com 10.1.8.53 DNS 服务器
<www.linux.com> 10.1.8.100 站点服务器

(三)/etc/hosts

bash 复制代码
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6


################# web cluster #################
10.1.8.41 ha1.linux.com ha1
10.1.8.42 ha2.linux.com ha2
10.1.8.43 proxy1.linux.com proxy1
10.1.8.44 proxy2.linux.com proxy2
10.1.8.45 company1.linux.com company1
10.1.8.46 company2.linux.com company2
10.1.8.47 blog1.linux.com blog1
10.1.8.48 blog2.linux.com blog2
10.1.8.49 db1.linux.com db1
10.1.8.50 db2.linux.com db2
10.1.8.51 storage.linux.com storage
10.1.8.51 yum.linux.com yum
10.1.8.52 backup.linux.com backup
10.1.8.53 network.linux.com network
10.1.8.53 dns.linux.com dns
10.1.8.54 client.linux.com client
10.1.8.100 www.linux.com www

(四)环境准备

按以下要求准备以上主机:

1.所有节点配置:

  • 最小化安装 CentOS 7。

  • 关闭 SELinux 和防火墙。

bash 复制代码
# 关闭 selinux
sed -i '/^SELINUX=/cSELINUX=disabled' /etc/selinux/config

# 关闭防火墙
systemctl disable firewalld --now
  • 确保时间准确。
bash 复制代码
#安装chrony,其他是另外一些工具
yum install -y bash-completion vim open-vm-tools lrzsz unzip rsync sshpass chrony
#确保chrony启动
systemctl enable chronyd --now
systemctl status chronyd
  • 删除系统自带的所有 yum 仓库(保留epel仓库)。
bash 复制代码
cp -a /etc/yum.repos.d/* /etc/backup
rm -rf /etc/yum.repos.d/*
mv /etc/backup/epel.repo /etc/yum.repos.d/
  • 网关设置为 10.1.8.2 ,DNS设置为 10.1.8.53network.linux.com 节点 DNS 设置为 223.5.5.5

  • 命令提示符设置为 PS1='[\u@\[\e[32m\]\h\[\e[0m\] \W \t]\$ '

    在 /etc/bashrc添加PS1='[\[\e[91m\]\u\[\e[93m\]@\[\e[92;1m\]\h\[\e[0m\] \[\e[94m\]\W\[\e[0m\] \[\e[35m\]\t\[\e[0m\]]\[\e[93m\]\$\[\e[0m\] '

bash 复制代码
cat >> /etc/bashrc <<'EOF'

#PS1 终端彩色提示符配置
PS1='[\[\e[91m\]\u\[\e[93m\]@\[\e[92;1m\]\h\[\e[0m\] \[\e[94m\]\W\[\e[0m\] \[\e[35m\]\t\[\e[0m\]]\[\e[93m\]\$\[\e[0m\] '

#HISTTIMEFORMAT 历史命令时间戳
HHISTTIMEFORMAT="%F %T "

EOF

2.storage.linux.com 节点额外配置 5 块、容量 20G 的 SATA 硬盘。

3.按以上要求配置主机名和IP地址。参考脚本:

bash 复制代码
#!/bin/bash


# 以 root 身份运行
[ $UID -ne 0 ] && echo 'Please run as root.' && exit 1 


# 指定接口名称
interface=ens33


# 指定域名称
domain=linux.com


# 脚本使用说明
usage (){
  echo "Usage: $0 41-44"
  exit 1
}


# 设置 IP 地址
function set_ip () {
  if [ $1 -eq 33 ];then
    dns=223.5.5.5
  else
    dns=10.1.8.53
  fi


  if [ $# -eq 0 ]; then
    usage   
  else
    nmcli connection modify ${interface} connection.autoconnect on ipv4.method manual ipv4.addresses 10.1.8.$1/24 ipv4.gateway 10.1.8.2 ipv4.dns $dns 
    nmcli connection up ${interface} &>/dev/null
  fi
}




# 设置主机名
function set_hostname () {
  # 获取主机名
  case $1 in
    41|42)
      HOSTNAME=ha$[ $1 - 40 ].$domain
      ;;
    43|44)
      HOSTNAME=proxy$[ $1 - 42 ].$domain
      ;;
    45|46)
      HOSTNAME=company$[ $1 - 44 ].$domain
      ;;
    47|48)
      HOSTNAME=blog$[ $1 - 46 ].$domain
      ;;
    49|50)
      HOSTNAME=db$[ $1 - 48 ].$domain
      ;;
    51)
      HOSTNAME=storage.$domain
      ;;
    52)
      HOSTNAME=backup.$domain
      ;;
    53)
      HOSTNAME=network.$domain
      ;;
    54)
      HOSTNAME=client.$domain
      ;;
    *)
      usage
      ;;
  esac
  # 设置主机名
  hostnamectl set-hostname $HOSTNAME
}


# 定义 main 函数调用功能函数
function main() {
  # 设置主机名
  set_hostname $1
  
  # 设置 IP
  set_ip $1


  # 显示修改结果
  bash -c 'clear;hostname;echo;ip -br a;echo'


  # 关机打快照
  while true
  do
    echo -ne "Press the \033[1;31mEnter\033[0;39m key, and the system will shut down in 5 seconds.";read
    echo -e "Press \033[1;35mCTRL+C\033[0;39m to cancel the shutdown."
    for i in {5..1}
    do
      echo "The system will shut down in $i seconds."
      sleep 1
    done
    echo "Shutdown system Now." && init 0
  done 
}


# 执行 main 函数
main $*

额外配置了一台controller节点,用于集中管理其他服务器。

四、考核内容

(一)配置-存储服务器

配置节点storage.linux.com

1.配置本地仓库。

  • 挂载 CentOS 7 光盘到 /usr/local/nginx/html/dvd 目录,并设置光盘开机自动挂载。
bash 复制代码
#-p 关键参数:递归创建多层目录
[root@storage ~ 15:09:17]# mkdir -p /usr/local/nginx/html/dvd

#/etc/fstab:Linux开机自动挂载配置文件
[root@storage ~ 15:12:09]# vim /etc/fstab

#查看
[root@storage ~ 15:14:16]# tail -1 /etc/fstab 
/dev/sr0 /usr/local/nginx/html/dvd iso9660 defaults        0 0

#读取 /etc/fstab 里所有配置,挂载所有未挂载的设备
[root@storage ~ 15:13:45]# mount -a
mount: /dev/sr0 写保护,将以只读方式挂载

#验证
[root@storage ~ 15:13:51]# df /usr/local/nginx/html/dvd/
文件系统         1K-块    已用  可用 已用% 挂载点
/dev/sr0       4635056 4635056     0  100% /usr/local/nginx/html/dvd
  • 配置仓库来源于 /usr/local/nginx/html/dvd 目录。
  • /etc/yum.repos.d/ 是 yum 仓库配置目录,目录下所有以 .repo 结尾的文件都会被 yum 识别为软件源配置;
    新建 dvd.repo,用来定义本地光盘 YUM 本地源。
bash 复制代码
[root@storage ~ 15:21:24]# vim /etc/yum.repos.d/dvd.repo
[dvd] #仓库 ID,唯一标识这个软件源,随便起名,中括号包裹。

name= dvd from local server #仓库描述名称,自定义文字,执行yum repolist时会显示这行名称。

baseurl=file:///usr/local/nginx/html/dvd #yum 软件包存放地址:file:// 代表本地文件系统协议(http:// 网络源、ftp://FTP 源、file:// 本地目录);

gpgcheck=0 #是否校验软件包数字签名:1:开启校验,需要导入官方 GPG 密钥;0:关闭校验,本地光盘源不需要密钥,直接跳过校验,安装更省事。

#读取所有 repo 文件,加载仓库元数据,列出所有可用 YUM 软件源及软件包数量。
[root@storage ~ 15:21:39]# yum repolist
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
dvd                                                                                              | 3.6 kB  00:00:00     
(1/2): dvd/group_gz                                                                              | 153 kB  00:00:00     
(2/2): dvd/primary_db                                                                            | 3.3 MB  00:00:00     
源标识                                 源名称                                                                     状态
dvd                                    dvd from local server                                                       4,070
epel/x86_64                            Extra Packages for Enterprise Linux 7 - x86_64                             13,791
repolist: 17,861

2.通过 nginx 提供 yum 仓库 。

bash 复制代码
#下载网络下载工具,用于网址拉取文件
[root@storage ~ 15:23:44]# yum install -y wget

#查看系统 DNS 解析配置文件
[root@storage ~ 15:25:19]# cat /etc/resolv.conf
# Generated by NetworkManager
search linux.com
nameserver 10.1.8.53

#先修改DNS为阿里云公共 DNS(公共外网 DNS,用来解析公网域名)
[root@storage ~ 15:27:04]# nmcli con modify ens33 ipv4.dns 223.5.5.5

#激活
[root@storage ~ 15:28:25]# nmcli con up ens33
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/3)

#用 wget 下载 Nginx 1.24 源码压缩包
[root@storage ~ 15:28:32]# wget https://www.laoma.cloud/course-materials/softwares/stage01/nginx-1.24.0.tar.gz
--2026-06-12 15:28:35--  https://www.laoma.cloud/course-materials/softwares/stage01/nginx-1.24.0.tar.gz
正在解析主机 www.laoma.cloud (www.laoma.cloud)... 8.159.134.206
正在连接 www.laoma.cloud (www.laoma.cloud)|8.159.134.206|:443... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:1112471 (1.1M) [application/octet-stream]
正在保存至: "nginx-1.24.0.tar.gz"

100%[==============================================================================>] 1,112,471    692KB/s 用时 1.6s   

2026-06-12 15:28:36 (692 KB/s) - 已保存 "nginx-1.24.0.tar.gz" [1112471/1112471])

#切回内网 DNS
[root@storage ~ 15:28:36]# nmcli con modify ens33 ipv4.dns 10.1.8.53
#激活
[root@storage ~ 15:28:54]# nmcli con up ens33
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/4)

#查看当前目录,确认源码压缩包下载成功存在。
[root@storage ~ 15:29:00]# ls nginx-1.24.0.tar.gz 
nginx-1.24.0.tar.gz

#编译 Nginx 必须的开发依赖包
[root@storage ~ 15:31:17]# yum install -y gcc make pcre-devel zlib-devel

#-x:解压;-f:指定文件
#解压 nginx 源码到同名文件夹
[root@storage ~ 15:33:39]# tar -xf nginx-1.24.0.tar.gz

#进入解压后的源码目录。
[root@storage ~ 15:34:45]# cd nginx-1.24.0/

#./configure:执行源码自带配置脚本,检查系统依赖、生成编译文件 Makefile;
#--prefix=/usr/local/nginx:指定安装路径,编译安装后所有文件统一放到该目录(自定义路径,不是系统 rpm 默认路径)。
[root@storage nginx-1.24.0 15:34:54]# ./configure --prefix=/usr/local/nginx

#源码编译两步合并:
#1.make:编译,根据 configure 生成的 Makefile 编译 C 代码生成二进制程序;
#2.make install:把编译好的程序、配置、网页、日志目录复制到 --prefix 指定的 /usr/local/nginx;
#&& 表示前面 make 执行成功,才会执行后面安装。
[root@storage nginx-1.24.0 15:38:13]# make && make install
......
cp conf/nginx.conf '/usr/local/nginx/conf/nginx.conf.default'
test -d '/usr/local/nginx/logs' \
	|| mkdir -p '/usr/local/nginx/logs'
test -d '/usr/local/nginx/logs' \
	|| mkdir -p '/usr/local/nginx/logs'
test -d '/usr/local/nginx/html' \
	|| cp -R html '/usr/local/nginx'
test -d '/usr/local/nginx/logs' \
	|| mkdir -p '/usr/local/nginx/logs'
make[1]: 离开目录"/root/nginx-1.24.0"

#查看 Nginx 安装目录
[root@storage nginx-1.24.0 15:38:13]# ls /usr/local/nginx/
conf  html  logs  sbin
  • 配置nginx通过systemd管理,并设置 nginx 服务开机启动。
bash 复制代码
#手动创建的 systemd 服务单元文件,用来让编译安装的 Nginx 支持 systemctl 管理(开机自启、start/stop/reload)。
[root@storage nginx-1.24.0 15:45:10]# vim /etc/systemd/system/nginx.service

[Unit] #[Unit] 区块:服务基础描述
Description=Nginx server deamon #Description:服务说明,执行 systemctl status nginx 时展示

[Service] #[Service] 区块:定义程序启停逻辑

#Type=forking
#Nginx 默认以守护进程(后台 fork 子进程)方式运行,必须配这个类型,否则 systemd 会误判服务异常关闭。
Type=forking

#启动命令:指定 nginx 二进制程序 + 读取自定义配置文件
#-c 参数:指定 nginx.conf 路径,不写则自动找默认路径。
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

#平滑重载配置:nginx -s reload,不中断业务,加载新配置。
ExecReload=/usr/local/nginx/sbin/nginx -s reload

#优雅停止:nginx -s quit,等待现有连接处理完再关闭进程;
#如果写 stop 是强制立即断开连接。
ExecStop=/usr/local/nginx/sbin/nginx -s quit

[Install] #[Install] 区块:开机自启配置
WantedBy=multi-user.target

#重新加载 systemd 所有服务单元文件
[root@storage nginx-1.24.0 15:45:18]# systemctl daemon-reload

#设置开机自启
[root@storage nginx-1.24.0 15:46:25]# systemctl enable nginx.service --now
Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /etc/systemd/system/nginx.service.

#自定义网站首页内容;
[root@storage nginx-1.24.0 15:46:46]# echo hello world > /usr/local/nginx/html/index.html

#内网其他服务器 curl 访问验证 web 服务正常运行。
[root@controller ~ 15:49:08]# curl http://10.1.8.51/
hello world
bash 复制代码
#环境现状:内网 DNS 10.1.8.53 还没添加 yum.linux.com 域名解析记录,无法通过域名访问 YUM 源服务器,暂时直接写源服务器 IP 10.1.8.51;后续 DNS 完善后,再把 baseurl 里的 IP 替换成域名 http://yum.linux.com/dvd。

#在 controller 节点创建远程光盘 YUM 源文件
[root@controller ~ 15:57:00]# vim dvd-from-storage.repo
[root@controller ~ 16:04:14]# cat dvd-from-storage.repo 
[dvd]
name= dvd from local server
baseurl=http://10.1.8.51/dvd #网络 YUM 源,通过 HTTP 访问 storage 机器上 Nginx 发布的光盘目录

gpgcheck=0

#循环批量推送 repo 文件到多台服务器
[root@controller ~ 16:11:09]# for host in 10.1.8.{41..54};do scp /root/dvd-from-storage.repo root@$host:/etc/yum.repos.d/;done
dvd-from-storage.repo                                                100%   74    60.9KB/s   00:00    
dvd-from-storage.repo                                                100%   74    28.9KB/s   00:00    
......

#清理 storage 本机多余 repo 文件
#原因:storage 是 YUM 源服务端,本身用本地 dvd.repo(file://本地挂载目录) 即可,不需要网络源配置文件,清理冗余配置;
[root@storage nginx-1.24.0 15:56:09]# rm -f /etc/yum.repos.d/dvd-from-storage.repo 
[root@storage nginx-1.24.0 16:15:13]# ls /etc/yum.repos.d/
dvd.repo  epel.repo

#修改 Nginx 配置开启目录浏览
[root@storage ~ 16:21:08]# vim /usr/local/nginx/conf/nginx.conf
http {
    autoindex on; #autoindex:Nginx 目录索引功能;
#on:访问目录时,如果目录下没有 index.html,自动列出目录里所有文件 / 文件夹;
#off:关闭,无首页时直接报 403 禁止访问。
#业务意义:访问 http://10.1.8.51/dvd 时,需要展示光盘内所有 rpm 包、仓库索引文件,YUM 才能读取仓库数据,必须开启自动目录浏览。

    include       mime.types;
    
#重启 Nginx 加载新配置    
[root@storage ~ 16:25:06]# systemctl restart nginx

windows浏览器验证

3.配置 raid 存储

使用sdb、sdc、sdd、sde、sdf创建 raid5 设备md5。

bash 复制代码
#Linux 软 RAID 管理工具,系统默认不自带,需要 yum 安装
[root@storage ~ 16:25:31]# yum install -y mdadm

#创建软 RAID5 阵列
[root@storage ~ 16:43:27]# mdadm --create /dev/md5 --level 5 --raid-devices 5 /dev/sd{b..f}
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md5 started.

#lsblk:查看块设备(硬盘、RAID、分区)信息,只筛选 /dev/md5 输出
[root@storage ~ 16:43:34]# lsblk /dev/md5
NAME MAJ:MIN RM SIZE RO TYPE  MOUNTPOINT
md5    9:5    0  80G  0 raid5 

4.准备 NFS 共享目录:/webapp/blog

  • 在设备md5上创建分区1,容量为20G,格式化为 xfs 文件系统,持久化挂载在 /webapp/blog。
bash 复制代码
#parted:磁盘分区工具,支持 GPT/MBR,适合大容量磁盘
#/dev/md5:刚才创建的 RAID5 虚拟磁盘
#mklabel gpt:给磁盘新建 GPT 分区表

[root@storage ~ 16:44:03]# parted /dev/md5 mklabel gpt
信息: You may need to update /etc/fstab.
#提示 You may need to update /etc/fstab:新建分区后如果要开机挂载,需要修改 /etc/fstab,正常提示不是报错。

#起始位置写 1MiB 没有对齐 RAID 块,会轻微影响读写性能;输入 Ignore 忽略警告继续创建分区。
[root@storage ~ 16:45:16]# parted /dev/md5 unit MiB mkpart blog xfs 1 20481
警告: The resulting partition is not properly aligned for best performance.
忽略/Ignore/放弃/Cancel? Ignore                                           
信息: You may need to update /etc/fstab.

#打印分区表
[root@storage ~ 16:46:30]# parted /dev/md5 unit MiB print                 
Model: Linux Software RAID Array (md)
Disk /dev/md5: 81852MiB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start    End       Size      File system  Name  标志
 1      1.00MiB  20481MiB  20480MiB               blog

#查看
[root@storage ~ 16:46:47]# lsblk /dev/md5
NAME    MAJ:MIN RM SIZE RO TYPE  MOUNTPOINT
md5       9:5    0  80G  0 raid5 
└─md5p1 259:1    0  20G  0 md  

#格式化分区为 XFS 文件系统
#不格式化的裸分区无法存放文件,必须格式化文件系统才能挂载使用。
[root@storage ~ 16:47:08]# mkfs.xfs /dev/md5p1
meta-data=/dev/md5p1             isize=512    agcount=16, agsize=327552 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=5240832, imaxpct=25
         =                       sunit=128    swidth=512 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=8 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

#-p:递归创建多级目录,上级 /webapp 不存在也不会报错
#/webapp/blog:业务挂载点,用于存放博客程序数据
[root@storage ~ 16:49:15]# mkdir -p /webapp/blog

#写入开机自动挂载配置
[root@storage ~ 16:51:14]# vim /etc/fstab 
[root@storage ~ 16:51:34]# tail -1 /etc/fstab 
/dev/md5p1 /webapp/blog xfs defaults        0 0

#测试 fstab 配置是否合法,不用重启即可临时挂载,避免写错导致开机无法启动。
[root@storage ~ 16:51:35]# mount -a

#验证挂载状态
[root@storage ~ 16:51:43]# df -h /webapp/blog/
文件系统        容量  已用  可用 已用% 挂载点
/dev/md5p1       20G   33M   20G    1% /webapp/blog
bash 复制代码
#修改网卡ens33的 DNS 为阿里云公共 DNS 223.5.5.5。
#内网 DNS10.1.8.53无法解析外网域名laoma.cloud,临时切换公网 DNS 用来下载外网源码包。
[root@storage ~ 16:55:18]# nmcli con modify  ens33 ipv4.dns 223.5.5.5

#激活
[root@storage ~ 16:55:29]# nmcli con up ens33
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/2)

#wget 下载 WordPress 中文压缩包
[root@storage ~ 16:55:35]# wget https://www.laoma.cloud/course-materials/softwares/stage01/wordpress-4.9.4-zh_CN.zip
--2026-06-12 16:55:42--  https://www.laoma.cloud/course-materials/softwares/stage01/wordpress-4.9.4-zh_CN.zip
正在解析主机 www.laoma.cloud (www.laoma.cloud)... 8.159.134.206
正在连接 www.laoma.cloud (www.laoma.cloud)|8.159.134.206|:443... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:9848003 (9.4M) [application/zip]
正在保存至: "wordpress-4.9.4-zh_CN.zip"

100%[=============================================================>] 9,848,003    421KB/s 用时 23s    

2026-06-12 16:56:06 (426 KB/s) - 已保存 "wordpress-4.9.4-zh_CN.zip" [9848003/9848003])

#切回内网标准 DNS
[root@storage ~ 16:56:06]# nmcli con modify  ens33 ipv4.dns 10.1.8.53
[root@storage ~ 16:56:24]# nmcli con up ens33
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/3)

#解压 zip 格式压缩包;
[root@storage ~ 16:57:06]# unzip wordpress-4.9.4-zh_CN.zip

#将完整博客源码复制到 RAID5 独立存储挂载目录 /webapp/blog,为后续搭建博客网站做准备。
[root@storage ~ 16:57:06]# cp -a wordpress/* /webapp/blog/
  • 只允许 web 服务器上 nginx 账户读写访问该目录,其他账户只能读该目录。
bash 复制代码
#整体业务场景:Web 服务器 company1 安装 Nginx,先临时改 DNS 为阿里公共 DNS 223.5.5.5 保证 yum 下载软件;
#存储服务器 storage 存放网站代码/webapp/blog,把目录权限改#成 Nginx 用户能读写;
#最后 Web 服务器恢复内网 DNS 10.1.8.53。
[root@company1 ~ 16:59:53]# nmcli con modify ens33 ipv4.dns 223.5.5.5
[root@company1 ~ 17:01:14]# nmcli con up ens33
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/2)

#yum 在线安装 Nginx
[root@company1 ~ 17:01:33]# yum install -y nginx

#查看 nginx 系统用户 UID/GID
#uid=997:nginx 用户 ID;gid=995:nginx 用户组 ID
#后面存储服务器修改目录权限,就需要用到这两个 ID。
[root@company1 ~ 17:01:43]# id nginx
uid=997(nginx) gid=995(nginx) 组=995(nginx)

# 递归修改网站目录属主、属组为 nginx 用户 ID
[root@storage ~ 17:03:22]# chown -R 997:995 /webapp/blog/

#验证目录归属是否修改成功
[root@storage ~ 17:03:56]# ll -d /webapp/blog/
drwxr-xr-x 5 997 995 4096 6月  12 16:57 /webapp/blog/

#开放全部权限命令
[root@storage ~ 17:03:44]# chmod 777 -R /webapp/

#dns修改回来
[root@company1 ~ 17:02:47]# nmcli con modify ens33 ipv4.dns 10.1.8.53
[root@company1 ~ 17:05:26]# nmcli con up ens33
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/3)

5.准备 NFS 共享目录:/webapp/company

  • 在设备md5上创建分区2,容量为20G,格式化为 ext4 文件系统,持久化挂载在 /webapp/company。
bash 复制代码
#parted 对 RAID 磁盘新建分区
[root@storage ~ 17:04:07]# parted /dev/md5 unit MiB mkpart company ext4 20481 40961
警告: The resulting partition is not properly aligned for best performance.
忽略/Ignore/放弃/Cancel? ignore
信息: You may need to update /etc/fstab.

#lsblk /dev/md5 查看磁盘分区结构
[root@storage ~ 17:08:41]# lsblk /dev/md5
NAME    MAJ:MIN RM SIZE RO TYPE  MOUNTPOINT
md5       9:5    0  80G  0 raid5 
├─md5p1 259:1    0  20G  0 md    /webapp/blog
└─md5p2 259:0    0  20G  0 md    

#mkfs.ext4 /dev/md5p2 格式化分区
#给新建裸分区创建 ext4 文件系统,不格式化无法存放文件、无法挂载。
#ext4 是 Linux 服务器最常用日志型文件系统,稳定性适合网站数据存储。
[root@storage ~ 17:08:51]# mkfs.ext4 /dev/md5p2

#创建挂载目录
#-p:父目录不存在自动创建,不会报目录已存在错误
#/webapp/company:新业务网站存放目录,作为 md5p2 的挂载入口
[root@storage ~ 17:09:42]# mkdir -p /webapp/company

#编辑开机自动挂载配置
[root@storage ~ 17:10:21]# vim /etc/fstab
#查看最后一行新增挂载规则
[root@storage ~ 17:11:23]# tail -1 /etc/fstab 
/dev/md5p2 /webapp/company ext4 defaults        0 0

#重载 fstab,即时生效挂载
[root@storage ~ 17:11:32]# mount -a

#验证
[root@storage ~ 17:11:37]# df -h /webapp/company/
文件系统        容量  已用  可用 已用% 挂载点
/dev/md5p2       20G   45M   19G    1% /webapp/company
  • 将欢迎词 Welcome to Linux Cloud Company. 写入文件 /webapp/company/index.html 中。
bash 复制代码
 [root@storage ~ 17:11:45]# echo 'Welocme to Linux Cloud company.' > /webapp/company/index.html
  • 只允许 web 服务器上 nginx 账户读写访问该目录,其他账户只能读该目录。
bash 复制代码
# 递归修改目录属主、属组为 nginx 用户 ID
[root@storage ~ 17:13:00]# chown -R 997:995 /webapp/company/

#查看
[root@storage ~ 17:13:29]# ll -d /webapp/company/
   drwxr-xr-x 3 997 995 4096 6月  12 17:13 /webapp/company/
   
#开放所有权限   
[root@storage ~ 17:13:21]# chmod 777 -R /webapp/

6.配置 NFS 共享存储。

允许 10.1.8.0/24 网段访问共享目录 /webapp/company和/webapp/blog。

bash 复制代码
#安装 NFS 服务套件
[root@storage ~ 17:18:36]# yum install -y nfs-utils

# 编辑 NFS 共享配置文件
[root@storage ~ 17:18:57]# vim /etc/exports
#/etc/exports 是 NFS 核心配置文件,所有要共享的目录、允许访问的网段、权限都写在这里
#查看 exports 配置内容
[root@storage ~ 17:21:23]# cat /etc/exports
/webapp/company 10.1.8.0/24(rw)
/webapp/blog 10.1.8.0/24(rw)
#/webapp/company / /webapp/blog:本机要对外提供的目录
#10.1.8.0/24:只允许内网 10.1.8.x 整个网段访问共享,外部 IP 拒绝
#rw = read/write,客户端拥有读写权限(网站需要上传、修改文件必须开 rw)

#开机自启并立即启动 NFS 服务
[root@storage ~ 17:21:27]# systemctl enable nfs-server.service --now
Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.

#exportfs -v 查看当前生效共享
[root@storage ~ 17:22:15]# exportfs -v

#exportfs -av 重载共享配置
[root@storage ~ 17:22:24]# exportfs -av
exporting 10.1.8.0/24:/webapp/blog
exporting 10.1.8.0/24:/webapp/company

#客户端验证
#客户端安装 NFS 工具
[root@company1 ~ 17:24:15]# yum install -y nfs-utils

#showmount -e 查看服务端共享列表
[root@company1 ~ 17:24:15]# showmount -e 10.1.8.51
Export list for 10.1.8.51:
/webapp/blog    10.1.8.0/24
/webapp/company 10.1.8.0/24

7.配置 iSCSI 共享存储

  • 在设备md5上创建分区3,容量为40G,暂不格式化。
  • 共享设备md5分区3。
  • 只允许备份服务器(backup.linux.com)访问该设备。
bash 复制代码
#安装 iSCSI 服务端工具
[root@storage ~ 17:26:31]# yum install -y targetd targetcli

#在 RAID 上划分 40G 备份分区 md5p3
[root@storage ~ 17:28:48]# parted /dev/md5 unit MiB mkpart backup xfs 40961 81851
警告: The resulting partition is not properly aligned for best performance.
忽略/Ignore/放弃/Cancel? ignore                                           
信息: You may need to update /etc/fstab.

#lsblk 查看完整 RAID 分区结构
[root@storage ~ 17:29:19]# lsblk /dev/md5
NAME    MAJ:MIN RM SIZE RO TYPE  MOUNTPOINT
md5       9:5    0  80G  0 raid5 
├─md5p1 259:1    0  20G  0 md    /webapp/blog
├─md5p2 259:0    0  20G  0 md    /webapp/company
└─md5p3 259:2    0  40G  0 md    

#targetcli 交互式配置 iSCSI(核心操作)
[root@storage ~ 19:55:18]# targetcli
Warning: Could not load preferences file /root/.targetcli/prefs.bin.
targetcli shell version 2.1.53
Copyright 2011-2013 by Datera, Inc and others.
For help on commands, type 'help'.

#创建后端块存储(把 md5p3 交给 iSCSI 管理)
#backstores/block:块后端仓库
#create backup:后端名称自定义为 backup
#/dev/md5p3:绑定我们刚分好的 40G 裸分区,作用:告诉 iSCSI,对外提供的磁盘底层是 md5p3。
/> /backstores/block create backup /dev/md5p3
Created block storage object backup using /dev/md5p3.

#自动生成默认 target(临时测试,后面删掉重建)
/> /iscsi create
Created target iqn.2003-01.org.linux-iscsi.storage.x8664:sn.8272f81580b5.
Created TPG 1.
Global pref auto_add_default_portal=true
Created default portal listening on all IPs (0.0.0.0), port 3260.

#删除自动生成的默认 target
/> /iscsi/ delete iqn.2003-01.org.linux-iscsi.storage.x8664:sn.8272f81580b5 
Deleted Target iqn.2003-01.org.linux-iscsi.storage.x8664:sn.8272f81580b5.

#创建自定义规范 IQN Target
/> /iscsi create iqn.2026-06.com.linux.storage:backup
Created target iqn.2026-06.com.linux.storage:backup.
Created TPG 1.
Global pref auto_add_default_portal=true
Created default portal listening on all IPs (0.0.0.0), port 3260.

# 进入当前 target 的 tpg1 配置目录
/> cd /iscsi/iqn.2026-06.com.linux.storage:backup/tpg1/

#创建客户端 ACL 访问控制(客户端认证标识)
#ACL 作用:白名单,只有客户端 initiator 名称匹配这个 iqn 才能连接这块存储盘,拒绝其他设备接入。
#backup-52 可代表客户端主机编号,区分多台机器。
/iscsi/iqn.20...e:backup/tpg1> acls/ create iqn.2026-06.com.linux.storage:backup-52
Created Node ACL for iqn.2026-06.com.linux.storage:backup-52

#将后端 40G 磁盘映射为 LUN0
#LUN0:对外暴露给客户端的磁盘编号 0
#自动把 LUN0 绑定到上面创建的 ACL 白名单,只有授权客户端能识别该磁盘
/iscsi/iqn.20...e:backup/tpg1> luns/ create /backstores/block/backup 
Created LUN 0.
Created LUN 0->0 mapping in node ACL iqn.2026-06.com.linux.storage:backup-52

#退出 targetcli,自动保存配置
/iscsi/iqn.20...e:backup/tpg1> exit
Global pref auto_save_on_exit=true
Configuration saved to /etc/target/saveconfig.json
[root@storage ~ 20:06:02]# 

#设置 target 服务开机自启并立即运行
[root@storage ~ 20:06:02]# systemctl enable target --now

(二)配置-备份服务器

配置节点backup.linux.com

1.扫描并登录存储服务器通过iSCSI共享的块设备。

bash 复制代码
#安装 iSCSI 客户端工具包
#服务端叫 target,客户端叫 initiator(启动器)
[root@backup ~ 20:13:12]# yum install iscsi-initiator-utils

#查看默认客户端标识名称
[root@backup ~ 20:14:15]# cat /etc/iscsi/initiatorname.iscsi 
InitiatorName=iqn.1994-05.com.redhat:9d13d1aafb2c

#修改客户端 IQN,和服务端 ACL 保持一致
[root@backup ~ 20:14:42]# vim /etc/iscsi/initiatorname.iscsi 
[root@backup ~ 20:17:47]# cat /etc/iscsi/initiatorname.iscsi 
InitiatorName=iqn.2026-06.com.linux.storage:backup-52

#发现远端 iSCSI 存储(discovery 探测)
#-m discovery:模式 = 扫描发现远端存储
#-t st:type=sendtargets,标准 iSCSI 探测方式
#-p 10.1.8.51:指定 iSCSI 服务端 IP
#返回结果含义:服务端 10.1.8.51 3260 端口,存在一块共享磁盘 Target 名称 iqn.2026-06.com.linux.storage:backup,探测成功。
[root@backup ~ 21:16:53]# iscsiadm -m discovery -t st -p 10.1.8.51
10.1.8.51:3260,1 iqn.2026-06.com.linux.storage:backup

#登录挂载远端块设备
#-m node:操作已发现的存储节点
#-T:指定要登录的 Target IQN 名称
#-l:login 登录挂载远程磁盘
#输出 successful 代表客户端成功连上 storage 的 40G 裸盘。
[root@backup ~ 21:17:33]# iscsiadm -m node -T iqn.2026-06.com.linux.storage:backup -l
Logging in to [iface: default, target: iqn.2026-06.com.linux.storage:backup, portal: 10.1.8.51,3260] (multiple)
Login to [iface: default, target: iqn.2026-06.com.linux.storage:backup, portal: 10.1.8.51,3260] successful.

#lsblk 查看识别到的远程硬盘
[root@backup ~ 21:17:53]# lsblk /dev/sdb
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb    8:16   0  40G  0 disk 

#设置 iscsi 客户端开机自启
[root@backup ~ 21:17:53]# systemctl enable iscsi

2.格式化为 xfs 文件系统,持久化挂载在/webapp。

bash 复制代码
#mkfs.xfs/dev/sdb 给远程裸盘格式化 XFS 文件系统
[root@backup ~ 21:23:10]# mkfs.xfs /dev/sdb
meta-data=/dev/sdb               isize=512    agcount=16, agsize=654208 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=10467328, imaxpct=25
         =                       sunit=128    swidth=512 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=5112, version=2
         =                       sectsz=512   sunit=8 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

#mkdir /webapp 创建挂载目录
[root@backup ~ 21:18:34]# mkdir /webapp

#vim /etc/fstab 编辑开机自动挂载配置
[root@backup ~ 21:19:49]# vim /etc/fstab

#tail -1 /etc/fstab 查看新增挂载条目
[root@backup ~ 21:20:52]# tail -1 /etc/fstab 
/dev/sdb /webapp xfs _netdev	0 0

#验证挂载成功
[root@backup ~ 21:24:07]# df -h /webapp/
文件系统        容量  已用  可用 已用% 挂载点
/dev/sdb         40G   33M   40G    1% /webapp

3.配置备份。

  • 每天 22:58 将存储服务器上的目录 /webapp中内容同步到本地 /webapp。
  • 每天 23:58 将数据库服务器上的目录 /var/lib/mysql 中内容同步到本地 /webapp/mysql。
bash 复制代码
#生成 SSH 密钥对(免密登录前提)
[root@backup ~ 21:24:57]# ssh-keygen

#推送公钥到 storage 10.1.8.51,实现免密登录
[root@backup ~ 21:27:13]# sshpass -p123 ssh-copy-id root@10.1.8.51

#验证免密连通
[root@backup ~ 21:27:35]# ssh root@10.1.8.51 hostname
storage.linux.com

#推送公钥到数据库服务器 db1 10.1.8.49
[root@backup ~ 21:28:27]# sshpass -p123 ssh-copy-id root@10.1.8.49
[root@backup ~ 21:30:22]# ssh root@10.1.8.49 hostname
db1.linux.com

#rsync 同步 storage 网站业务数据(首次全量备份)
[root@backup ~ 21:32:18]# rsync -av 10.1.8.51:/webapp/* /webapp
[root@backup ~ 21:32:18]# ls /webapp/
blog  company

#预留数据库同步命令(注释说明等数据库部署完执行)
[root@backup ~ 21:32:34]# rsync -av 10.1.8.51:/var/lib/mysql /webapp

#编辑当前 root 用户定时任务
[root@backup ~ 21:37:33]# crontab -e
no crontab for root - using an empty one
crontab: installing new crontab

#查看已配置定时规则
[root@backup ~ 21:39:38]# crontab -l
58 22 * * * rsync -av 10.1.8.51:/webapp/* /webapp
58 23 * * * rsync -av 10.1.8.51:/var/lib/mysql /webapp

(三)配置-网络服务器

配置节点network.linux.com

1.配置 DHCP 服务器。

  • 网络范围:10.1.8.0/24
  • 地址池:10.1.8.101-10.1.8.120
  • 网关:10.1.8.4
  • DNS:10.1.8.53
  • 域名:linux.com
  • 为客户端 client.linux.com 分配固定 IP 地址:10.1.8.54。
  • 确保dhcp服务开机启动。
bash 复制代码
#客户端查看网卡硬件信息
[root@client ~ 21:42:35]# ip -br link
lo               UNKNOWN        00:00:00:00:00:00 <LOOPBACK,UP,LOWER_UP> 
ens33            UP             00:0c:29:30:0c:ca <BROADCAST,MULTICAST,UP,LOWER_UP> 

#network 主机安装 DHCP 服务
[root@network ~ 21:41:37]# yum install -y dhcp

#编辑 DHCP 核心配置文件 /etc/dhcp/dhcpd.conf
[root@network ~ 22:36:05]# vim /etc/dhcp/dhcpd.conf
# 定义整个10.1.8.0/24网段地址池
subnet 10.1.8.0 netmask 255.255.255.0 {
  range 10.1.8.101 10.1.8.120;  # 动态分配IP段,普通机器随机获取
  option domain-name-servers 10.1.8.53;  # 下发DNS服务器地址
  option domain-name "linux.com";  # 搜索域名后缀
  option routers 10.1.8.2;  # 下发默认网关
  option broadcast-address 10.1.8.255;  # 广播地址
  default-lease-time 600;  # 默认租期600秒=10分钟
  max-lease-time 7200;   # 最大租期7200秒=2小时
}

# 静态绑定模块:指定MAC永远分配固定IP
host client.linux.com {
  hardware ethernet 00:0c:29:30:0c:ca;  # 客户端ens33的MAC地址
  fixed-address 10.1.8.54;  # 固定下发IP:10.1.8.54
}

#启动 DHCP 并设置开机自启
[root@network ~ 22:36:19]# systemctl enable dhcpd --now

# 查看现有网卡连接配置
[root@client ~ 22:38:05]# nmcli con
NAME   UUID                                  TYPE      DEVICE 
ens33  0c91c57c-f42e-4356-aeda-d0276c6c657d  ethernet  ens33  

#新建 DHCP 自动获取网卡配置
[root@client ~ 22:39:15]# nmcli connection add type ethernet ifname ens33 con-name ens33-auto
连接 "ens33-auto" (3c18f865-98bd-4d33-ad1b-8a09d502b043) 已成功添加。

#重载网卡,触发 DHCP 请求
[root@client ~ 22:40:36]# nmcli con up ens33
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/3)

#验证客户端获取到 IP
[root@client ~ 22:40:43]# ip -br a
lo               UNKNOWN        127.0.0.1/8 ::1/128 
ens33            UP             10.1.8.54/24 fe80::bf31:e3c0:303e:4ae2/64 fe80::6a4b:d3bc:6716:1103/64 fe80::7922:fc2f:b54d:2ce7/64 

#验证 DHCP 下发的 DNS 与搜索域
[root@client ~ 22:40:47]# cat /etc/resolv.conf 
# Generated by NetworkManager
search linux.com
nameserver 10.1.8.53

2.配置 DNS 服务器。

  • 允许所有客户端查询
  • 允许递归查询
  • 禁止 dnssec 校验
  • 该 zone 由服务器 dns.linux.com 负责,对应IP为10.1.8.53。
  • 该 zone 提供实验环境中所有主机正向和反向解析。
  • 确保named服务开机启动。
bash 复制代码
#安装 DNS 服务 BIND 套件
#bind:DNS 主服务程序,服务名named
#bind-utils:客户端测试工具(nslookup/dig/host),用于验证解析
[root@network ~ 22:42:43]# yum install -y bind bind-utils

# 修改主配置文件 /etc/named.conf(关键配置段讲解)
[root@network ~ 22:44:56]# vim /etc/named.conf 
#只写变更的条目

options {
        # DNS监听地址:本机回环 + 内网网卡10.1.8.53
        listen-on port 53 { 127.0.0.1;10.1.8.53; };
        # 允许所有内网机器查询DNS
        allow-query     { localhost;any; };
        # 开启递归:内网机器可解析公网域名
        recursion yes;
        # 关闭DNSSEC校验(测试内网简化配置,避免解析报错)
        dnssec-enable no;
        dnssec-validation no;
};

# 正向域:解析 linux.com 域名(域名查IP)
zone "linux.com" IN {
     type master;   # 主DNS服务器
     file "linux.com.zone";    # 解析库文件,存放/var/named/下
};

# 反向域:10.1.8.0网段(IP查域名)
zone "8.1.10.in-addr.arpa" IN {
     type master;
     file "10.1.8.zone";
};
#反向域命名规则:网段倒写,10.1.8.0 → 8.1.10.in-addr.arpa。


#创建空区域文件并修正权限(BIND 强制权限)
#touch:生成正向、反向解析库空白文件
[root@network ~ 22:53:18]# touch /var/named/linux.com.zone /var/named/10.1.8.zone

#chmod 640:仅 root/named 可读,防止普通用户篡改解析记录
[root@network ~ 22:53:48]# chmod 640 /var/named/*.zone

#chown root:named:属组改为 named,named 进程才能读取文件,否则启动失败
[root@network ~ 22:54:12]# chown root:named /var/named/*.zone

#正向解析库 /var/named/linux.com.zone
[root@network ~ 23:00:27]# vim /var/named/linux.com.zone
$TTL 3600 # 全局缓存生存时间 3600秒=1小时
# SOA记录:域授权起始记录,每个区域必须有
@ IN SOA dns.linux.com. root.linux.com. (
    42 ; serial  #serial 序列号,修改解析记录必须递增,从服务器同步依据
    3H ; secondary refresh  #从服务器每3小时拉取更新
    15M ; secondary retry  #更新失败15分钟重试
    1W ; secondary timeout  #一周连不上主DNS,从服务器停止提供解析
    15M ; minimum cache TTL for negative answers  #负缓存TTL(不存在域名缓存15分钟)
)
# NS记录:声明本域DNS服务器
 	IN NS dns.linux.com.
# A记录:域名映射IP
ha1 IN A 10.1.8.41
ha2 IN A 10.1.8.42
proxy1 IN A 10.1.8.43 
proxy2 IN A 10.1.8.44
company1 IN A 10.1.8.45
company2 IN A 10.1.8.46
blog1 IN A 10.1.8.47
blog2 IN A 10.1.8.48
db1 IN A 10.1.8.49 
db2 IN A 10.1.8.50 
storage IN A 10.1.8.51
yum IN A 10.1.8.51
backup IN A 10.1.8.52
network IN A 10.1.8.53
dns IN A 10.1.8.53 
client IN A 10.1.8.54
www IN A 10.1.8.100
#作用:内网任意机器 ping company1、storage、db1 等短域名,自动解析对应 IP。

#反向解析库 /var/named/10.1.8.zone
[root@network ~ 23:27:22]# vim /var/named/10.1.8.zone 
[root@network ~ 23:33:39]# cat /var/named/10.1.8.zone 
$TTL 3600
@ IN SOA dns.linux.com. root.linux.com. (
    42 ; serial
    3H ; secondary refresh
    15M ; secondary retry
    1W ; secondary timeout
    15M ; minimum cache TTL for negative answers
)
 	IN NS dns.linux.com. 	
# PTR反向记录:IP最后一段 IN PTR 完整域名 
41 IN PTR ha1.linux.com.
42 IN PTR ha2.linux.com.
43 IN PTR proxy1.linux.com.
44 IN PTR proxy2.linux.com.
45 IN PTR company1.linux.com.
46 IN PTR company2.linux.com.
47 IN PTR blog1.linux.com.
48 IN PTR blog2.linux.com.
49 IN PTR db1.linux.com.
50 IN PTR db2.linux.com.
51 IN PTR storage.linux.com.
51 IN PTR yum.linux.com.
52 IN PTR backup.linux.com.
53 IN PTR network.linux.com.
53 IN PTR dns.linux.com.
54 IN PTR client.linux.com.
100 IN PTR www.linux.com.
#作用:根据 IP 反查主机名,常用于日志排查、ssh 反向解析识别主机。

#启动 DNS 服务并设置开机自启
[root@network ~ 23:46:37]# systemctl enable named.service --now

DNS完善,修改YUM 仓库配置文件

bash 复制代码
#进入之前创建的yum仓库,修改软件包下载地址,内网 HTTP 本地光盘源
[root@controller ~ 23:57:10]# vim dvd-from-storage.repo 
[root@controller ~ 23:57:54]# cat dvd-from-storage.repo 
[dvd]
name= dvd from local server
baseurl=http://yum.linux.com/dvd
gpgcheck=0

#for 循环批量推送 repo 文件到所有内网主机
[root@controller ~ 23:57:57]# for host in 10.1.8.{41..54};do scp dvd-from-storage.repo root@$host:/etc/yum.repos.d/;donedvd-from-storage.repo                                                                 100%   78    53.0KB/s   00:00    
dvd-from-storage.repo                                                                 100%   78    68.2KB/s   00:00    
dvd-from-storage.repo                                                                 100%   78    46.6KB/s   00:00    

# 在 proxy1 节点验证仓库文件已同步
[root@proxy1 ~ 00:03:02]# cat /etc/yum.repos.d/dvd-from-storage.repo 
[dvd]
name= dvd from local server
baseurl=http://yum.linux.com/dvd
gpgcheck=0

#使用本地内网源安装 nginx
[root@proxy1 ~ 00:03:10]# yum install -y nginx

(四)配置-数据库服务器

配置节点db1.linux.comdb2.linux.com

1.所有数据库节点部署 Mariadb 服务。

bash 复制代码
#db1(10.1.8.49)、db2(10.1.8.50)两台数据库节点
#内网已配置本地 yum 源 yum.linux.com/dvd,直接离线安装数据库服务

#mariadb-server:Mariadb 数据库服务端主安装包,包含数据库程序、配置文件、初始化脚本;
#-y:自动确认所有依赖安装,无需交互输入 yes;
#安装包从内网本地 YUM 源拉取,不依赖外网。
[root@db1 ~ 11:33:46]# yum install -y mariadb-server
#设置 mariadb 开机自动启动,--now:安装完成后立刻启动当前数据库服务
[root@db1 ~ 11:33:46]# systemctl enable mariadb.service --now

#db2 数据库节点操作(完全和 db1 一致)
[root@db2 ~ 11:34:02]# yum install -y mariadb-server
[root@db2 ~ 11:34:02]# systemctl enable mariadb.service --now

2.所有数据库节点进行安全初始化:设置 root 密码为Blog@123,禁止root用户远程登录,删除匿名用户,删除测试数据库。

前置说明

db1、db2 两台 MariaDB 数据库刚安装启动,系统默认存在大量不安全配置,mysql_secure_installation 是官方自带一键加固脚本,生产环境必须执行,两台库做了完全一样的安全初始化操作。

bash 复制代码
#mysql_secure_installation 数据库安全初始化脚本完整讲解
[root@db1 ~ 11:35:46]# mysql_secure_installation 

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we'll need the current
password for the root user.  If you've just installed MariaDB, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.

#输入当前 root 密码
#全新安装的 MariaDB,root 账号无初始密码,直接回车进入下一步。
Enter current password for root (enter for none): 
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.

#设置数据库 root 管理员密码
Set root password? [Y/n] `Y`
New password: `自定义密码`
Re-enter new password: `重复密码`
Password updated successfully!
Reloading privilege tables..
 ... Success!


By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

# 删除匿名测试用户
Remove anonymous users? [Y/n] 
 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

#禁止 root 账号远程登录
Disallow root login remotely? [Y/n] 
 ... Success!

By default, MariaDB comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

#删除 test 测试库及权限
Remove test database and access to it? [Y/n] 
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

#重载权限表,全部规则生效
Reload privilege tables now? [Y/n] 
 ... Success!

Cleaning up...

#加固完成提示
All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!

#db1、db2 两台执行相同操作的意义
#统一安全基线:主备 / 双数据库环境配置保持一致,安全规则无差异;
#规避单点风险:两台库都关闭危险默认配置,不会出现一台安全、一台裸奔的情况;
#标准化运维:批量数据库统一初始化步骤,方便后期维护。
[root@db2 ~ 11:36:52]# mysql_secure_installation 

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we'll need the current
password for the root user.  If you've just installed MariaDB, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none): 
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.

Set root password? [Y/n] 
New password: 
Re-enter new password: 
Password updated successfully!
Reloading privilege tables..
 ... Success!


By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n] 
 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n] 
 ... Success!

By default, MariaDB comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n] 
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n] 
 ... Success!

Cleaning up...

All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!

3.配置两台数据库节点:配置 db2.linux.com 作为 db1.linux.com 的从。

bash 复制代码
#主库 db1 开启二进制日志,配置复制参数
[root@db1 ~ 11:38:41]# cat > /etc/my.cnf.d/master.cnf <<'EOF'
> [mysqld]
> server_id = 1 #数据库集群唯一 ID,主从不能重复,主库设 1,从库设 2。
> log_bin = mysql-bin #开启二进制日志 binlog,主从复制核心:所有增删改操作记录到 binlog,同步给从库。
> binlog_format = ROW #行级复制:记录每行数据实际变化,准确性最高,推荐生产使用。
> relay_log = mysql-relay-bin #开启中继日志(从库必备,主库写上兼容配置),从库接收主 binlog 先存中继日志再回放。
> binlog-ignore-db = information_schema 
> binlog-ignore-db = performance_schema
> binlog-ignore-db = sys
#binlog-ignore-db忽略系统自带库,不记录它们的操作到二进制日志,减少同步压力。
> EOF

#修改配置必须重启数据库,参数才能生效。
[root@db1 ~ 11:46:51]# systemctl restart mariadb.service 

#从库 db2 同步配置(仅 server_id 不同)
[root@db2 ~ 11:40:23]# cat > /etc/my.cnf.d/master.cnf <<'EOF'
> [mysqld]
> server_id = 2
> log_bin = mysql-bin
> binlog_format = ROW
> relay_log = mysql-relay-bin
> binlog-ignore-db = information_schema
> binlog-ignore-db = performance_schema
> binlog-ignore-db = sys
> EOF

#唯一区别:server_id=2,集群内 ID 不冲突,其余日志格式、忽略库和主库保持一致,重启服务加载配置。
[root@db2 ~ 11:50:51]# systemctl restart mariadb.service

#主库创建专门用于复制的同步账号 repl
[root@db1 ~ 11:47:27]# mysql -uroot -pBlog@123

#replication slave:允许读取主库二进制日志
#replication client:允许查询主库复制状态
#'repl'@'10.1.8.50':仅允许从库 db2 这台 IP 连接,禁止其他机器使用同步账号
MariaDB [(none)]> grant replication slave, replication client on *.* to 'repl'@'10.1.8.50' identified by 'Blog@123';
Query OK, 0 rows affected (0.00 sec)

#flush privileges; 刷新权限,账号立即生效
MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.00 sec)

#查看主库 binlog 同步起点(关键位置)
MariaDB [(none)]> show master status\G
*************************** 1. row ***************************
            File: mysql-bin.000001
        Position: 492
    Binlog_Do_DB: 
Binlog_Ignore_DB: information_schema,performance_schema,sys
1 row in set (0.00 sec)
#File:当前二进制日志文件名 mysql-bin.000001
#Position:日志偏移位置 492
#从库需要填写这两个值,代表从这个文件、这个位置开始同步主库数据
MariaDB [(none)]> 

[root@db2 ~ 11:51:13]# mysql -uroot -pBlog@123
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 2
Server version: 5.5.68-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

#从库配置指向主库信息(change master)
#master_host:主库 IP db1 (10.1.8.49)
#master_user/master_password:刚才创建的同步账号 repl 及密码
#master_port:数据库默认端口 3306
#master_log_file/master_log_pos:主库 show master status 查到的日志文件与偏移量
#master_connect_retry=30:连接失败每隔 30 秒重试
MariaDB [(none)]> change master to master_host='10.1.8.49', 
    -> master_user='repl',
    -> master_password='Blog@123',
    -> master_port=3306,
    -> master_log_file='mysql-bin.000001',
    -> master_log_pos=492,
    -> master_connect_retry=30;
Query OK, 0 rows affected (0.01 sec)

#启动从库同步进程,检查同步状态
MariaDB [(none)]> start slave;
Query OK, 0 rows affected (0.01 sec)

#start slave; 启动两个同步线程:IO 线程、SQL 线程
#关键两个状态必须同时为 Yes,代表主从复制正常:
#Slave_IO_Running:从库 IO 线程,正常拉取主库 binlog
#Slave_SQL_Running:从库 SQL 线程,回放中继日志、复现主库操作
#Waiting for master to send event:空闲等待主库新数据,属于正常状态。
MariaDB [(none)]> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 10.1.8.49
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 30
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 492
               Relay_Log_File: mysql-relay-bin.000002
                Relay_Log_Pos: 529
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
            
#主库创建
MariaDB [(none)]> create database test;
Query OK, 1 row affected (0.00 sec)
#从库查看
MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+
4 rows in set (0.00 sec)

#测试完成后删除test数据库
MariaDB [(none)]> drop database test;
Query OK, 0 rows affected (0.01 sec)            

4.为博客站点准备数据库:

  • 数据库名称为 blog
  • 创建账户:账户名 blog@'%',密码为Blog@123
  • 账户名 blog@'%' 对数据库 blog 有完全控制权限。
  • 操作在 主库 db1(10.1.8.49) 执行,主从复制已搭建完成,所有操作会自动同步到从库 db2。
sql 复制代码
#创建博客业务数据库
#创建专属数据库 blog,存放博客网站所有表、文章、用户数据;
#因为开启主从 binlog,这条语句会同步到从库,db2 自动生成 blog 库。
MariaDB [(none)]> CREATE DATABASE blog;
Query OK, 1 row affected (0.00 sec)

#创建业务访问账号 blog
#blog:Web 程序连接数据库使用的普通业务账号,不使用 root 管理员,权限隔离更安全;
#@'%':允许任意 IP 地址连接该账号(内网 10.1.8 网段所有 web 服务器 company1、company2、blog1、blog2 都能访问);
#IDENTIFIED BY 'Blog@123':设置账号登录密码。
MariaDB [(none)]> CREATE USER blog@'%' IDENTIFIED BY 'Blog@123';
Query OK, 0 rows affected (0.00 sec)

#给 blog 账号授予 blog 库完整操作权限
#ALL PRIVILEGES:拥有增删改查、建表、删表、索引等全部权限;
#blog.*:仅针对 blog 数据库下所有表生效,无法访问 mysql、information_schema 等系统库,权限最小化;
#限制:该账号只能操作博客业务库,不能修改数据库账号、复制、全局配置。
MariaDB [(none)]> GRANT ALL PRIVILEGES ON blog.* TO blog@'%';
Query OK, 0 rows affected (0.00 sec)

#刷新权限,授权立即生效
MariaDB [(none)]> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.01 sec)

#退出数据库终端
MariaDB [(none)]> exit
Bye

(五)配置-公司站点服务器

配置节点company1.linux.comcompany2.linux.com

1.所有公司站点服务器持久化挂载存储服务器提供的nfs共享目录 /webapp 到本地/usr/share/nginx/html目录。

环境回顾

  • storage (10.1.8.51):NFS 服务端,共享 /webapp/blog/webapp/company 网站源码目录
  • company1、company2:两台 Web 服务器,都部署 Nginx,统一挂载远端 NFS 网站目录,实现多 web 节点共享一套代码
bash 复制代码
#安装 Nginx + NFS 客户端工具
#nginx:Web 服务,提供网站访问
#nfs-utils:NFS 客户端工具,包含挂载、探测 NFS 共享所需命令
#软件从内网本地 yum 源 yum.linux.com/dvd 安装
[root@company1 ~ 12:20:20]# yum install -y nginx nfs-utils

#探测 storage 服务器开放的 NFS 共享
[root@company1 ~ 12:23:04]# showmount -e storage
Export list for storage:
/webapp/blog    10.1.8.0/24
/webapp/company 10.1.8.0/24

#写入 /etc/fstab 实现开机自动挂载 NFS
[root@company1 ~ 12:25:12]# vim /etc/fstab 
[root@company1 ~ 12:28:28]# tail -1 /etc/fstab 
storage:/webapp /usr/share/nginx/html nfs defaults        0 0

#重载 fstab 挂载规则,无需重启生效
[root@company1 ~ 12:28:35]# mount -a

#验证挂载结果
[root@company1 ~ 12:29:29]# df -h /usr/share/nginx/html/
文件系统         容量  已用  可用 已用% 挂载点
storage:/webapp   50G  1.8G   49G    4% /usr/share/nginx/html

#company2 操作流程(和 company1 完全一致)
[root@company2 ~ 12:20:21]# yum install -y nginx nfs-utils
[root@company2 ~ 12:23:31]# vim /etc/fstab
[root@company2 ~ 12:31:24]# tail -1 /etc/fstab 
storage:/webapp /usr/share/nginx/html nfs	defaults	0 0
[root@company2 ~ 12:31:31]# mount -a
[root@company2 ~ 12:31:37]# df -h /usr/share/nginx/html/
文件系统         容量  已用  可用 已用% 挂载点
storage:/webapp   50G  1.8G   49G    4% /usr/share/nginx/html

2.所有公司节点部署 Nginx 服务器,确保客户端可以通过以下地址访问 company 站点:

环境梳理

  • company1 (10.1.8.45)、company2 (10.1.8.46) 两台 Web 服务器,均挂载 NFS 共享 /usr/share/nginx/html
  • 网站代码目录:/usr/share/nginx/html/company(来自 storage 的 NFS 共享)
  • DNS 已配置解析:company1.linux.com 指向 10.1.8.45,company2.linux.com 指向 10.1.8.46
bash 复制代码
#company1 配置企业站点虚拟主机
[root@company1 ~ 13:21:10]# vim /etc/nginx/conf.d/vhost-company.conf

#server {}:一个虚拟主机站点块
#server_name company1.linux.com;匹配访问域名,客户端用这个域名访问时,才进入该站点配置
#root /usr/share/nginx/html/company;网站根目录,指向 NFS 共享里的 company 企业站点目录,所有页面文件从这里读取
[root@company1 ~ 13:23:24]# cat /etc/nginx/conf.d/vhost-company.conf
server {
    server_name company1.linux.com;
    root	/usr/share/nginx/html/company;
}

#启动并开机自启 Nginx
[root@company1 ~ 13:23:30]# systemctl enable nginx.service --now

#company2 同步并修改虚拟主机配置
# 从 company1 拷贝一份站点配置文件
[root@company2 ~ 13:21:02]# scp company1:/etc/nginx/conf.d/vhost-company.conf /etc/nginx/conf.d/vhost-company.conf
Warning: Permanently added 'company1,10.1.8.45' (ECDSA) to the list of known hosts.
root@company1's password: 
vhost-company.conf                                                                    100%   89    39.4KB/s   00:00

#修改配置里的 server_name 域名
[root@company2 ~ 13:25:24]# vim /etc/nginx/conf.d/vhost-company.conf 
[root@company2 ~ 13:26:05]# cat /etc/nginx/conf.d/vhost-company.conf 
server {
    server_name company2.linux.com;
    root	/usr/share/nginx/html/company;
}

#启动 Nginx 服务
[root@company2 ~ 13:26:14]# systemctl enable nginx.service --now

#客户端 client 测试访问
[root@client ~ 13:27:10]# curl http://company1.linux.com/
Welocme to Linux Cloud company.
[root@client ~ 13:28:13]# curl http://company2.linux.com/
Welocme to Linux Cloud company.

(六)配置-博客站点服务器

配置节点blog1.linux.comblog2.linux.com

1.博客使用LNMP架构。

2.所有博客节点持久化挂载存储服务器提供的nfs共享目录/webapp到本地/usr/share/nginx/html目录。

整体架构回顾

  • storage (10.1.8.51):NFS 服务端,共享/webapp,内部分两个业务目录

    • /webapp/company:企业官网代码

    • /webapp/blog:博客站点代码

  • blog1 (10.1.8.47)、blog2 (10.1.8.48):博客业务 Web 服务器,和之前 company1/company2 架构完全一致

  • 所有 Web 节点统一挂载远端 NFS 目录,共用一套源码,不用每台机器单独上传文件

bash 复制代码
#安装 Nginx 网页服务、NFS 客户端工具
[root@blog1 ~ 13:47:03]# yum install -y nginx nfs-utils

#探测存储服务器 NFS 共享目录
[root@blog1 ~ 13:48:40]# showmount -e storage
Export list for storage:
/webapp/blog    10.1.8.0/24
/webapp/company 10.1.8.0/24

# 写入 /etc/fstab 配置开机自动挂载 NFS
[root@blog1 ~ 13:49:39]# vim /etc/fstab 
[root@blog1 ~ 13:50:35]# tail -1 /etc/fstab 
storage:/webapp /usr/share/nginx/html nfs defaults 	0 0

#重载 fstab 配置,即时挂载共享目录
[root@blog1 ~ 13:50:43]# mount -a

#验证挂载是否成功
[root@blog1 ~ 13:50:48]# df -h /usr/share/nginx/html/
文件系统         容量  已用  可用 已用% 挂载点
storage:/webapp   50G  1.8G   49G    4% /usr/share/nginx/html

#blog2 服务器操作(流程和 blog1 完全相同)
[root@blog2 ~ 13:49:03]# yum install -y nginx nfs-utils
[root@blog2 ~ 13:49:09]# showmount -e storage
Export list for storage:
/webapp/blog    10.1.8.0/24
/webapp/company 10.1.8.0/24
[root@blog2 ~ 13:51:42]# vim /etc/fstab 
[root@blog2 ~ 14:04:20]# tail -1 /etc/fstab 
storage:/webapp /usr/share/nginx/html nfs 	defaults  0 0
[root@blog2 ~ 14:04:31]# mount -a
[root@blog2 ~ 14:04:36]# df -h /usr/share/nginx/html/
文件系统         容量  已用  可用 已用% 挂载点
storage:/webapp   50G  1.8G   49G    4% /usr/share/nginx/html

所有博客节点部署 Nginx 服务器,确保客户端可以通过以下地址访问博客站点:

环境说明

blog1 (10.1.8.47)、blog2 (10.1.8.48) 两台博客 Web 节点,已挂载 NFS 共享/usr/share/nginx/html/blog博客源码目录;

博客是 PHP 动态网站,需要 Nginx 处理静态页面、PHP-FPM 解析 PHP 代码,同时安装数据库驱动连接 MariaDB 主从库。

bash 复制代码
#下载阿里云 CentOS7 官方 yum 源
[root@blog1 ~ 13:51:01]# curl -s http://mirrors.aliyun.com/repo/Centos-7.repo -o /etc/yum.repos.d/Centos-7.repo

#安装 PHP 运行全套组件
[root@blog1 ~ 14:13:59]# yum install -y php php-fpm php-mysqlnd

#编写博客站点 Nginx 虚拟主机配置 vhost-blog.conf
[root@blog1 ~ 14:15:08]# vim /etc/nginx/conf.d/vhost-blog.conf
[root@blog1 ~ 14:18:56]# cat /etc/nginx/conf.d/vhost-blog.conf 
server {
    # 绑定博客域名
    server_name blog1.linux.com;
    # 网站根目录:NFS共享的博客源码文件夹
    root 	/usr/share/nginx/html/blog;
    
    # 匹配所有以.php结尾的动态请求
    location ~ \.php$ {
        # 文件不存在直接返回404,防止路径穿透漏洞
        try_files $uri =404;
        # 把php请求转发给本机php-fpm 9000端口
        fastcgi_pass 127.0.0.1:9000;
        # 默认首页文件 index.php
        fastcgi_index index.php;
        # 传递脚本物理路径给PHP解析器
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        # 载入fastcgi通用环境变量配置
        include fastcgi_params;
    }
}

#同时启动 Nginx、PHP-FPM 并设置开机自启
[root@blog1 ~ 14:19:03]# systemctl enable nginx.service php-fpm.service --now


#blog2 服务器操作(流程完全一致,仅域名区分)
[root@blog2 ~ 13:51:01]# curl -s http://mirrors.aliyun.com/repo/Centos-7.repo -o /etc/yum.repos.d/Cenntos-7.repo
[root@blog2 ~ 14:13:59]# yum install -y php php-fpm php-mysqlnd
[root@blog2 ~ 14:16:51]# vim /etc/nginx/conf.d/vhost-blog.conf
[root@blog2 ~ 14:20:05]# cat /etc/nginx/conf.d/vhost-blog.conf
server {
    server_name blog2.linux.com;
    root 	/usr/share/nginx/html/blog;

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

[root@blog2 ~ 14:20:12]# systemctl enable nginx.service php-fpm.service --now
Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service.
Created symlink from /etc/systemd/system/multi-user.target.wants/php-fpm.service to /usr/lib/systemd/system/php-fpm.service.

4.注意: 等高可用和负载均衡服务器配置完成后,再对博客站点进行初始化。

windows浏览器访问测试

(七)配置-反向代理

配置节点:proxy1.linux.comproxy2.linux.com

使用 nginx 配置反向代理,每个代理节点需完成以下功能:

访问http://www.linux.com/,代理到http://blog1.linux.com/和http://blog2.linux.com/

访问 http://www.linux.com/company,代理到http://company1.linux.com/company和http://company2.linux.com/company

访问http://www.linux.com/dvd,代理到http://yum.linux.com/dvd

bash 复制代码
#安装 Nginx 代理服务
[root@proxy1 ~ 14:46:03]# yum install -y nginx
#代理配置文件 /etc/nginx/conf.d/proxy.conf 分段详解
[root@proxy1 ~ 14:58:20]# cat /etc/nginx/conf.d/proxy.conf
# 上游服务器组1:博客集群
upstream blog {
    server blog1.linux.com:80;
    server blog2.linux.com:80;
}
# 上游服务器组2:企业官网集群
upstream company {
    server company1.linux.com:80;
    server company2.linux.com:80;
}
server {
    listen  80;
    server_name www.linux.com;  # 统一对外域名 www.linux.com
    
    # 根路径 / 全部转发博客业务
    location / {
        proxy_pass http://blog/;
        # 传递原始请求域名给后端
        proxy_set_header Host $host;
        # 把真实客户端IP传给后端网站,日志可记录访客真实地址
        proxy_set_header X-Real-IP $remote_addr;
        # 代理链路完整IP链(多级代理场景必备)
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
         # 传递访问协议 http/https
        proxy_set_header X-Forwarded-Proto $scheme;
    }
     
    # /company/ 路径匹配企业官网
    location /company/ {
        proxy_pass http://company/;
    }

    # /dvd 路径匹配内网YUM光盘源
    location /dvd {
        proxy_pass http://yum.linux.com/dvd;
    }
}

#启动 Nginx 并设置开机自启
[root@proxy1 ~ 14:58:26]# systemctl enable nginx --now

#proxy2 操作流程
[root@proxy2 ~ 14:46:03]# yum install -y nginx
## 配置内容和proxy1完全一致
[root@proxy2 ~ 14:46:00]# vim /etc/nginx/conf.d/proxy.conf
upstream blog {
    server blog1.linux.com:80;
    server blog2.linux.com:80;
}
upstream company {
    server company1.linux.com:80;
    server company2.linux.com:80;
}
server {
    listen  80;
    server_name www.linux.com;
    
    location / {
        proxy_pass http://blog/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forearded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forearded-Proto $scheme;
    }

    location /company/ {
        proxy_pass http://company/;
    }

    location /dvd {
        proxy_pass http://yum.linux.com/dvd;
    }
}
[root@proxy2 ~ 15:01:39]# systemctl enable nginx --now

windows浏览器访问代理节点,以proxy2为例

(八)配置-keepalived 和 LVS

配置节点ha1.linux.comha2.linux.com

使用 keepalived 和 LVS 配置高可用和负载均衡

  1. 负载均衡策略:
    • LVS模式:DR
    • 调度策略:轮询
    • 开启会话保持:50秒
  2. 提供 VIP 10.1.8.100:
  3. 配置后端服务器

整体架构说明

  1. proxy1(10.1.8.43)、proxy2(10.1.8.44):后端真实 Web 节点(公司官网两台 Nginx)

  2. ha1、ha2

    :双负载均衡调度器,部署 Keepalived+LVS (ipvsadm)

    • ha1:MASTER 主调度节点,优先级 110
    • ha2:BACKUP 备调度节点,优先级 100
  3. VIP 虚拟地址:10.1.8.100 对外统一访问入口

  4. 负载模式:LVS-DR 直接路由模式,需要后端 RealServer 配置 dummy 网卡抑制 ARP 广播

bash 复制代码
#proxy1、proxy2 后端 Web 节点统一配置 DR 环境(两台操作完全一致)
#创建 dummy 虚拟网卡,绑定 VIP 10.1.8.100/32
#type dummy:虚拟回环网卡,仅本机可见,不发广播
#ipv4.addresses 10.1.8.100/32:子网掩码 32,仅本机持有 VIP,作用:LVS-DR 模式下,后端服务器接收目的 IP 为 VIP 的数据包,必须本机存在 VIP 网卡才能正常应答。
[root@proxy1 ~ 16:05:14]# nmcli connection add type dummy ifname dummy con-name dummy ipv4.method manual ipv4.addresses 10.1.8.100/32
连接 "dummy" (3ad232bf-29f4-4435-8c3f-c5e2d8f72718) 已成功添加。
[root@proxy1 ~ 17:29:40]# nmcli con up dummy
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/3)

#修改内核 ARP 抑制参数(DR 模式核心,防止 ARP 冲突)
#arp_ignore = 1:仅当请求 IP 配置在接收网卡上时才回应 ARP
#外部机器 ARP 查询 10.1.8.100 时,后端 Web 不会应答,只有调度器 ha1/ha2 对外广播 VIP 的 MAC
#arp_announce = 2:只用报文出接口 IP 对应 MAC 回复 ARP,杜绝跨网卡 ARP 乱广播
#单独对 dummy 网卡设置,精准控制 VIP 网卡 ARP 行为
[root@proxy1 ~ 17:29:56]# cat >> /etc/sysctl.conf << EOF
> net.ipv4.conf.all.arp_ignore = 1
> net.ipv4.conf.all.arp_announce = 2
> net.ipv4.conf.dummy.arp_ignore = 1
> net.ipv4.conf.dummy.arp_announce = 2
> EOF

#sysctl -p:加载 sysctl 新配置,立即生效
[root@proxy1 ~ 17:32:26]# sysctl -p

#proxy2 操作和 proxy1 完全相同,两台 Web 都做 ARP 抑制,保证 DR 模式正常转发。
[root@proxy2 ~ 16:05:03]# nmcli connection add type dummy ifname dummy con-name dummy ipv4.method manual ipv4.addresses 10.1.8.100/32
连接 "dummy" (755eb77c-e374-4d2a-a0d0-0f55650287ba) 已成功添加。
[root@proxy2 ~ 17:32:51]# nmcli con up dummy
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/3)
[root@proxy2 ~ 17:33:00]# cat >> /etc/sysctl.conf << EOF
> net.ipv4.conf.all.arp_ignore = 1
> net.ipv4.conf.all.arp_announce = 2
> net.ipv4.conf.dummy.arp_ignore = 1
> net.ipv4.conf.dummy.arp_announce = 2
> EOF
[root@proxy2 ~ 17:33:28]# sysctl -p

#ha1 主调度节点:安装并配置 Keepalived+LVS
#安装工具
#keepalived:提供 VRRP 高可用、VIP 漂移、LVS 规则管理、后端健康检查
#ipvsadm:LVS 内核负载均衡管理工具
[root@ha1 ~ 17:33:48]# yum install -y keepalived ipvsadm

#备份默认配置文件
[root@ha1 ~ 17:35:41]# cp /etc/keepalived/keepalived.conf{,.bak}

#ha1 keepalived.conf 完整配置分段解析
[root@ha1 ~ 17:36:19]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
   router_id ha1   # 标识当前调度节点主机名
}
# VRRP实例:实现双机VIP故障自动切换
vrrp_instance proxy {
    state MASTER          # 当前为主节点
    interface ens33       # 业务物理网卡
    virtual_router_id 51  # 同组VRRP设备ID必须一致(ha1/ha2都51)
    priority 110          # 优先级,越高越优先成为主
    advert_int 1          # 1秒发送一次VRRP心跳包
    authentication {      # VRRP集群密码认证
        auth_type PASS
        auth_pass Blog@123
    }
    virtual_ipaddress {   # 对外虚拟VIP
        10.1.8.100/24
    }
}
# LVS负载均衡规则段 virtual_server
virtual_server 10.1.8.100 80 {
    delay_loop 6            # 每6秒检测后端节点健康状态
    lb_algo rr              # 调度算法:rr 轮询
    lb_kind DR              # LVS工作模式:DR直接路由
    persistence_timeout 50  # 会话保持50秒,同一客户端持续访问同一后端
    protocol TCP            # 负载TCP 80网页端口
    
    # 后端真实服务器 proxy1 10.1.8.43
    real_server 10.1.8.43 80 {
        weight 1                 # 权重1
        TCP_GET {                # TCP端口健康检查
            connect_timeout 3    # 3秒连不上判定故障
            retry 3              # 重试3次
            delay_before_retry 3 # 重试间隔3秒
        }
    }
    # 后端真实服务器 proxy2 10.1.8.44
    real_server 10.1.8.44 80 {
        weight 2              # 权重更高,分配更多请求
        TCP_CHECK {
            connect_timeout 3
            retry 3
            delay_before_retry 3
         }
     }
}

#启动 keepalived 并开机自启
[root@ha1 ~ 17:46:37]# systemctl enable keepalived.service --now

#ha2 备调度节点配置
[root@ha2 ~ 17:36:02]# cp /etc/keepalived/keepalived.conf{,.bak}
[root@ha2 ~ 17:47:17]# vim /etc/keepalived/keepalived.conf
#核心差异对比 ha1
[root@ha2 ~ 17:48:42]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
   router_id ha2         # 标识备节点
}

vrrp_instance proxy {
    state BACKUP         # 备机初始状态
    interface ens33      # 优先级低于ha1的110,平时不抢占VIP
    
    # 其余vrrp认证、virtual_ipaddress完全和ha1一致
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass Blog@123
    }
    virtual_ipaddress {
        10.1.8.100/24
    }
}

# virtual_server 负载均衡规则与ha1完全一模一样
virtual_server 10.1.8.100 80 {
    delay_loop 6
    lb_algo rr
    lb_kind DR
    persistence_timeout 50
    protocol TCP

    real_server 10.1.8.43 80 {
        weight 1
        TCP_GET {
            connect_timeout 3
            retry 3
            delay_before_retry 3
        }
    }
    real_server 10.1.8.44 80 {
        weight 2
        TCP_CHECK {
            connect_timeout 3
            retry 3
            delay_before_retry 3
         }
     }
}

#启动备节点服务
[root@ha2 ~ 17:48:48]# systemctl enable keepalived.service --now

逻辑:

  • ha1 正常运行:ha2 只监听心跳,无 VIP,不转发流量
  • ha1 宕机 /keepalived 停止:ha2 收不到心跳,自动切换 MASTER,绑定 VIP、接管 LVS 转发

(九)配置-博客站点初始化

初始化博客站点 http://www.linux.com/。

数据库配置

  • 博客链接数据 db.linux.com
  • 用户名:blog,密码 :Blog@123,数据库名:blog

站点配置

  • 站点标题:Welcome To Linux Blog !
  • 用户名:admin
  • 密码:Blog@123
  • 邮箱:laoma@linux.com

最终访问站点 http://www.linux.com/,出现如下界面。

初始化步骤如下: