在和一些朋友交流Nginx+Keepalived技术时,我虽然已成功多次实Nginx+Keepaived项目方案,但这些都是用的单主Nginx在工作,从Nginx长期只是处于备份状态,所以我们想将二台Nginx负载均衡器都处于工作状态,其实用Nginx+Keepalived也很容易实现。此方法适用场景:适合中小型网站应用场景。

一般为了维护方便,企业网站的服务器都在自己的内部机房里,只开放了Keepalived的VIP地址的两个端口80、443,通过Juniper SSG550防火墙映射出去,外网DNS对应映射后的公网IP。此架构的防火墙及网络安全说明如下:
此系统架构仅映射内网VIP的80及443端口于外网的Juniper SSG550防火墙下,其他端口均关闭,内网所有机器均关闭iptables防火墙;外网DNS指向即通过Juniper SSG550映射出来的外网地址。

Nginx负载均衡作服务器遇到的故障一般有:1.服务器网线松动等网络故障;2.服务器硬件故障发生损坏现象而crash;3.Nginx服务进程死掉(这种情况理论上会遇到,但事实上生产环境下的Linux服务器没有出现过这种情况,足以证明了Nginx作为负载均衡器/反向代理服务器的稳定性,我们可以通过技术手段来解决这一问题)。

测试实验环境:

主Nginx之一:192.168.1.5

主Nginx之二:192.168.1.6

Web服务器一:192.168.1.17

Web服务器二:192.168.1.18

VIP地址一:192.168.1.8

VIP地址二:192.168.1.9

一、Nginx和Keepalived的安装比较简单,我这里就不重复了,大家可以参考我的专题系列的文章,如下地址http://network.51cto.com/art/201007/209823.htm,我这里附上Nginx.conf配置文件,如下所示:

    user www www;worker_processes 8;pid /usr/local/nginx/logs/nginx.pid;worker_rlimit_nofile 51200;events{use epoll;worker_connections 51200;}http{include       mime.types;default_type application/octet-stream;server_names_hash_bucket_size 128;client_header_buffer_size 32k;large_client_header_buffers 4 32k;client_max_body_size 8m;sendfile on;tcp_nopush     on;keepalive_timeout 60;tcp_nodelay on;fastcgi_connect_timeout 300;fastcgi_send_timeout 300;fastcgi_read_timeout 300;fastcgi_buffer_size 64k;fastcgi_buffers 4 64k;fastcgi_busy_buffers_size 128k;fastcgi_temp_file_write_size 128k;gzip on;gzip_min_length 1k;gzip_buffers     4 16k;gzip_http_version 1.0;gzip_comp_level 2;gzip_types       text/plain application/x-javascript text/css application/xml;gzip_vary on;upstream backend{ip_hash;server 192.168.1.17:80;server 192.168.1.18:80;}server {listen 80;server_name www.1paituan.com;location / {root /var/www/html ;index index.php index.htm index.html;proxy_redirect off;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_pass http://backend;}location /nginx {access_log off;auth_basic "NginxStatus";#auth_basic_user_file /usr/local/nginx/htpasswd;}log_format access '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" $http_x_forwarded_for';access_log /data/logs/access.log access;}
}

二、配置Keepalived文件,我这里简单说下原理,其实也就是通过Keepalived生成二个实例,二台Nginx互为备份,即第一台是第二台机器的备机,而第二台机器也是第一台的备机,而生成的二个VIP地址分别对应我们网站http://www.1paituan.com,这样大家在公网上可以通过DNS轮询来访问得到我们的网站,任何一台Nginx机器如果发生硬件损坏,Keepalived会自动将它的VIP地址切换到另一台机器,不影响客户端的访问,这个跟我们以前的LVS+Keepalived多实例的原理是一样的,相信大家也能明白。

主Nginx机器之一的Keepalived.conf配置文件如下:

! Configuration File for keepalived
global_defs {notification_email {yuhongchun027@163.com}notification_email_from keepalived@chtopnet.comsmtp_server 127.0.0.1smtp_connect_timeout 30router_id LVS_DEVEL
}
vrrp_instance VI_1 {state MASTERinterface eth0virtual_router_id 51priority 100advert_int 1authentication {auth_type PASSauth_pass 1paituan.com}virtual_ipaddress {192.168.1.8}
}
vrrp_instance VI_2 {state BACKUPinterface eth0virtual_router_id 52priority 99advert_int 1authentication {auth_type PASSauth_pass 1paituan.com}virtual_ipaddress {192.168.1.9}
}

主Nginx之二的keepalivd.conf配置文件如下:

! Configuration File for keepalived
global_defs {notification_email {yuhongchun027@163.com}notification_email_from keepalived@chtopnet.comsmtp_server 127.0.0.1smtp_connect_timeout 30router_id LVS_DEVEL
}
vrrp_instance VI_1 {state BACKUPinterface eth0virtual_router_id 51priority 99advert_int 1authentication {auth_type PASSauth_pass 1paituan}virtual_ipaddress {192.168.1.8                  }
}
vrrp_instance VI_2 {state MASTERinterface eth0virtual_router_id 52priority 100advert_int 1authentication {auth_type PASSauth_pass 1paituan}virtual_ipaddress {192.168.1.9                  }
}

二台机器的监控Nginx的进程脚本,脚本内容如下:

#!/bin/bash
while  :
do
nginxpid=`ps -C nginx --no-header | wc -l`if [ $nginxpid -eq 0 ];then/usr/local/nginx/sbin/nginxsleep 5
nginxpid=`ps -C nginx --no-header | wc -l`echo $nginxpidif [ $nginxpid -eq 0 ];then/etc/init.d/keepalived stopfifisleep 5
done

我们分别在二台主Nginx上执行,命令如下所示:

nohup sh /root/nginxpid.sh &

此脚本我是直接从生产服务器上下载的,大家不要怀疑它会引起死循环和有效性的问题,我稍为解释一下,这是一个无限循环的脚本,放在主Nginx机器上(因为目前主要是由它提供服务),每隔5秒执行一次,用ps -C 命令来收集nginx的PID值到底是否为0,如果是0的话(即Nginx进程死掉了),尝试启动nginx进程;如果继续为0,即nginx启动失改, 则关闭本机的Keeplaived进程,VIP地址则会由备机接管,当然了,整个网站就会由备机的Nginx来提供服务了,这样保证Nginx进程的高可用。

四、正常启动二台主Nginx的Nginx和Keealived程序后,二台机器的正常IP显示应该如下所示:
这台是IP为192.168.1.5的机器的ip addr命令显示结果:

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
link/ether 00:0c:29:99:fb:32 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.5/24 brd 192.168.1.255 scope global eth0inet 192.168.1.8/32 scope global eth0

另外一台IP为192.168.1.6的机器用ip addr命令显示结果如下:

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
link/ether 00:0c:29:7d:58:5e brd ff:ff:ff:ff:ff:ff
inet 192.168.1.6/24 brd 192.168.1.255 scope global eth0
inet 192.168.1.9/32 scope global eth0
inet6 fe80::20c:29ff:fe7d:585e/64 scope link
valid_lft forever preferred_lft forever
3: sit0: <NOARP> mtu 1480 qdisc nooplink/sit 0.0.0.0 brd 0.0.0.0

五、测试过程如下:
1)我们要分别在二台主Nginx上用killall杀掉Nginx进程,然后在客户端分别访问192.168.1.8和192.168.1.9这二个IP(模拟DNS轮询)看能否正常访问Web服务器。
2)尝试重启192.168.1.5的主Nginx负载均衡器,测试过程如上;
3)尝试重启192.168.1.6的主Nginx负载均衡器,测试过程如下;
4)尝试分别关闭192.168.1.5和192.168.1.6的机器,测试过程如上,看影响网站的正常访问不?

六、目前投入生产要解决的问题:
1)Cacti和Nagios等监控服务要重新部署,因为现在客户机是分别访问二台负载均衡器;
2)日志收集要重新部署,现在访问日志是分布在二台负载均衡器上;
3)要考虑google收录等SEO的问题;
4)证书的问题,二台机器都需要添加的;
5)其它问题暂时没有想到,待补充。

Nginx主主负载均衡架构相关推荐

  1. 架构笔记:随笔,关于常见负载均衡架构对比及演变

    文章目录 关于负载均衡 1.Nginx 2.LVS 3.HAProxy 总结 关于负载均衡 主流负载均衡的开源方案:Nginx.LVS.HAProxy 目前关于网站架构一般比较合理流行的架构方案: W ...

  2. ttlsa教程系列之MySQL---MySQL/Galera集群-多主高可用性负载均衡

    为什么80%的码农都做不了架构师?>>>    ttlsa教程系列之MySQL ---- MySQL/Galera集群-多主高可用性负载均衡 Percona和MariaDB发布版本中 ...

  3. 架构师之路 — 部署架构 — 超大规模负载均衡架构演进

    目录 文章目录 目录 超大规模负载均衡架构演进技术路线 0.单机架构 1.HTTP 与 DB 服务器分开部署 2.引入本地缓存和分布式缓存 3.引入反向代理实现负载均衡 4.数据库读写分离 5.数据库 ...

  4. Nginx + IIS实现负载均衡 Session多站点共享

    日子过得太索然无味了,研究了一下,所谓的负载均衡(主要是windows服务器IIS下的).先看看分析图: 环境: linux服务器: centos 6.3 windows服务器: windows se ...

  5. Linux下Nginx+多Tomcat负载均衡实现详解

    一.简介 [Nginx] 大名鼎鼎,麻雀虽小五脏俱全,它拥有小而稳且高效的特性.为目前大多数中小企业所使用.nginx可以做以下几件事: 反向代理 负载均衡 动静分离 网页.图片缓存 [Tomcat] ...

  6. 负载均衡是什么?-高负载均衡架构

    负载均衡是什么 负载均衡:让用户的请求均匀的分布在每台服务器上.   每台服务器上搭载web服务,将dns域名,指向这台nginx服务器的IP 使用proxy_pass配合upstream来实现简单的 ...

  7. Nginx反向代理 负载均衡sky

    Nginx服务部署 Nginx简介 Nginx (engine x) 是一个轻量级的.高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器.Nginx是由伊戈尔·赛索耶夫为俄罗 ...

  8. 详解【负载均衡】(负载均衡算法、一致性hash、负载均衡架构分析)

    作者:duktig 博客:https://duktig.cn 优秀还努力.愿你付出甘之如饴,所得归于欢喜. 本文源码参看:https://github.com/duktig666/distribute ...

  9. Nginx + Tomcat 实现负载均衡

    文章目录 引言 一.案例架构 二.安装部署 1. nginx 服务器安装部署 1.1 脚本一键安装部署 1.2 配置修改 2. tomcat01 服务器安装部署 2.1 安装 JDK 环境 2.2 安 ...

  10. FastDFS蛋疼的集群和负载均衡(十五)之lvs四层+Nginx七层负载均衡

    ###Interesting things lvs+nginx的拓扑图 准备环境,基于上一篇[Diary Report 2018-1-3]关于FastDFS蛋疼的集群和负载均衡(十三)之LVS-DR环 ...

最新文章

  1. 用图解释RNN运行的部分过程
  2. 使用ssh-keygen生成私钥和公钥
  3. java mp3 to wav_java实现wavToMP3格式转换详解
  4. jQuery 1.6 中更新的几个功能
  5. java实现生产者消费者问题
  6. Startup Error: Unable to detect graphics environment
  7. 大型企业用什么orm_企业信息化系统建设的方案有什么用?
  8. CHD+CM-1 安装
  9. android+apk编译器,APK编辑器
  10. 蜡笔同步 java_蜡笔同步常见问题解析
  11. 【Debug】安装labelme过程中出现的问题
  12. Tableau雷达图和凹凸图
  13. 学习有限元需了解的知识点
  14. 零工经济爆发:蓝鸟云破而后立,BOSS直聘稳步推进
  15. 网站站点地图SiteMap生成程序(PHP)
  16. 4. 模型测试 - 测试过程、模型测试方法概述
  17. Apache Commons 系列简介 之 CLI
  18. 目标检测 慎用旋转数据增强
  19. PHP对接钉钉群机器人
  20. 案例3:百度地图api-个性化地图茶田样式

热门文章

  1. 十几年后我才知道,嫁了一个硬核老公
  2. SpringCloud微服务云架构构建B2B2C电子商务平台简介
  3. JS获取字符串实际长度(包含汉字)的简单方法
  4. pandas 索引与列相互转化
  5. Facebook为其全球75%的用户推出反模仿工具
  6. CentOS 6.7 RPM安装MySQL
  7. Delphi、C#之父Anders Hejlsberg首次访华 推广TypeScript
  8. linux shell 报错 Syntax error: Bad for loop variable
  9. Office 365系列(3)------Office 365认证使用ADFS安装部署参考
  10. Visual Studio跨平台开发Xamarin