Nginx主主负载均衡架构

简介:

151919340.jpg

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

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

Nginx负载均衡作服务器遇到的故障一般有:1.服务器网线松动等网络故障;2.服务器硬件故障发生损坏现象而crash3.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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
     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配置文件如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
! Configuration File  for  keepalived
global_defs {
    notification_email {
    yuhongchun027@163.com
         }
    notification_email_from keepalived@chtopnet.com
    smtp_server 127.0.0.1
    smtp_connect_timeout 30
    router_id LVS_DEVEL
}
vrrp_instance VI_1 {
     state MASTER
     interface eth0
     virtual_router_id 51
     priority 100
     advert_int 1
     authentication {
         auth_type PASS
         auth_pass 1paituan.com
     }
     virtual_ipaddress {
         192.168.1.8
     }
}
vrrp_instance VI_2 {
     state BACKUP
     interface eth0
     virtual_router_id 52
     priority 99
     advert_int 1
     authentication {
         auth_type PASS
         auth_pass 1paituan.com
     }
     virtual_ipaddress {
         192.168.1.9
     }
}

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
! Configuration File  for  keepalived
global_defs {
    notification_email {
    yuhongchun027@163.com
         }
    notification_email_from keepalived@chtopnet.com
    smtp_server 127.0.0.1
    smtp_connect_timeout 30
    router_id LVS_DEVEL
}
vrrp_instance VI_1 {
     state BACKUP
     interface eth0
     virtual_router_id 51
     priority 99
     advert_int 1
     authentication {
         auth_type PASS
         auth_pass 1paituan
     }
     virtual_ipaddress {
         192.168.1.8                 
     }
}
vrrp_instance VI_2 {
     state MASTER
     interface eth0
     virtual_router_id 52
     priority 100
     advert_int 1
     authentication {
         auth_type PASS
         auth_pass 1paituan
     }
     virtual_ipaddress {
         192.168.1.9                 
     }
}

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/bash
while   :
do
nginxpid=` ps  -C nginx --no-header |  wc  -l`
  if  [ $nginxpid - eq  0 ]; then
   /usr/local/nginx/sbin/nginx
   sleep  5
nginxpid=` ps  -C nginx --no-header |  wc  -l`
   echo  $nginxpid
     if  [ $nginxpid - eq  0 ]; then
  /etc/init .d /keepalived  stop
    fi
  fi
  sleep  5
done

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

1
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
2
3
4
5
6
7
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 eth0
   inet 192.168.1.8 /32  scope global eth0

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

1
2
3
4
5
6
7
8
9
10
11
12
13
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 noop
   link/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)其它问题暂时没有想到,待补充。










本文转自 抚琴煮酒 51CTO博客,原文链接:http://blog.51cto.com/yuhongchun/655646,如需转载请自行联系原作者
相关实践学习
部署高可用架构
本场景主要介绍如何使用云服务器ECS、负载均衡SLB、云数据库RDS和数据传输服务产品来部署多可用区高可用架构。
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
目录
相关文章
|
10天前
|
负载均衡 算法 应用服务中间件
面试题:Nginx有哪些负载均衡算法?Nginx位于七层网络结构中的哪一层?
字节跳动面试题:Nginx有哪些负载均衡算法?Nginx位于七层网络结构中的哪一层?
28 0
|
2月前
|
供应链 Java
云HIS技术架构:Angular+Nginx+Java+Spring,SpringBoot
标准数据维护 用户信息:维护用户的基本信息,所在科室以及各个系统所具体的权限。 科室信息:维护医院的科室信息。 数据字典:标准字典信息的维护。 药品/诊疗目录维护:维护药品和诊疗目录的基本信息。
31 2
|
17天前
|
负载均衡 网络协议 Java
构建高效可扩展的微服务架构:利用Spring Cloud实现服务发现与负载均衡
本文将探讨如何利用Spring Cloud技术实现微服务架构中的服务发现与负载均衡,通过注册中心来管理服务的注册与发现,并通过负载均衡策略实现请求的分发,从而构建高效可扩展的微服务系统。
|
2月前
|
负载均衡 Java 应用服务中间件
|
2月前
|
负载均衡 监控 应用服务中间件
Nginx负载均衡:你的网站流量翻倍利器
Nginx负载均衡:你的网站流量翻倍利器
42 0
|
2月前
|
消息中间件 关系型数据库 MySQL
使用Nginx的stream模块实现MySQL反向代理与RabbitMQ负载均衡
使用Nginx的stream模块实现MySQL反向代理与RabbitMQ负载均衡
60 0
|
3月前
|
缓存 负载均衡 算法
【Nginx】Nginx 负载均衡
【1月更文挑战第25天】【Nginx】Nginx 负载均衡
|
3月前
|
负载均衡 应用服务中间件 nginx
【实践】使用Nginx作为GrayLog日志接入的负载均衡
【实践】使用Nginx作为GrayLog日志接入的负载均衡
44 0
|
3月前
|
负载均衡 算法 应用服务中间件
深入了解Nginx底层负载均衡算法
深入了解Nginx底层负载均衡算法
33 0
|
3月前
|
负载均衡 应用服务中间件 nginx
Nginx四层负载均衡在秒杀系统中的应用
Nginx四层负载均衡在秒杀系统中的应用
26 0