个人能力有限,所以这里就不过多解释了,大部分直接都是上如何操作了。
以下为网络示意图:

其中,VIP为虚拟IP地址,其中需要配置为 Director 参与ARP网络通讯,两台Real Server 不参与进行网络通讯。
如图所见,Real Server 中的VIP,配置在了lo(本地回环)网卡中。其目的就是为了不让VIP进行网络通讯,仅在接收到Director的转发后,用于发送数据报文使用。
同时,这里我配置了VIP的网络地址掩码为32位,主要目的就是为了使Director和Real Server不使用VIP进行网络通讯,而使用RIP进行所有的网络地址通讯。
同时这里我配置了redis将用于同步PHP session配置。这里需要1个RPM安装包(php-redis),CentOS8默认源和EPEL源中刚好都没有,所以我自己做了RPM包,后面会说。

GateWay 配置

这里的网关主要是用来模拟企业路由以及防火墙,这一步可以选择不做。

这里我直接使用nftables完成NAT的设置。所以需要禁用firewalld

systemctl stop firewalld
systemctl disable firewalld

配置nftables的允许文件,指定包含2个待会需要自行编写的配置文件。

# file: /etc/sysconfig/nftables.conf

include "/etc/nftables/inet-filter.nft"        # 注意,这里一定要加引号,否则会报错。
include "/etc/nftables/ip-nat.nft"

这个配置文件时用于INPUT链接的防火墙规则。

# file: /etc/nftables/inet-filter.nft

#!/usr/sbin/nft -f

table inet filter {
    chain INPUT {
        type filter hook input priority 0; policy drop;
        ct state established accept                        # 允许接收已连接的数据包。
        tcp dport ssh ct state established,new accept      # 允许ssh请求。
        icmp type echo-request accept                      # 允许icmp请求。
    }
}

这个配置文件时用于配置NAT使用的规则。

# file: /etc/nftables/ip-nat.nft

#!/usr/sbin/nft -f

table ip nat {
    chain PREROUTING {
        type nat hook prerouting priority -100; policy accept;
        ip daddr 192.168.10.250 tcp dport http dnat to 10.0.0.250        # DNAT转换,访问 192.168.10.250:80 的连接转换至 10.0.0.250:80
    }

    chain POSTROUTING {
        type nat hook postrouting priority 100; policy accept;
        ip saddr 10.0.0.0/24 snat to 192.168.10.250 fully-random         # SNAT转化,10.0.0.0/24发送的请求,转化至
    }
}

注意需要配置开启路由转发功能,否则将使用NAT功能。

# file: /usr/lib/sysctl.d/50-default.conf

……
net.ipv4.ip_forward = 1
……

使配置生效

sysctl -p /usr/lib/sysctl.d/50-default.conf

编写完配置文件后,启动nftables,使其生效。

systemctl start nftables
systemctl enable nftables

Director 配置

这里我配置的是DR模式,所有服务器需要都在同一网段才能使用,需要注意。
首先需要安装必须软件,yum 源可以看我的令一篇文章CentOS8 yum/dnf 配置(完整,多镜像源)

yum install ipvsadm
ip address add 10.0.0.250/32 dev ens33        # 注意,这里是故意使用32位的掩码
# 这里设置的32位掩码,主要就是不让 10.0.0.250进行网络的连接,只用于接受web请求。
# Director主机的网络通讯全部通过 10.0.0.101 来进行通讯。
ip address add 10.0.0.101/24 dev ens33        # 这个IP将进行所有的网络通讯。

下面才是LVS的配置。
注意:由于LVS的工作机制,LVS需要在内核中完成数据包的分发,这里刚好与防火使冲突的,所以需要优先关闭防火墙。

systemctl stop firewalld
systemctl disable firewalld
ipvsadm -C
ipvsadm -A -t 10.0.0.250:80 -s wrr
ipvsadm -a -t 10.0.0.250:80 -r 10.0.0.102:80 -g -w 1
ipvsadm -a -t 10.0.0.250:80 -r 10.0.0.103:80 -g -w 1

保存LVS配置

ipvsadm-save  -n > /etc/sysconfig/ipvsadm
systemctl enable ipvsadm
# 这里以及配置了LVS,所以不需要再启动了。

注意需要配置开启路由转发功能,否则将无法转发web请求。

# file: /usr/lib/sysctl.d/50-default.conf

……
net.ipv4.ip_forward = 1
……

使配置生效

sysctl -p /usr/lib/sysctl.d/50-default.conf

Real Server 配置

这里只演示一台的Real Server 配置,其余服务器配置类似。
同时需要注意,Real Server 也需要配置一个VIP地址(10.0.0.250)。

ip address add 10.0.0.250/32 dev lo    # 这里设置32位的掩码作用于Director相同。
# 同时需要设置在lo中,其主要目的就是为了不让Real Server参与网络通讯(arp),否则将引起网络混乱。
ip address add 10.0.0.102/24 dev ens33    # 配置RIP地址,用于通讯

注意,这里需要忽略arp的请求,保证只有Director可以响应arp报文。
这里通过文件来实现。

# file: /usr/lib/sysctl.d/50-default.conf

……
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
……

使配置生效

sysctl -p /usr/lib/sysctl.d/50-default.conf

这样配置就可以接受由Director转发的数据报文了。下面进行Web服务器的配置,主要就是需要配置关于同步的问题。

Web 配置

安装redis服务器

这里需要安装redis服务器用于PHP session的存储
由于Director的负载压力会比RealServer服务器压力小,所以我将redis服务器安装在Director(10.0.0.101)服务器上了。

yum install redis    # 直接安装即可
# file: /etc/redis.conf

……
bind 0.0.0.0        # 修改监听地址位任意地址。(默认监听 127.0.0.1)
……

重启服务器使其生效。

systemctl enable redis
systemctl restart redis

PHP 环境配置

这里需要将PHP session存入至redis,需要安装 php-redis以提供支持,CentOS8的源和EPEL源中没有php-redis,所以我自己编译了一个。
在此说明,我不承担任何因使用我制作的软件而照成的任意问题,请勿将软件包安装至生产环境中。

cd /etc/yum.repos.d/
wget https://somata.gitee.io/centos-extension/CentOS-Extension.repo
yum install php-redis httpd

这里配置使php session存储至redis中。
配置php.ini

# file:/etc/php.ini

……
session.save_handler = redis        #指定存储至redis中。
session.save_path = tcp://10.0.0.101:6379    # 指定存储路径
……

配置php-fpm的允许时文件

# file:vim /etc/php-fpm.d/www.conf

……
php_flag[display_errors] = on        # 开启错误显示,有助于排错。不用时记得关闭。
php_value[session.save_handler] = redis
php_value[session.save_path]    = tcp://10.0.0.101:6379
……

启动web服务器

systemctl start httpd
systemctl enable httpd
# 注:当启动httpd时,会检测依赖将 php-fpm也一块启动了,如果修改了php的相关设置,记得重启 php-fpm 而不是 httpd.
firewall-cmd --add-service=http --permanent
firewall-cmd --reload
# 注意需要开启允许 httpd 任意连接,否则php将无法连接redis.
setsebool httpd_can_network_connect on -P

这里再编写一个php session的测试web。

# file: /var/www/html/index.php

<?php
// print hostname
print(gethostname() . '<br />');
//session configure
session_start();
$redisKey = 'PHPREDIS_SESSION:' . session_id();
if(@$_SESSION['message']){
        print("Frist login. <br />");
}else{
        $_SESSION['message'] = "Session is work.";
}

echo $_SESSION["message"] , "<br/>";
echo "Redis key = " . $redisKey . "<br/>";
// print redis message
echo "This message is from redis", "<br/>";
$redis = new Redis();
$redis->connect('10.0.0.101', 6379);
$redis->auth('');

echo $redis->get($redisKey);

目录同步

目录同步的软件由很多,甚至可以自己手动写一个,这里就不过多编写了,可以选择使用rsync

本文经「原本」原创认证,作者乾坤盘,访问yuanben.io查询【2V0U1A7Z】获取授权信息。

最后修改:2020 年 01 月 22 日 09 : 03 PM
如果觉得我的文章对你有用,请随意赞赏
或者点击网页中小广告,你的鼓励都将成为我写作的动力