热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使用keepalived+Nginx部署负载均衡环境

Keepalived+nginx实现负载均衡一、环境,2台虚拟机(centos2.6.32-358.el6.x86_64)Vm1:121Vm2:122二、keepalived实现高可用(多主多备)1)Vm1和Vm2的keepalived配置文件keepalived.conf2)注意;a.router_id每一个keep

Keepalived nginx 实现负载均衡

一、环境,2台虚拟机(centos  2.6.32-358.el6.x86_64 

Vm1:121

Vm2:122

 

二、keepalived实现高可用(多主多备)

1) Vm1和Vm2的keepalived 配置文件keepalived.conf

keepalived+nginx <wbr>实现负载均衡

 

2) 注意;

a. router_id每一个keepalived实例不能相同;

b. track_script必须放在virtaul_ipaddress后面,等vip绑定了才能进行验证负载均衡的nginx是否存活;

c. interface对应的值是本机的网卡名;

d. virtaul_ipaddress会根据配置,绑定vip到本机网卡interface;

e. 同一个virtaul_ipaddress对应的主从virtual_router_id的,必须一致,才能识别彼此是主从,否则两个vip所对应的BACKUP状态的vrrp_instance都会“Transition to MASTER STATE”;

f. 同一个keepalived实例的不同vrrp_instance实例,对应的virtual_router_id不能相同,如果相同,那就同一个物理机做主备,意义不大;

g. priority,主vrrp_instance 必须大于备vrrp_instance;否则备vrrp_instance将会“VRRP_Instance(nginx_1) Transition to MASTER STATE”; 

h. 主备机vrrp_instance之间通信是通过协议vrrp,注意关闭iptables(service iptables stop)或者把vrrp通信的通道加入iptables规则中允许通过(iptables -A INPUT -d 224.0.0.18 -j ACCEPT),否则会因为主备不能通讯,而不知道是否存活,导致备机全部转成MASTER的状态。

i.state BACKUP  #MASTER的状态改为BACKUP

          nopreempt   #MASTER设置为不抢占,BACKUP不用设置

                   priority 200  #MASTER的优先级比BACKUP要高

              j. interface eth0 这个是指定vrrp通信的网卡,可以在内网网卡进行主备通信。

 

3) 需要额外的一个track_script来验证负载均衡的nginx是否存在,及其相应对策:

vim /home/script/check_nginx.sh

#-------------------------start----------------------------

#!/bin/bash

url="http://121/index.html"

resp_status=$(curl -s --head "$url" awk '/HTTP/ {print $2}')

if "$resp_status" != "200" ]; then

        echo "121 nginx die"

        pkill keepalived

Fi

#-------------------------end----------------------------

该脚本,执行间隔为interval为2s,每隔2s去检查nginx的状态,如果发现nginx返回非200状态码,则终止keepalived,vip的绑定随之移除,则备机的BACKUP的keepalived发现对方没存活,则把vrrp_instance“Transition to MASTER STATE”。这样就实现了自动切换,从而达到高可用性。

 

三、nginx做负载均衡

Nginx 是使用反向代理来实现负载均衡;

 

1、Vim $nginx_home/conf/nginx.conf

#------------------------------start------------------------------------------

.

upstream app1 {

ip_hash;

    server    localhost:8011    weight=1    max_fails=2    fail_timeout=30s;

    server    localhost:8012    weight=1    max_fails=2    fail_timeout=30s;

}

upstream app2 {

    server    localhost:8021    weight=1    max_fails=2    fail_timeout=30s;

    server    localhost:8022    weight=1    max_fails=2    fail_timeout=30s;

}

server {

    listen       80;

.

location /app1 {

        proxy_next_upstream http_502 http_504 error timeout invalid_header;

        proxy_pass   http://app1;

        proxy_set_header Host $host;

        proxy_set_header X-Forwarded_For $remote_addr;

    }

 

    location /app2 {

        proxy_next_upstream http_502 http_504 error timeout invalid_header;

        proxy_pass   http://app2;

        proxy_set_header Host $host;

        proxy_set_header X-Forwarded_For $remote_addr;

    }

.

#------------------------------end------------------------------------------

2、注意点:

a. “location /app1”根据url规则来进行分发请求(“proxy_pass   http://app2”),实现负载方式之一

b. “proxy_next_upstream”实现的是发现upstream 中一个后端的服务器响应回来是502,或者504,则转发到另外一个后端的服务器;

c. “max_fails=2    fail_timeout=30s”,实现的是,最多错误2次,在30s内,任何下一次请求,将忽略该服务器,不再转发给这个服务器;

d. “ip_hash”,这个功能实现的是,根据当前连接的真实ip来计算iphash值,进行定位到后端的一台服务器,这种情况容易出现负载不均衡的现象,查了下源码“iphp->addr (u_char *) &sin->sin_addr.s_addr;”这个功能根据的iphash是获取的是当前连接,如果nginx负载之前是由前端转发过来的请求,获取到的ip是该连接的ip,而不是真实的客户端ip,保持会话的通道不是支持的很好;

e. Nginx有一个第三方的插件,nginx-sticky-module,版本nginx-1.5.3和nginx-sticky-module-1.1(https://code.google.com/p/nginx-sticky-module/)编译会有点问题,应该是nginx新版本没有相应的nginx-sticky-module,需要对nginx-sticky-module-1.1/ngx_http_sticky_misc.c 的281行改为digest->len ngx_sock_ntop(in, sizeof(struct sockaddr_in), digest->data, len, 1);重新编译即可(./configure --prefix=/home/local/nginx --with-pcre=/home/download/pcre-8.33/ --with-zlib=/home/download/zlib-1.2.8/ --with-openssl=/home/download/openssl-1.0.1e/ --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module --add-module=/home/download/nginx-sticky-module-1.1);经过验证,模块sticky会根据请求的COOKIE来定位到后端的服务器,该COOKIE是请求首次经过nginx的时候附加上去的,从而实现了会话长连接的保持。

keepalived+nginx <wbr>实现负载均衡

 

最后,keepalived nginx能轻松的实现负载均衡,多主多备,自动切换,发现后端某一节点故障,能自动的把请求切换到另外一个节点;建议,使用nginx来进行负载,最好不要用ip_hash,而使用类似于nginx-sticky-module进行基于session负载,可以维持会话长连接。

 

 

最后的把nginx负载接入到LVS上:

 

把nginx接入到LVS后面,直接在lvs那边的keepalived.conf上的节点vrrp_instance上,加入real_server节点,指向用于负载均衡的nginx即可,其他的保持和上面的一致。



推荐阅读
  • k8s+springboot+Eureka如何平滑上下线服务
    k8s+springboot+Eureka如何平滑上下线服务目录服务平滑上下线-k8s版本目录“上篇介绍了springboot+Euraka服务平滑上下线的方式,有部分小伙伴反馈k ... [详细]
  • mac php错误日志配置方法及错误级别修改
    本文介绍了在mac环境下配置php错误日志的方法,包括修改php.ini文件和httpd.conf文件的操作步骤。同时还介绍了如何修改错误级别,以及相应的错误级别参考链接。 ... [详细]
  • MySQL5.6.40在CentOS764下安装过程 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 本文介绍了5个基本Linux命令行工具的现代化替代品,包括du、top和ncdu。这些替代品在功能上进行了改进,提高了可用性,并且适用于现代化系统。其中,ncdu是du的替代品,它提供了与du类似的结果,但在一个基于curses的交互式界面中,重点关注占用磁盘空间较多的目录。 ... [详细]
  • 负载均衡_Nginx反向代理动静分离负载均衡及rewrite隐藏路径详解(Nginx Apache MySQL Redis)–第二部分
    nginx反向代理、动静分离、负载均衡及rewrite隐藏路径详解 ... [详细]
  • 概述H.323是由ITU制定的通信控制协议,用于在分组交换网中提供多媒体业务。呼叫控制是其中的重要组成部分,它可用来建立点到点的媒体会话和多点间媒体会议 ... [详细]
  • 对于一般的扩展包,我们一般直接pipinstallxxx即可安装,但是unrar直接安装后,发现并不能通过Python程序实现解压的功能& ... [详细]
  • 1、DashAPI文档Dash是一个API文档浏览器,使用户可以使用离线功能即时搜索无数API。程序员使用Dash可访问iOS,MacOS, ... [详细]
  • k8s进阶之搭建私有镜像仓库
    企业级私有镜像仓 ... [详细]
  • Docker安装Rabbitmq(配合宝塔)
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Docker安装Rabbitmq(配合宝塔)相关的知识,希望对你有一定的参考价值。一、事前准备 ... [详细]
  • until命令和while命令类似,while能实现的脚本unt ... [详细]
author-avatar
曾静ZHH_423
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有