个人能力有限,所以这里就不过多解释了,大部分直接都是上如何操作了。
以下为网络示意图:
其中,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】获取授权信息。