LVS+Keepalived+Nginx部署

nick814 Linux 163 次浏览 3条评论

说明

系统信息

机器名

IP

系统版本

软件

nhidc-lvs01

10.0.40.10

CentOS7.6

Lvs keepalived

nhidc-lvs02

10.0.40.11

CentOS7.6

Lvs keepalived

nhidc-ng01

10.0.40.12

CentOS7.6

Nginx

nhidc-ng02

10.0.40.13

CentOS7.6

Nginx

架构图

搭建准备

每台机器都需要这样做,这套环境对于时间要求很高,所以需要ntp服务器,请输入你们内网自己的ntp服务器ip,一般我们用域控来当ntp。

安装wget和ntp

yum -y install wget

yum -y install ntp

vi /etc/ntp.conf

server 192.168.77.249 prefer

server 192.168.77.250 prefer

设置下ntp开机启动,并同步下ntp

systemctl start ntpd.service

systemctl enable ntpd.service

firewall-cmd –zone=public –add-port=123/udp –permanent

firewall-cmd –reload

ntpdate -u 192.168.77.250

ntpdate -d 192.168.77.250

配置YUM

cd /etc/yum.repos.d/

mkdir old

mv CentOS-* old/

wget http://mirrors.163.com/.help/CentOS7-Base-163.repo

yum clean all

yum makecache

关闭SElinux

vi /etc/selinux/config

permissive

setenforce 0

getenforce

优化参数

echo “* soft nofile 65535” >> /etc/security/limits.conf
echo “* hard nofile 65535” >> /etc/security/limits.conf

创建脚本目录

以后机器的脚本都丢在这个目录下,这样更加清晰

mkdir -p /data/script

关闭后端Nginx的防火墙

LVS在前端我们防火墙不关闭,后端的Nginx关闭防火墙

systemctl stop firewalld

systemctl disable firewalld

配置2台LVS

我们采用DR负载均衡和wrr负载调度算法。

ipvs安装

LVS无需安装,安装的是管理工具,第一种叫ipvsadm,第二种叫keepalive。ipvsadm是通过命令行管理,而keepalive读取配置文件管理。

分别在lvs01和lvs02执行如下操作:

yum -y install ipvsadm

把ipvsadm模块加载进系统

ipvsadm

lsmod | grep ip_vs

keepalived安装

yum -y install keepalived


keepalived配置

lvs01配置

一般网上的文档,只做了80端口,我的这份是加了443端口,提供2个端口服务

mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak

vi /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {

router_id lvs01 #router_id 机器标识,通常为hostname,但不一定非得是hostname。故障发生时,邮件通知会用到。

}

vrrp_instance VI_1 { #vrrp实例定义部分

state MASTER #设置lvs的状态,MASTER和BACKUP两种,必须大写

interface ens192 #设置对外服务的接口

virtual_router_id 100 #设置虚拟路由标示,这个标示是一个数字,同一个vrrp实例使用唯一标示

priority 100 #定义优先级,数字越大优先级越高,在一个vrrp——instance下,master的优先级必须大于backup

advert_int 1 #设定master与backup负载均衡器之间同步检查的时间间隔,单位是秒

notify_master “/data/script/mail_notify.sh master” #Keepalived进入MASTER状态执行脚本

notify_backup “/data/script/mail_notify.sh backup” #Keepalived进入BACKUP状态执行脚本

notify_fault “/data/script/mail_notify .sh fault” #Keepalived进入FAULT状态执行脚本

authentication { #设置验证类型和密码

auth_type PASS #主要有PASS和AH两种

auth_pass 1111 #验证密码,同一个vrrp_instance下MASTER和BACKUP密码必须相同

}

virtual_ipaddress { #设置虚拟ip地址,可以设置多个,每行一个

10.0.40.100

}

}

virtual_server 10.0.40.100 80 { #设置虚拟服务器,需要指定虚拟ip和服务端口

delay_loop 6 #健康检查时间间隔

lb_algo wrr #负载均衡调度算法

lb_kind DR #负载均衡转发规则

persistence_timeout 50 #设置会话保持时间,对动态网页非常有用

protocol TCP #指定转发协议类型,有TCP和UDP两种

real_server 10.0.40.12 80 { #配置服务器节点1,需要指定real server的真实IP地址和端口

weight 1 #设置权重,数字越大权重越高

TCP_CHECK { #realserver的状态监测设置部分单位秒

connect_timeout 10 #连接超时为10秒

retry 3 #重连次数

delay_before_retry 3 #重试间隔

# connect_port 80 #连接端口为80,要和上面的保持一致

}

}

real_server 10.0.40.13 80 { #配置服务器节点1,需要指定real server的真实IP地址和端口

weight 1 #设置权重,数字越大权重越高

TCP_CHECK { #realserver的状态监测设置部分单位秒

connect_timeout 10 #连接超时为10秒

retry 3 #重连次数

delay_before_retry 3 #重试间隔

# connect_port 80 #连接端口为80,要和上面的保持一致

}

}

}

virtual_server 10.0.40.100 443 { #设置虚拟服务器,需要指定虚拟ip和服务端口

delay_loop 6 #健康检查时间间隔

lb_algo wrr #负载均衡调度算法

lb_kind DR #负载均衡转发规则

persistence_timeout 50 #设置会话保持时间,对动态网页非常有用

protocol TCP #指定转发协议类型,有TCP和UDP两种

real_server 10.0.40.12 443 { #配置服务器节点1,需要指定real server的真实IP地址和端口

weight 1 #设置权重,数字越大权重越高

TCP_CHECK { #realserver的状态监测设置部分单位秒

connect_timeout 10 #连接超时为10秒

retry 3 #重连次数

delay_before_retry 3 #重试间隔

}

}

real_server 10.0.40.13 443 { #配置服务器节点1,需要指定real server的真实IP地址和端口

weight 1 #设置权重,数字越大权重越高

TCP_CHECK { #realserver的状态监测设置部分单位秒

connect_timeout 10 #连接超时为10秒

retry 3 #重连次数

delay_before_retry 3 #重试间隔

}

}

}

 

lvs02配置

! Configuration File for keepalived

global_defs {

router_id lvs02 #router_id 机器标识,通常为hostname,但不一定非得是hostname。故障发生时,邮件通知会用到。

}

vrrp_instance VI_1 { #vrrp实例定义部分

state BACKUP #设置lvs的状态,MASTER和BACKUP两种,必须大写

interface ens192 #设置对外服务的接口

virtual_router_id 100 #设置虚拟路由标示,这个标示是一个数字,同一个vrrp实例使用唯一标示

priority 99 #定义优先级,数字越大优先级越高,在一个vrrp——instance下,master的优先级必须大于backup

advert_int 1 #设定master与backup负载均衡器之间同步检查的时间间隔,单位是秒

notify_master “/data/script/mail_notify.sh master” #Keepalived进入MASTER状态执行脚本

notify_backup “/data/script/mail_notify.sh backup” #Keepalived进入BACKUP状态执行脚本

notify_fault “/data/script/mail_notify .sh fault” #Keepalived进入FAULT状态执行脚本

authentication { #设置验证类型和密码

auth_type PASS #主要有PASS和AH两种

auth_pass 1111 #验证密码,同一个vrrp_instance下MASTER和BACKUP密码必须相同

}

virtual_ipaddress { #设置虚拟ip地址,可以设置多个,每行一个

10.0.40.100

}

}

virtual_server 10.0.40.100 80 { #设置虚拟服务器,需要指定虚拟ip和服务端口

delay_loop 6 #健康检查时间间隔

lb_algo wrr #负载均衡调度算法

lb_kind DR #负载均衡转发规则

persistence_timeout 50 #设置会话保持时间,对动态网页非常有用

protocol TCP #指定转发协议类型,有TCP和UDP两种

real_server 10.0.40.12 80 { #配置服务器节点1,需要指定real server的真实IP地址和端口

weight 1 #设置权重,数字越大权重越高

TCP_CHECK { #realserver的状态监测设置部分单位秒

connect_timeout 10 #连接超时为10秒

retry 3 #重连次数

delay_before_retry 3 #重试间隔

# connect_port 80 #连接端口为80,要和上面的保持一致

}

}

real_server 10.0.40.13 80 { #配置服务器节点1,需要指定real server的真实IP地址和端口

weight 1 #设置权重,数字越大权重越高

TCP_CHECK { #realserver的状态监测设置部分单位秒

connect_timeout 10 #连接超时为10秒

retry 3 #重连次数

delay_before_retry 3 #重试间隔

# connect_port 80 #连接端口为80,要和上面的保持一致

}

}

}

virtual_server 10.0.40.100 443 { #设置虚拟服务器,需要指定虚拟ip和服务端口

delay_loop 6 #健康检查时间间隔

lb_algo wrr #负载均衡调度算法

lb_kind DR #负载均衡转发规则

persistence_timeout 50 #设置会话保持时间,对动态网页非常有用

protocol TCP #指定转发协议类型,有TCP和UDP两种

real_server 10.0.40.12 443 { #配置服务器节点1,需要指定real server的真实IP地址和端口

weight 1 #设置权重,数字越大权重越高

TCP_CHECK { #realserver的状态监测设置部分单位秒

connect_timeout 10 #连接超时为10秒

retry 3 #重连次数

delay_before_retry 3 #重试间隔

}

}

real_server 10.0.40.13 443 { #配置服务器节点1,需要指定real server的真实IP地址和端口

weight 1 #设置权重,数字越大权重越高

TCP_CHECK { #realserver的状态监测设置部分单位秒

connect_timeout 10 #连接超时为10秒

retry 3 #重连次数

delay_before_retry 3 #重试间隔

}

}

}

 

安装邮件服务

yum install mailx -y

配置邮件账户,mail.rc最后加上下面的东西

vi /etc/mail.rc

set from=xxx@qq.com #发件人邮箱地址

set smtp=smtp.qq.com #smtp地址

set smtp-auth-user=xxxx@qq.com #邮箱用户名(测试下来qq邮箱需要把用户名打全后面要带qq.com)

set smtp-auth-password=xxxx #邮箱密码(邮件密码是smtp代理授权码)

set smtp-auth=login #邮箱验证方式

 

测试邮件发送

echo “hello world” | mail -s “hello” xxxx@xxxx.com

配置邮件发送脚本

vi /data/script/mail_notify.sh

#!/bin/bash

echo “10.0.40.100 $1 状态被激活,请确认keepalived服务运行状态”|mail -s “keepalived状态切换警告” xxx@xxx.com

 

脚本授权

chmod 755 /data/script/mail_notify.sh

chmod u+x /data/script/mail_notify.sh

在两台 lvs 服务器上开启路由转发功能

启用ip转发

echo “net.ipv4.ip_forward = 1” >> /etc/sysctl.conf

sysctl -p


系统防火墙配置

修改iptables配置,在主机上放开备机进来的流量,在备机也做相似设置,并开启80443端口:

firewall-cmd –zone=public –add-port=80/tcp –permanent

firewall-cmd –zone=public –add-port=443/tcp –permanent

firewall-cmd –direct –permanent –add-rule ipv4 filter INPUT 0 –in-interface ens192 –destination 224.0.0.18 –protocol vrrp -j ACCEPT

firewall-cmd –reload

配置2台Nginx

安装依赖

yum -y install gcc pcre-devel openssl-devel git patch perl-devel perl-ExtUtils-Embed net-tools.x86_64

安装Nginx

cd /tmp/

wget http://nginx.org/download/nginx-1.16.1.tar.gz

tar -zxvf nginx-1.16.1.tar.gz

编译Nginx

cd nginx-1.16.1

./configure –prefix=/usr/local/nginx –sbin-path=/usr/sbin/nginx –conf-path=/usr/local/nginx/conf/nginx.conf –error-log-path=/var/log/nginx/error.log –http-log-path=/var/log/nginx/access.log –http-client-body-temp-path=/var/lib/nginx/tmp/client_body –http-proxy-temp-path=/var/lib/nginx/tmp/proxy –pid-path=/var/run/nginx.pid –lock-path=/var/lock/subsys/nginx –user=nginx –group=nginx –with-http_realip_module –with-http_stub_status_module –with-http_ssl_module –with-openssl-opt=enable-tlsext –with-http_sub_module –with-http_gzip_static_module

make && make install

验证安装

我们到我们的/usr/local/nginx 目录看看,文件都在就是安装成功了。

cd /usr/local/nginx/

ls

nginx -t

配置Nginx

realserver.sh配置

打开Nginx所在服务器的”路由”功能、关闭”ARP查询”功能并设置回环ip,nginx01和nginx02配置如下:

vi /data/script/realserver.sh

#!/bin/bash

VIP=10.0.40.100

case “$1” in

start)

echo ” start LVS of REALServer”

/sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up

echo “1” >/proc/sys/net/ipv4/conf/lo/arp_ignore

echo “2” >/proc/sys/net/ipv4/conf/lo/arp_announce

echo “1” >/proc/sys/net/ipv4/conf/all/arp_ignore

echo “2” >/proc/sys/net/ipv4/conf/all/arp_announce

;;

stop)

/sbin/ifconfig lo:0 down

echo “close LVS Directorserver”

echo “0” >/proc/sys/net/ipv4/conf/lo/arp_ignore

echo “0” >/proc/sys/net/ipv4/conf/lo/arp_announce

echo “0” >/proc/sys/net/ipv4/conf/all/arp_ignore

echo “0” >/proc/sys/net/ipv4/conf/all/arp_announce

;;

*)

echo “Usage: $0 {start|stop}”

exit 1

esac

此脚本用于节点服务器绑定 VIP ,并抑制响应 VIP 的 ARP 请求。这样做的目的是为了不让关于 VIP 的 ARP 广播时,节点服务器应答( 因为节点服务器都绑定了 VIP ,如果不做设置它们会应答,就会乱套 )。

 

给realserver.sh脚本授予执行权限:

chmod 755 /data/script/realserver.sh

chmod u+x /data/script/realserver.sh

创建nginx运行使用的用户nginx

groupadd nginx

useradd -g nginx nginx

设置Nginx配置文件

备份配置文件

cp /usr/local/nginx/conf/nginx.conf /usr/local/nginx/conf/nginx.conf.bak

添加目录

mkdir -p /var/lib/nginx/tmp/

mkdir -p /usr/local/nginx/logs/

mkdir -p /var/logs/nginx/

添加权限

chown nginx.nginx /var/logs/nginx -R

修改配置文件

Log日志文件格式

远程IP地址,预留 存用户标识,时间,请求地址,http请求状态码,upstream状态码 — 现在nginx是双热备了,body大小,跳转来源,真实ip,域名,请求时间,请求过程中,upstream响应时间,upstream 的IP,agent

 

vi nginx.conf

 

# /usr/local/nginx/conf/nginx.conf

user nginx;

worker_processes auto ;

worker_rlimit_nofile 65535;

pid /usr/local/nginx/logs/nginx.pid;

 

error_log /var/log/nginx/error.log;

#error_log logs/error.log notice;

#error_log logs/error.log info;

 

 

 

events {

use epoll;

worker_connections 10240;

multi_accept on;

}

 

 

http {

include mime.types;

default_type application/octet-stream;

 

log_format main     ‘$remote_addr – $remote_user [$time_local] “$request” ‘

‘$status $upstream_status $body_bytes_sent “$http_referer” ‘

‘”$http_user_agent” “$http_x_forwarded_for” ‘

‘”$host” $request_time $upstream_response_time $upstream_addr’;

 

access_log /var/log/nginx/access.log main;

 

    sendfile on;

#tcp_nopush on;

server_tokens off;

 

#keepalive_timeout 0;

keepalive_timeout 65;

#client_max_body_size 20m;

client_header_buffer_size 32k;

large_client_header_buffers 4 32k;

proxy_connect_timeout 60s;

proxy_read_timeout 60s;

proxy_send_timeout 60s;

client_body_timeout 60s;

 

server_names_hash_max_size 512;

server_names_hash_bucket_size 128;

server_name_in_redirect off;

 

gzip on;

gzip_min_length 1024;

gzip_types text/plain application/x-javascript text/css application/xml application/json;

 

include conf.d/*.conf;

 

}

测试nginx配置文件

nginx -t

新建SSL

cd /usr/local/nginx/conf/

mkdir ssl

证书敲进来

参数优化

echo “ DefaultLimitNOFILE=100000” >> /etc/systemd/system.conf

echo “ DefaultLimitNPROC=65535” >> /etc/systemd/system.conf

 

配置完成重启服务器

使用rsync同步2台Nginx的配置

两台主机都安装下rsync

yum -y install rsync

在ng1上做免密钥登陆ng2

ssh-keygen #一直回车


ssh-copy-id -i root@10.0.40.13 #回车,后面要输入个yes


测试登陆ok

ssh root@10.0.40.13


制作同步脚本

下面的脚本,在nginx1上运行.

nginx1 reload之后—》会执行rsync同步到nginx2—》同步完成后,会reload nginx2。以后每次配置完nginx1后都执行下这个脚本即可。

vi /data/script/ngreload.sh

#! /bin/bash

nginx -t &&

nginx -s reload &&

rsync -avz –delete /usr/local/nginx/conf/ 10.0.40.13:/usr/local/nginx/conf/ &&

ssh 10.0.40.13 “nginx -s reload”

配置权限

chmod 755 /data/script/ngreload.sh

chmod u+x /data/script/ngreload.sh

Nginx配置日志切割

vi /etc/logrotate.d/nginx

我们使用自带的logrotate来进行切割

/var/logs/nginx/*.log

{

rotate 14 #每14天切割下

copytruncate

daily

dateext

compress

missingok

}

开启LVS和Nginx

启动Keepalived

LVS01和LVS 02分别执行:

systemctl start keepalived

systemctl enable keepalived

在两台LVS上都执行 ip add 查看下ip

可以看到LVS01有个10.0.40.100的ip,LVS02没有,成功。

启动nginx

如果nginx未运行则在nginx01和nginx02执行:

nginx

运行realserver.sh脚本

在nginx01和nginx02执行realserver.sh脚本:

/data/script/realserver.sh start

添加开机启动

echo “/data/script/realserver.sh start” >> /etc/rc.d/rc.local

检查负载

在LVS上运行

ipvsadm -ln

可以看到后面2台Nginx 10.0.40.12和13都已经负载上去。

登陆VIP,成功

3条评论

  1. 四月的奥德赛 2019年9月4日 13:54

    本质上,Keepalived 就是一个软件负载均衡,看了官网介绍,是一个运行在 4层、5层网络上的,有些高级功能无法到达应用层,推荐使用zevenet、KEMP。这2个负载均衡可以应用到 7层的应用层上。

  2. 四月的奥德赛 2019年9月4日 13:58

    前半部分,格式有点乱,都是超链接。

  3. 四月的奥德赛 2019年9月4日 13:59

    最后的截图没有看到负载均衡的网络负载和测试一台Keepalived挂了之后,网络掉包和访问情况。

发表评论

Go