高可用的并发解决方案nginx+keepalived
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
课程标题
为并发量高的优质网站量身定制高可用的并发解决方案nginx+keepalived
课程引导语
在这个互联网飞速发展的时代人们已经离不开网络其中网购最为常见。在家网购上班路上网购吃饭也购物下班还网购2017年双十一天猫支付峰值达到了25.6万笔/秒。热点网站中频繁出现的大量并发如何去解决
那么在此次课程中大家就会领略到使用目前市面上处理并发能力非常强悍的nginx及keepalived如何快速的搭建一个处理高并发并的高可用的服务
。
课程介绍
本课程介绍了目前处理并发能力非常强悍的开源软件nginx快速入门及使用介绍nginx+tomcat集群处理并发解决方案带大家认识虚拟路由了解虚拟路由的工作流程并安装keepalived实现nginx+keepalived主备配置达到nginx高可用的效果。
资料下载 https://download.csdn.net/download/qq_22075913/87425983
课程知识点与大纲
- nginx keepalived tomcat
- nginx 介绍
- nginx 快速入门
- nginx+tomcat集群
- keepalived 介绍
- keepalived安装
- keepalived+nginx 搭建高可用服务
Nginx介绍
Nginx (“engine x”) 是一个高性能的 HTTP 和 反向代理 服务器
也是一个 IMAP/POP3/SMTP 代理服务器 。 Nginx 是由 Igor Sysoev 为俄罗斯访问量第二的Rambler.ru 站点开发的它已经在该站点运行超过四年多了。Igor 将源代码以类BSD许可证的形式发布。自Nginx 发布以来Nginx 已经因为它的稳定性、丰富的功能集、 示例配置文件和低系统资源的消耗而闻名了。目前国内各大门户网站已经部署了Nginx如新浪、网易、腾讯。
Nginx下载和安装
Nginx官网http://nginx.org/
Nginx目前已经更新到了nginx-1.23.3版本我们可以直接到官网下载由于外面服务器大多都使用linux环境作为服务器所以我们也弄一台linux环境的虚拟机。
虚拟机我们已经装好了IP192.168.126.129由于nginx是用C语言写的,而且还支持地址栏重写等功能所以我们需要安装一下相关的依赖包。
yum install gcc-c++
yum install -y pcre pcre-devel
yum install -y zlib zlib-devel
yum install -y openssl openssl-devel
安装流程如下
- 我们把刚才从官网下载的Nginx文件上传到centos的/usr/local/server目录去。
- 紧接着我们在server目录下创建nginx目录 把压缩文件解压进入解压的文件夹。
- 首先配置nginx安装信息./configure
- 执行编译和安装make && make install
安装流程如下
nginx-1.23.3.tar.gz
[root@localhost server]# tar -xf nginx-1.23.3.tar.gz
[root@localhost server]# mkdir nginx
[root@localhost server]# cd nginx-1.23.3
[root@localhost nginx-1.23.3]# ./configure --prefix=/usr/local/server/nginx
[root@localhost nginx-1.23.3]# make && make install
上面./configure后面的一些常用参数配置参考如下
–prefix
指定部署根目录默认是/usr/local/nginx.此设置会更改其他配置目录的相对路径
–sbin-path
可执行文件的路径默认为/sbin/nginx
–conf-path
配置文件的路径默认为/conf/nginx.conf
–pid-path
pid文件的存放路径默认存放在/logs/nginx.pid是一个存放nginx的master进程ID的
纯文本文件刚安装的时候不会生成nginx启动的时候会自动生成。
–http-log-path
access日志存放位置每个http的请求在结束的时候都会访问的日志。
–with-ld-opt
加入第三方链接时需要的参数。编译之后nginx最终的可执行二进制文件是由编译后
的目标文件和一些第三方的库链接生成的。如果想要将某个库链接到nginx中
就需要指定–with-ld-opt=目标库名-目标库路径
–with-debug
将nginx需要打印debug调试级别日志的代码编译进nginx这样才可以通过修改配置
文件将调试日志打印出来便于定位服务问题
安装第三方模块
./configure --prefix=/usr/local/server/nginx --add-module=/usr/local/server/nginx_module/echo-nginx-module-0.61 --with-debug
这时候Nginx已经安全完成我们进入/usr/local/server/nginx目录查看
[root@localhost nginx-1.23.3]# cd ../nginx
[root@localhost nginx]# ls
conf html logs sbin
[root@localhost nginx]#
Nginx安装完成后不要忘了防火墙开放80端口
[root@localhost sbin]# vi /etc/sysconfig/iptables
# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
[root@localhost sbin]# service iptables restart
iptables: Setting chains to policy ACCEPT: filter [ OK ]
iptables: Flushing firewall rules: [ OK ]
iptables: Unloading modules: [ OK ]
iptables: Applying firewall rules: [ OK ]
[root@localhost sbin]#
或者关闭防火墙
1:查看防火状态
systemctl status firewalld
service iptables status
2:暂时关闭防火墙
systemctl stop firewalld
service iptables stop
3:永久关闭防火墙
systemctl disable firewalld
chkconfig iptables off
4:重启防火墙
systemctl enable firewalld
service iptables restart
5:永久关闭后重启
//暂时还没有试过
chkconfig iptables on
访问http://192.168.126.129/
Nginx常用命令
nginx常用命令
nginx -c /usr/local/server/nginx/conf/nginx.conf 启动nginx(windows下start nginx);
nginx -s quit 停止ngix
nginx -s reload 重新载入nginx(当配置信息发生修改时)
nginx -v 查看版本
nginx -t 查看nginx的配置文件的目录
nginx -h 查看帮助信息
启动nginx
模块介绍
主模块
基本指令
daemon
语法daemon on | off
默认值on
是否以守护进程的方式运行nginx守护进程是指脱离终端并且在后台运行的进程关闭守护进程执行的方式可以让我们方便调试nginx
方便调试nginx
master_process
语法on | off 默认on
是否以master/worker方式进行工作在实际的环境中 nginx是以一个master进程管理多个worker进程的方式运行的关闭后 nginx就不会fork出worker子进程来处理请求而是用master进程自身来处理请求worker_processes number; 默认1在master/worker运行方式下 worker进程的数目一般情况下用户要配置与CPU内核数相等的worker进程。
- on: 多线程处理
- off: 单线程处理
启动nginx查看没有子进程
error_log
语法error_log file [ debug | info | notice | warn | error | crit ]
include
语法include file | *
默认值none
你可以包含一些其他的配置文件来完成你想要的功能。
0.4.4版本以后include指令已经能够支持文件通配符
include vhosts/*.conf;
pid
语法pid file
默认值编译时指定
pid /var/log/nginx.pid;
指定pid文件可以使用kill命令来发送相关信号例如你如果想重新读取配置文件则可以使用
kill -HUP cat /var/log/nginx.pid
user
- 语法user user [group]
- 默认值nobody nobody
如果主进程以root运行Nginx将会调用setuid()/setgid()来设置用户/组如果没有指定组那么将使用与用户名相同的组默认情况下会使用nobody用户与nobody组或者nogroup或者在编译时指定的–user=USER和–group=GROUP的值。
worker_processes
语法worker_processes number 默认值1
由于以下几点原因Nginx可能需要运行不止一个进程
- 使用了SMP对称多处理技术。
- 当服务器在磁盘I/O出现瓶颈时为了减少响应时间。
- 当使用select()/poll()限制了每个进程的最大连接数时。
在事件模块这一章中我们将使用worker_processes和worker_connections来计算理论最大连接数max_clients
max_clients = worker_processes * worker_connections
默认是1
启动nginx并查看进程只有一个worker process
修改worker_processes=4 并查看进程
如图所示有4个worker process
Nginx处理HTTP的核心功能模块
基本指令
alias
- 语法alias file-path|directory-path;
- 默认值no
- 使用字段location
这个指令指定一个路径使用某个某个注意它可能类似于root但是document root没有改变请求只是使用了别名目录的文件。
location /i/ {
alias /spool/w3/images/;
}
上个例子中请求"/i/top.gif"将返回这个文件: "/spool/w3/images/top.gif"。
Alias同样可以用于带正则表达式的location如
location ~ ^/download/(.*)$ {
alias /home/website/files/$1;
}
keepalive_timeout
语法keepalive_timeout [ time ] [ time ]
默认值keepalive_timeout 65
使用字段http, server, location
参数的第一个值指定了客户端与服务器长连接的超时时间
超过这个时间服务器将关闭连接。
- 参数的第二个值可选指定了应答头中Keep-Alive:
timeout=time的time值这个值可以使一些浏览器知道什么时候关闭连接以便服务器不用重复关闭如果不指定这个参数nginx不会在应答头中发送Keep-Alive信息。但这并不是指怎样将一个连接“Keep-Alive
”
参数的这两个值可以不相同
下面列出了一些服务器如何处理包含Keep-Alive的应答头
- MSIE和Opera将Keep-Alive: timeout=N头忽略。
- MSIE保持一个连接大约60-65秒然后发送一个TCP RST。
- Opera将一直保持一个连接处于活动状态。
- Mozilla将一个连接在N的基础上增加大约1-10秒。
- Konqueror保持一个连接大约N秒。
listen
语法(0.7.x)listen address:port [ default [ backlog=num | rcvbuf=size | sndbuf=size | accept_filter=filter | deferred | bind | ssl ] ]
语法(0.8.x)listen address:port [ default_server [ backlog=num | rcvbuf=size | sndbuf=size | accept_filter=filter | deferred | bind | ssl ] ]
默认值listen 80
使用字段server
listen指令指定了server{…}字段中可以被访问到的ip地址及端口号可以只指定一个ip一个端口或者一个可解析的服务器名。
listen 127.0.0.1:8000;
listen 127.0.0.1;
listen 8000;
listen *:8000;
listen localhost:8000;
location
语法location [=|||^~|@] /uri/ { … }
默认值no
使用字段server
这个参数根据URI的不同需求来进行配置可以使用字符串与正则表达式匹配如果要使用正则表达式你必须指定下列前缀
1、~ 不区分大小写。
2、~ 区分大小写。
location = / {
# 只匹配 / 的查询.
[ configuration A ]
}
location / {
# 匹配任何以 / 开始的查询但是正则表达式与一些较长的字符串将被首先匹配。
[ configuration B ]
}
location ^~ /images/ {
# 匹配任何以 /images/ 开始的查询并且停止搜索不检查正则表达式。
[ configuration C ]
}
location ~* \.(gif|jpg|jpeg)$ {
# 匹配任何以gif, jpg, or jpeg结尾的文件但是所有 /images/ 目录的请求将在Configuration C中处理。
[ configuration D ]
}
resolver_timeout
语法resolver_timeout time
默认值30s
使用字段http, server, location
解析超时时间。如
resolver_timeout 5s;
root
语法root path
默认值root html
使用字段http, server, location ,location中的if字段
请求到达后的文件根目录。
下例中
location /i/ {
root /spool/w3;
}
如果请求"/i/top.gif"文件nginx将转到"/spool/w3/i/top.gif"文件。你可以在参数中使用变量。
注意在请求中root会添加这个location到它的值后面即"/i/top.gif"并不会请求"/spool/w3/top.gif"文件如果要实现上述类似于apache alias的功能可以使用alias指令。
server
语法server {…}
默认值no
使用字段http
server字段包含虚拟主机的配置。
没有明确的机制来分开基于域名请求中的主机头和基于IP的虚拟主机。
可以通过listen指令来指定必须连接到这个server块的所有地址和端口并且在server_name指令中可以指定所有的域名。
server_name
语法server_name name [… ]
默认值server_name hostname
使用字段server
这个指令有两个作用
·将HTTP请求的主机头与在nginx配置文件中的server{…}字段中指定的参数进行匹配并且找出第一个匹配结果。这就是如何定义虚拟主机的方法域名遵循下述优先级规则
1、完整匹配的名称。
2、名称开始于一个文件通配符.example.com。
3、名称结束于一个文件通配符www.example.。
4、使用正则表达式的名称。
如果没有匹配的结果nginx配置文件将安装以下优先级使用[#server server { … }]字段
1、listen指令被标记为default的server字段。
2、第一个出现listen或者默认的listen 80的server字段。
·如果server_name_in_redirect被设置这个指令将用于设置HTTP重定向的服务器名。
例
server {
server_name example.com www.example.com;
}
第一个名称为服务器的基本名称默认名称为机器的hostname。
当然可以使用文件通配符
server {
server_name example.com *.example.com www.example.*;
}
上述例子中的前两个名称可以合并为一个
server {
server_name .example.com;
}
同样可以使用正则表达式。名称前面加“~”
server {
server_name www.example.com ~^www\d+\.example\.com$;
}
HTTP负载均衡模块HTTP Upstream
摘要
这个模块为后端的服务器提供简单的负载均衡轮询round-robin和连接IPclient IP
如下例
upstream backend {
server backend1.example.com weight=5;
server backend2.example.com:8080;
server unix:/tmp/backend3;
}
server {
location / {
proxy_pass http://backend;
}
}
指令
ip_hash
语法ip_hash
默认值none
使用字段upstream
这个指令将基于客户端连接的IP地址来分发请求。
哈希的关键字是客户端的C类网络地址这个功能将保证这个客户端请求总是被转发到一台服务器上但是如果这台服务器不可用那么请求将转发到另外的服务器上这将保证某个客户端有很大概率总是连接到一台服务器。
无法将权重weight与ip_hash联合使用来分发连接。如果有某台服务器不可用你必须标记其为“down”如下例:
upstream backend {
ip_hash;
server backend1.example.com;
server backend2.example.com;
server backend3.example.com down;
server backend4.example.com;
}
server
语法server name [parameters]
默认值none
使用字段upstream
指定后端服务器的名称和一些参数可以使用域名IP端口或者unix socket。如果指定为域名则首先将其解析为IP。
·weight = NUMBER - 设置服务器权重默认为1。
·max_fails = NUMBER - 在一定时间内这个时间在fail_timeout参数中设置
检查这个服务器是否可用时产生的最多失败请求数默认为1将其设置为0可以关闭检查
这些错误在proxy_next_upstream或fastcgi_next_upstream
404错误不会使max_fails增加中定义。
·fail_timeout = TIME - 在这个时间内产生了max_fails所设置大小的失败尝试连接
请求后这个服务器可能不可用同样它指定了服务器不可用的时间
在下一次尝试连接请求发起之前默认为10秒fail_timeout与前端响应时间没有
直接关系不过可以使用proxy_connect_timeout和proxy_read_timeout来控制。
·down - 标记服务器处于离线状态通常和ip_hash一起使用。
·backup - (0.6.7或更高)如果所有的非备份服务器都宕机或繁忙
则使用本服务器无法和ip_hash指令搭配使用。<br/>
示例配置
upstream backend {
server backend1.example.comweight=5;
server 127.0.0.1:8080 max_fails=3 fail_timeout=30s;
server unix:/tmp/backend3;
}
注意如果你只使用一台上游服务器nginx将设置一个内置变量为1即max_fails和fail_timeout参数不会被处理。
结果如果nginx不能连接到上游请求将丢失。
解决使用多台上游服务器。
upstream
语法upstream name { … }
默认值none
使用字段http
这个字段设置一群服务器可以将这个字段放在proxy_pass和fastcgi_pass指令中作为一个单独的实体它们可以可以是监听不同端口的服务器并且也可以是同时监听TCP和Unix socket的服务器。
服务器可以指定不同的权重默认为1。
示例配置
upstream backend {
server backend1.example.com weight=5;
server 127.0.0.1:8080 max_fails=3 fail_timeout=30s;
server unix:/tmp/backend3;
}
HTTP访问控制模块HTTP Access
摘要
这个模块提供简单的基于主机的访问控制。
ngx_http_access_module这个模块可以详细的检查客户端IP并且按顺序执行第一条匹配的规则。
如下例
location / {
deny192.168.1.1;
allow 192.168.1.0/24;
allow 10.1.1.0/16;
denyall;
}
上面的例子中仅允许192.168.1.0/24和10.1.1.0/16网络段访问但192.168.1.1是个例外。
如果要实施很多复杂的规则那么最好使用GeoIP module模块。
指令
allow
语法allow [ address | CIDR | all ]
默认值no
使用字段http, server, location, limit_except
指令指定了允许访问的IP或网络段。
deny
语法deny [ address | CIDR | all ]
默认值no
使用字段http, server, location, limit_except
指令指定了拒绝访问的IP或网络段。
·提示和技巧
HttpAccess模块可以和error_page指令搭配使用来重定向一个未经验证的访问请求。
error_page 403 http://example.com/forbidden.html;
location / {
deny192.168.1.1;
allow 192.168.1.0/24;
allow 10.1.1.0/16;
denyall;
}
Nginx+tomcat实现集群
当我们网站并发量高的时候一台tomcat无法承受大量并发可以考虑Nginx+Tomcat集群来实现。咱们这就做一个集群演示。
配置说明
我们这里准备3台tomcat端口分别是8081、8082、8083针对同一个域名每次用Nginx实现不同的转发分别在每个tomcat的webapps目录下创建ROOT目录并创建index.html分别在html的body里标记1/2/3以示区分。
Tomcat配置
下载https://tomcat.apache.org/download-80.cgi
拷贝文件到目录下解压重命名并复制三份
修改tomcat1端口分别为801580818019
vi /usr/local/server/tomcats/tomcat1/conf/server.xml
修改tomcat2端口分别为802580828029
vi /usr/local/server/tomcats/tomcat2/conf/server.xml
修改tomcat3端口分别为803580838039
vi /usr/local/server/tomcats/tomcat3/conf/server.xml
进入tomcat1删除webapps下的文件创建ROOT文件夹并添加html文件
<html>
<head>tomcat1</head>
<body>
tomcat1
</body>
</html>
以同样的方式修改tomcat2和tomcat3
启动三个tomcat并在浏览器访问
使用Nginx配置tomcat集群
修改nginx.conf配置文件
upstream clustertomcat{
server 192.168.126.129:8081 weight=5;
server 192.168.126.129:8082 weight=1;
server 192.168.126.129:8083 weight=1;
}
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
proxy_pass http://clustertomcat;
}
}
加载配置文件
[root@localhost sbin]# cd /usr/local/server/nginx/sbin/
[root@localhost sbin]# ./nginx
[root@localhost sbin]# ./nginx -s reload
访问地址由于tomcat1配置的权重是5所以每次访问得到tomcat1的几率更大
Nginx搭建图片服务器
针对任何站点几乎都要访问图片而一个网页里面几乎有好些张图片这时候会占据大量tomcat连接造成大量并发我们可以通过Nginx配置直接访问硬盘里的图片绕开tomcat。
我们在创建一个/usr/local/server/nginx_images/images目录然后在images目录放入一些图片再在nginx的nginx.conf配置里配置一个虚拟机来访问。
server {
listen 80;
server_name localhost;
#所有带有images访问的路径直接在/usr/local/server/nginx_images目录下查找
location / {
root /usr/local/server/nginx_images;
}
}
启动nginx并加载配置
[root@localhost sbin]# cd /usr/local/server/nginx/sbin/
[root@localhost sbin]# ./nginx
[root@localhost sbin]# ./nginx -s reload
测试访问成功
keepalived+nginx 集群解决单点故障
再牛逼的软件我们也不能保证它一定不挂为了防止Nginx挂了导致整个服务无法使用的灾难发生我们这里可以考虑使用Keepalived+Nginx集群实现高可用。
keepalived介绍
- Keepalived 是一种高性能的服务器高可用或热备解决方案Keepalived 可以用来防止服务器单点故障的发生通过配合Nginx 可以实现 web 前端服务的高可用。
- Keepalived 以 VRRP 协议为实现基础用 VRRP 协议来实现高可用性(HA)。VRRP(Virtual Router Redundancy Protocol)协议是用于实现路由器冗余的协议VRRP协议将两台或多台路由器设备虚拟成一个设备对外提供虚拟路由器 IP(一个或多个)而在路由器组内部如果实际拥有这个对外 IP的路由器如果工作正常的话就是 MASTER或者是通过算法选举产生MASTER 实现针对虚拟路由器 IP 的各种网络功能如 ARP请求ICMP以及数据的转发等其他设备不拥有该虚拟 IP状态是 BACKUP除了接收 MASTER 的VRRP状态通告信息外不执行对外的网络功能。当主机失效时BACKUP 将接管原先 MASTER 的网络功能。
- VRRP 协议使用多播数据来传输 VRRP 数据VRRP 数据使用特殊的虚拟源 MAC 地址发送数据而不是自身网卡的 MAC地址VRRP 运行时只有 MASTER 路由器定时发送 VRRP 通告信息表示 MASTER 工作正常以及虚拟路由器IP(组)BACKUP 只接收 VRRP 数据不发送数据如果一定时间内没有接收到 MASTER 的通告信息各 BACKUP将宣告自己成为 MASTER发送通告信息重新进行 MASTER 选举状态。
方案介绍
VIP | IP | 主机名 | 主从
| 192.168.126.129 | keep129 | master
192.168.126.131 |------------------|-----------------|--------------
| 192.168.126.130 | keep130 | backup
克隆虚拟机并设置静态ip参考以下链接
https://blog.csdn.net/weixin_47314924/article/details/128378223
Nginx安装
在129和130虚拟机上安装nginx安装过程参考前面学的Nginx。
cd /usr/local/server/
mkdir nginx-keepalived #创建文件夹
cp nginx-1.23.3.tar.gz /usr/local/server/nginx-keepalived #拷贝文件
cd nginx-keepalived
tar -xf nginx-1.23.3.tar.gz #解压
mkdir nginx
./configure --prefix=/usr/local/server/nginx-keepalived/nginx
make && make install #安装
keepalived安装
下载地址https://www.keepalived.org/download.html
将文件上传到服务器然后解压安装
#下载离线安装包下载地址并把安装包上传到服务器上并解压
# cp keepalived-2.2.7.tar.gz /usr/local/server/keepalived-2.2.7.tar.gz
# cd /usr/local/server
# tar -zxvf keepalived-2.2.7.tar.gz
# mkdir keepalived
#进入安装包中进行编译及安装
# cd keepalived-2.2.7
# ./configure --prefix=/usr/local/server/keepalived --sysconf=/etc
# make && make install
生成以下几个文件这样keepalived我们就安装好了
#进入cd /etc/keepalived
#把keepalived.conf.sample删除
cd /etc/keepalived/
rm -rf keepalived.conf.sample
配置主节点
编辑hosts 添加主机名
vi /etc/hosts
找到129主机keepalived的配置文件keepalived.conf
#重新创建keepalived.conf
cd /etc/keepalived
vi keepalived.conf
添加内容
global_defs {
router_id keep129;
}
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh"
interval 2
weight -20
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 129
mcast_src_ip 192.168.126.129
priority 100
nopreempt
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
chk_nginx
}
virtual_ipaddress {
192.168.126.131
}
}
配置从节点
编辑hosts 添加主机名
vi /etc/hosts
注意
从节点跟主节点一样需要安装和配置nginx和keepalived
找到130主机keepalived的配置文件keepalived.conf
#重新创建keepalived.conf
cd /etc/keepalived
vi keepalived.conf
global_defs {
router_id keep130;
}
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh"
interval 2
weight -20
}
vrrp_instance VI_1 {
state BACKUP
interface ens33
virtual_router_id 130
mcast_src_ip 192.168.126.130
priority 90
nopreempt
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
track_script {
chk_nginx
}
virtual_ipaddress {
192.168.126.131
}
}
Nginx检查脚本
分别在机器129,130的 /etc/keepalived目录下创建nginx_check.sh文件
#!/bin/bash
A ='ps -C nginx --no-header | wc -l'
# 判断nginx是否宕机如果宕机了尝试重启
if [ $A -eq 0 ];then
# nginx位置
/usr/local/server/nginx-keepalived/nginx/sbin
# 等待3秒再次检查nginx如果没有启动成功则停止keepalived使其启动备用机
sleep 3
if [ 'ps -C nginx --no-header | wc -l' -eq 0 ]; then
killall keepalived
fi
fi
配置两台web服务器
修改nginx下的index.html文件
[root@localhost html]# cd /usr/local/server/nginx-keepalived/nginx/html
[root@localhost html]# ll
总用量 8
-rw-r--r--. 1 root root 497 2月 7 17:03 50x.html
-rw-r--r--. 1 root root 617 2月 7 18:16 index.html
[root@localhost html]# vi index.html
129服务器 修改 <h1>Welcome to nginx-1!</h1>
130服务器 修改 <h1>Welcome to nginx-2!</h1>
启动nginx和keepalived测试
关闭防火墙同时启动主机和备机的nginx和keepalived
systemctl stop firewalld 关闭防火墙
firewall-cmd --state 查看防火墙状态
启动129 nginx和keepalived
[root@localhost html]# cd /usr/local/server/nginx-keepalived/nginx/sbin/
[root@localhost sbin]# ./nginx
[root@localhost sbin]# cd /usr/local/server/keepalived/sbin/
[root@localhost sbin]# ./keepalived
[root@localhost sbin]# ps -ef|grep keepalived
root 18049 1 0 18:20 ? 00:00:00 ./keepalived
root 18050 18049 0 18:20 ? 00:00:00 ./keepalived
root 18097 9304 0 18:21 pts/1 00:00:00 grep --color=auto keepalived
启动130 nginx和keepalived
浏览器访问地址http://192.168.126.131
, 可知此时访问的是主服务器的nginx
关闭主服务器nginx和 keepalived
[root@localhost sbin]# ps -ef|grep keepalived
root 18049 1 0 18:20 ? 00:00:00 ./keepalived
root 18050 18049 0 18:20 ? 00:00:00 ./keepalived
root 18097 9304 0 18:21 pts/1 00:00:00 grep --color=auto keepalived
[root@localhost sbin]# kill -9 18049
[root@localhost sbin]# cd /usr/local/server/nginx-keepalived/nginx/sbin/
[root@localhost sbin]# ./nginx -s quit
再次刷新浏览器可知此时访问的是从服务器的nginx
配置说明
global_defs {
## keepalived 自带的邮件提醒需要开启 sendmail 服务。建议用独立的监控或第三方 SMTP
router_id keep130 ## 标识本节点的字条串通常为 hostname
}
## keepalived 会定时执行脚本并对脚本执行的结果进行分析动态调整 vrrp_instance 的优先级。如果
脚本执行结果为 0并且 weight 配置的值大于 0则优先级相应的增加。如果脚本执行结果非 0并且 weight
配置的值小于 0则优先级相应的减少。其他情况维持原本配置的优先级即配置文件中 priority 对应
的值。
vrrp_script chk_nginx {
script "/etc/keepalived/nginx_check.sh" ## 检测 nginx 状态的脚本路径
interval 2 ## 检测时间间隔
weight -20 ## 如果条件成立权重-20
}
## 定义虚拟路由VI_1 为虚拟路由的标示符自己定义名称
vrrp_instance VI_1 {
state MASTER ## 主节点为 MASTER对应的备份节点为 BACKUP
interface eth1 ## 绑定虚拟 IP 的网络接口与本机 IP 地址所在的网络接口相同我的是 eth1
virtual_router_id 130 ## 虚拟路由的 ID 号两个节点设置必须一样可选 IP 最后一段使用, 相
同的 VRID 为一个组他将决定多播的 MAC 地址
mcast_src_ip 192.168.211.130 ## 本机 IP 地址
priority 100 ## 节点优先级值范围 0-254MASTER 要比 BACKUP 高
nopreempt ## 优先级高的设置 nopreempt 解决异常恢复后再次抢占的问题
advert_int 1 ## 组播信息发送间隔两个节点设置必须一样默认 1s
## 设置验证信息两个节点必须一致
authentication {
auth_type PASS
auth_pass 1111 ## 真实生产按需求对应该过来
}
## 将 track_script 块加入 instance 配置块
track_script {
chk_nginx ## 执行 Nginx 监控的服务
}
## 虚拟 IP 池, 两个节点设置必须一样
virtual_ipaddress {
192.168.199.131 ## 虚拟 ip可以定义多个
}
}
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |