有时候会有一种需求,将多个不同的应用用同一个集群进行调度。比如http 和 https是两个集群服务。访问电商网站浏览商品的时候使用的是http链接。但是如果要购买的时候会跳转到https链接。但是https和http不是同一个集群服务。如果跳转到不是同一台主机。会话就没办法保持。可能这时候商品就没了,这时候怎么办?我们就可以借助防火墙打标机来分类报文,将http和https当作同一个集群服务,来做会话保持。
方法:
#打标记方法(在Director主机):
iptables -t mangle -A PREROUTING -d $vip -p $proto --dport $port -j MARK --set-mark NUMBER
#示例:将目的ip是192.168.253.192,目的端口是80和443的数据包都打上80443的标记
iptables -t mangle -A PREROUTING -d 192.168.253.192 -p tcp -m multiport --dport 80,443 -j MARK --set-mark 80443
#基于标记定义集群服务:
ipvsadm -A -f NUMBER [options]
#示例:新增一个集群服务,基于防火墙标记进行划分,调度方法为轮询
ipvsadm -A -f 80443 -s rr
实验环境:
RS
RS | RIP | VIP | 系统版本 | 软件 | 提供的服务 |
---|---|---|---|---|---|
RS1 | 192.168.253.129 | 192.168.253.192 | CentOS6 | Nginx | http,https |
RS2 | 192.168.253.140 | 192.168.253.192 | CentOS7 | Nginx | http,https |
DR
DR | DIP | VIP | 系统版本 | 软件 | 提供的服务 |
---|---|---|---|---|---|
DR | 192.168.253.128 | 192.168.253.192 | CentOS7 | ipvsadm,iptables | 四层负载均衡 |
LVS使用的模式:DR
第一步:RS1端安装Nginx
#添加阿里景象站的epel源,不同的系统方式不一样,RS1是CentOS6系统
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
#yum安装Nginx
yum install nginx -y
mkdir /etc/nginx/ssl
第二步:RS2端安装Nginx
#添加阿里景象站的epel源,不同的系统方式不一样,RS2是CentOS7系统
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
#yum安装Nginx
yum install nginx -y
mkdir /etc/nginx/ssl
第三步:在DR服务器上自建CA,并签发证书
#自建CA
(umask 077; openssl genrsa -out /etc/pki/CA/private/cakey.pem 4096)
openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 3655
mkdir -pv /etc/pki/CA/{certs,crl,newcerts}
touch /etc/pki/CA/{serial,index.txt}
echo 01 > /etc/pki/CA/serial
#签发证书,域名为www.ice.com
mkdir -pv ~/nginx
(umask 077; openssl genrsa -out ~/nginx/ssl.key 2048)
openssl req -new -key ~/nginx/ssl.key -out ~/nginx/ssl.csr -days 365
openssl ca -in ~/nginx/ssl.csr -out ~/nginx/ssl.crt
第四步:将DR签发的证书,分发到RS1和RS2的/etc/nginx/ssl目录中
scp ~/nginx/ssl.key root@192.168.253.140 /etc/nginx/ssl/ssl.key
scp ~/nginx/ssl.key root@192.168.253.129:/etc/nginx/ssl/ssl.key
scp ~/nginx/ssl.crt root@192.168.253.140:/etc/nginx/ssl/ssl.crt
scp ~/nginx/ssl.crt root@192.168.253.129:/etc/nginx/ssl/ssl.crt
第五步:修改RS1和RS2的nginx配置文件,配置http和https连接
RS1端配置
mkdir -pv /var/www/html/{http,https}
echo "192.168.253.129:80">/var/www/html/http/index.html
echo "192.168.253.129:443">/var/www/html/https/index.html
nginx配置文件
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
root /var/www/html/http;
location / {
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
server {
listen 443 ssl;
server_name www.ice.com;
ssl_certificate /etc/nginx/ssl/ssl.crt;
ssl_certificate_key /etc/nginx/ssl/ssl.key;
ssl_session_cache shared:SSL:1m;
}
}
RS2端配置
mkdir -pv /var/www/html/{http,https}
echo "192.168.253.140:80">/var/www/html/http/index.html
echo "192.168.253.140:443">/var/www/html/https/index.html
nginx配置文件
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024;
}
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 /var/www/html/http;
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 {
}
}
server {
listen 443 ssl http2 default_server;
root /var/www/html/https;
ssl_certificate "/etc/nginx/ssl/ssl.crt";
ssl_certificate_key "/etc/nginx/ssl/ssl.key";
ssl_session_cache shared:SSL:1m;
}
}
第六步:在RS1和RS2上修改内核参数,设置VIP
ifconfig lo:0 192.168.253.192/32 up
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
第七步:DR:配置VIP,借助防火墙做标记,将http和https当作同一个集群
ifconfig ens33:0 192.168.253.192 up
iptables -F
iptables -t mangle -A PREROUTING -d 192.168.253.192 -p tcp -m multiport --dport 80,443 -j MARK --set-mark 80443
ipvsadm -A -f 80443 -s rr
ipvsadm -a -f 80443 -r 192.168.253.129 -g
ipvsadm -a -f 80443 -r 192.168.253.140 -g
第八步:测试
我们在这几台服务器之外重新开了一台服务器,假装用户,ip为192.168.253.158,需要将自建的CA文件发送过去
##DR端操作
scp /etc/pki/CA/cacert.pem root@192.168.253.158:~/
然后修改一下/etc/hosts文件
#假装用户的服务器修改/etc/hosts
#添加一条
192.168.253.192 www.ice.com
然后可以访问测试了
这里可以看出。将80和443当作一个集群服务,所以进行轮询第一次是访问192.168.253.140的80端口。第二次则访问192.168.253.129的443端口。这样一直下去。
第九步:修改DR上的ipvsadm的调度算法。
修改调度算法为sh,进行ip绑定,让相同主机访问的服务器是同一个,这样就可以在http切换https的时候也会在同一个服务器达到会话保持的目的。
#DR端
ipvsadm -E -f 80443 -s sh
第十步:再次测试
我们修改了调度方法之后再次测试
现在可以看到全部都绑定在了192.168.253.140这个服务器上了。