一, 实验环境:
1. 各软件版本:
系统版本: CentOS Linux release 7.4.1708 (Core)
php 版本: PHP 7.2
nginx 版本: nginx-1.12.2
数据库版本: MariaDB 10
WordPress 版本: 4.9.4
关闭防火墙与 selinux
2. 实验架构及 IP 分配 (为模拟现实场景, 所有虚拟机网卡类型均为桥接):
架构图: 上传不了... 过几天再试
lvs-dr 负载均衡模型相对于 lvs-nat 类型的优点是大大减少了调度器的负载, 大幅提高了集群的并发等级, 但配置步骤会稍微繁琐一点, 原理也较 nat 类型会复杂一些
实现原理:
:client 端向目标 IP(VIP) 发送请求, 经由路由器和交换机设备和后, 此时的请求数据包头文件的目标 MAC 值为调度器的 MAC, 源 MAC 值为 client 的 MAC, 目标 IP 为 VIP, 源 IP 为 CIP.
: 调度器经调度算法会选择一台 RS, 并将客户端请求头文件重新封装, 重新封装后, 目标 MAC 变为经调度算法选择后的 RS 的 MAC 值, 源 MAC 为调度器的 MAC 值
:RS 收到调度器发来的请求并拆包处理, 拆包后包头文件目标 IP 依然为 VIP, 源 IP 依然为 CIP, 因为在 RS 上也配置了 VIP, 所以 RS 会将请求包处理并直接响应给 client, 不会再经由调度器.
疑问:
为什么调度器和 RS 都配置 VIP,client 的请求只会到达调度器, 而不会产生 IP 冲突?
client 在向 VIP 发送请求时, 会经过路由器交换机, 交换机会将请求在局域网内广播出去 (调度器和 RS 在同一局域网), 此时只要配置了 VIP 的主机都会响应, 造成 IP 冲突,
要解决这个问题, 就需要阻断交换机的广播送达 RS, 让 client 的请求只到达调度器, 有三种办法可以实现:
: 在路由器上做 ARP 绑定 (此方法不推荐)
:arptables
: 修改 RS 内核参数 (推荐此方法)
Linux 默认的内核转发规则是当请求发送来时, 只要是同一设备上的所有 IP 都会被通知并响应, 所以在内核将默认规则修改即可解决上诉问题. 配置过程会在后面详细介绍.
lvs 负载均衡一台:
安装 ipvsadm
VIP:192.168.0.99(模拟公网 IP, 域名 www.ready.cn) DIP:192.168.0.103
realserver 两台:
两台都安装 nginx+PHP, 且保持配置一致
RIP1:192.168.0..11 RS2:192.168.0.22
数据库服务器一台:
安装 MariaDB
IP:192.168.0.33
二, 所需软件安装配置, 并测试 PHP 是否正常解析 (此步骤与 lvs-nat 搭建相同)
1.RS1 和 RS2 安装 nginx+PHP:
a > 安装 epel 源
rpm -Uvh https://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/e/epel-release-7-11.noarch.rpm
b>yum 安装 nginx
yum install -y nginx
c>yum 安装 PHP
d > 测试两台 RS 是否可以正常接收并响应 web 请求, 添加 nginx server, 创建网站目录, 将用户请求结尾为. php 的 URL 交给 php-fpm 解析, 并创建 phpinfo 做页面测试
- vim /etc/nginx/conf.d/php.conf
- ######
- server {
- listen 80;
- server_name www.ready.org; #因为是做试验, 所以将 hosts 中添加本地域名解析
- location / {
- root html/php; #nginx 配置中网站的默认根路径为 / usr/share/nginx/, 这里指定的是相对路径
- index index.html index.htm;
- }
- location ~ .*.(php|php5)?$ { #以任意开头以. php 结尾的 URI 用此 location 做匹配
- root html/php;
- fastcgi_pass 127.0.0.1:9000; #将请求交由 fastcgi(php-fpm) 处理
- fastcgi_index index.php;
- include fastcgi.conf;
- }
- }
- ######
- mkdir -p /usr/share/nginx/html/php/ #创建网站目录 (不是必须步骤, 也可使用默认目录)
- vim /usr/share/nginx/html/php/index.php
- ######
- <?php phpinfo(); ?>
- ######
e > 将 nginx 启动并设置开机启动
- systemctl start nginx
- systemctl enable nginx
f > 开启 php-fpm 并设置为开机启动
g > 浏览器访问 www.ready.org 与 www.ready.org/index.php, 显示以下界面便表示 nginx 与 PHP 已安装成功.
然后删除 index.php 文件, 安全因素.
以上步骤不涉及负载均衡的使用, 下面进行加入负载均衡服务器的配置测试, 先删除之前配置好的 nginx 测试 server, 或将其注释掉
mv /etc/nginx/conf.d/php.conf /etc/nginx/conf.d/php.conf.backup
若是要将 RS1,RS2 并入负载均衡集群, 则需将 RS1,RS2 设置为监听本机 80 端口且将结尾为. php 的 URI 交 php-fpm 解析
即修改 / etc/nginx/nginx.conf 将匹配 PHP 解析的 location 加入默认配置即可, 修改如下:
- vim /etc/nginx/nginx.conf
- ######
- worker_processes 1;
- events {
- worker_connections 1024;
- }
- http {
- include mime.types;
- default_type application/octet-stream;
- 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;
- server {
- listen 80;
- #server_name _; #我理解的是此负载均衡集群中没有涉及域名解析, 所以 server_name 可以省略
- location / {
- root /usr/share/nginx/html/php; #我觉得 root 路径尽量要用绝对路径, 最好是写在 location 中, 这样便于管理, 方便查阅
- index index.php index.html index.htm; #不要忘了加 index.php, 不加会导致只输入域名时返回 403 错误
- }
- location ~ .*\.(php|php5)?$ {
- root /usr/share/nginx/html/php;
- index index.php;
- fastcgi_pass 127.0.0.1:9000;
- fastcgi_index index.php;
- include fastcgi.conf;
- }
- }
- }
- ######
2. 在 192.168.0.103 主机上安装 ipvsadm 并配置
a > 安装 ipvsadm
yum install -y ipvsadm
b > 在网卡上添加 VIP
- ifconfig ens33:0 192.168.0.99 netmask 255.255.255.255 broadcast 192.168.0.99 up #掩码最好全是 255
- (此处是将 VIP 与 DIP 配置在同一网卡上, 后续实验是否能将它们配置在不同网卡上)
c > 添加 ipvsadm 负载均衡规则
- ipvsadm -A -t 192.168.0.99:80 -s rr
- ipvsadm -a -t 192.168.0.99:80 -r 192.168.0.11 -g
- ipvsadm -a -t 192.168.0.99:80 -r 192.168.0.22 -g
3. 在 RS1,RS2 上添加 VIP 并限制报文通告与相应规则
a > 在 lo(回环接口) 上配置 VIP
ifconfig lo:0 192.168.0.99 netmask 255.255.255.255 broadcast 192.168.0.99 up
b > 添加路由表, 将 192.168.0.99 的请求都必须经由 lo:0 处理, 防止 RS 拆包后将请求响应给调度器
route add -host 192.168.0.99 dev lo:0
c > 修改 RS 内核参数, 限制报文通告与相应规则
创建脚本, 批量修改内核参数, 脚本如下:
- #!/bin/bash
- #
- case $1 in
- start)
- echo 1> /proc/sys/net/ipv4/conf/all/arp_ignore
- echo 1> /proc/sys/net/ipv4/conf/lo/arp_ignore
- echo 2> /proc/sys/net/ipv4/conf/all/arp_announce
- echo 2> /proc/sys/net/ipv4/conf/lo/arp_announce
- echo "The RS Server is Ready!"
- ;;
- stop)
- ifconfig $dev down
- echo 0> /proc/sys/net/ipv4/conf/all/arp_ignore
- echo 0> /proc/sys/net/ipv4/conf/lo/arp_ignore
- echo 0> /proc/sys/net/ipv4/conf/all/arp_announce
- echo 0> /proc/sys/net/ipv4/conf/lo/arp_announce
- echo "The RS Server is Canceled!"
- ;;
- *)
- echo "Usage: $(basename $0) start|stop"
- exit 1
- ;;
- esac
此步骤主要是修改 arp_ignore,arp_announce 两参数, 所有 RS 步骤相同
******
对 linux 主机来讲, 默认情况下地址是属于内核而不是网卡的, 所以默认状态下同一主机的各网卡默认都是知道其他网卡的地址数据的,
当请求到达主机某一网卡时, 此主机的其他网卡也能收到通知, 若地址与自己相符, 也会发出响应. 通过修改内核 arp_ignore,arp_announce 两参数可以配置通告响应限制等级
arp_ignore: 限制响应级别
0: 默认值, 使同一主机任意网卡配置的任意地址进行响应
1: 仅在请求的目的 IP 配置在本地主机网卡地址相同时, 才给予响应
arp_announce: 限制通告级别
0: 默认值, 把本机上的所有网卡的所有信息向本机所有接口进行通告
1: 尽量避免默认情况
2: 必须避免默认情况
4. 安装并配置 MariaDB
a > 在 192.168.0.33 上 yum 安装 MariaDB
- vim /etc/yum.repos.d/mariadb.repo
- ######
- [mariadb]
- name = MariaDB
- baseurl = https://mirrors.ustc.edu.cn/mariadb/yum/10.2/centos7-amd64
- gpgkey= https://mirrors.ustc.edu.cn/mariadb/yum/RPM-GPG-KEY-MariaDB
- gpgcheck=1
- ######
- yum install -y MariaDB-server
b > 配置数据库
- mysql_secure_installation #初始化数据库, 设置 root 密码, 匿名用户权限等
- mysql -uroot -p123456 #登入数据库进行用户及库的创建与配置
- GRANT ALL PRIVILEGES ON . TO 'mysql'@'%'IDENTIFIED BY '123456' WITH GRANT OPTION; #创建账户 mysql, 密码为 123456, 并允许任意 IP 访问此账户数据库, 权限为 ALL
- CREATE DATABASE wordpress; #创建名为 wordpress 的库, 安装完 WordPress 后会要求在数据库创建库, 这里事先创建好
- quit
5. 安装 WordPress
a > 将下载好的 WordPress 包解压至已创建好的 / usr/share/nginx/html/php 目录下
b > 为模拟互联网环境, 将'www.ready.cn 192.168.1.99'hosts 文件加入本地解析规则
c > 浏览器输入 www.ready.cn, 按提示步骤进行操作便可安装完成
来源: http://www.bubuko.com/infodetail-2725981.html