nginx主主负载均衡架构-凯发app官方网站

凯发app官方网站-凯发k8官网下载客户端中心 | | 凯发app官方网站-凯发k8官网下载客户端中心
  • 博客访问: 537102
  • 博文数量: 48
  • 博客积分: 1249
  • 博客等级: 中尉
  • 技术积分: 1926
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-04 10:22
文章存档

2012年(3)

(45)

相关博文
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·

分类: 系统运维

2011-12-15 11:03:09

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。

在和一些朋友交流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的安装比较简单,我这里就不重复了,大家可以参考我的专题系列的文章,如下地址,我这里附上nginx.conf配置文件,如下所示:

  1.     user www www; 
  2.     worker_processes 8; 
  3.     pid /usr/local/nginx/logs/nginx.pid; 
  4.     worker_rlimit_nofile 51200; 
  5.     events 
  6.     { 
  7.     use epoll; 
  8.     worker_connections 51200; 
  9.     } 
  10.     http{ 
  11.     include       mime.types; 
  12.     default_type application/octet-stream; 
  13.     server_names_hash_bucket_size 128; 
  14.     client_header_buffer_size 32k; 
  15.     large_client_header_buffers 4 32k; 
  16.     client_max_body_size 8m; 
  17.     sendfile on; 
  18.     tcp_nopush     on; 
  19.     keepalive_timeout 60; 
  20.     tcp_nodelay on; 
  21.     fastcgi_connect_timeout 300; 
  22.     fastcgi_send_timeout 300; 
  23.     fastcgi_read_timeout 300; 
  24.     fastcgi_buffer_size 64k; 
  25.     fastcgi_buffers 4 64k; 
  26.     fastcgi_busy_buffers_size 128k; 
  27.     fastcgi_temp_file_write_size 128k; 
  28.     gzip on; 
  29.     gzip_min_length 1k; 
  30.     gzip_buffers     4 16k; 
  31.     gzip_http_version 1.0; 
  32.     gzip_comp_level 2; 
  33.     gzip_types       text/plain application/x-javascript text/css application/xml; 
  34.     gzip_vary on; 
  35.      
  36.     upstream backend 
  37.     { 
  38.     ip_hash; 
  39. server 192.168.1.17:80; 
  40.     server 192.168.1.18:80; 
  41.     } 
  42.     server { 
  43.     listen 80; 
  44.     server_name 
  45.     location / { 
  46.     root /var/www/html ; 
  47.     index index.php index.htm index.html; 
  48.     proxy_redirect off; 
  49.     proxy_set_header host $host; 
  50.     proxy_set_header x-real-ip $remote_addr; 
  51.     proxy_set_header x-forwarded-for $proxy_add_x_forwarded_for; 
  52.     proxy_pass 
  53.     } 
  54.      
  55.     location /nginx { 
  56.     access_log off; 
  57.     auth_basic "nginxstatus"; 
  58.     #auth_basic_user_file /usr/local/nginx/htpasswd; 
  59.     } 
  60.      
  61.     log_format access '$remote_addr - $remote_user [$time_local] "$request" ' 
  62.     '$status $body_bytes_sent "$http_referer" ' 
  63.     '"$http_user_agent" $http_x_forwarded_for'; 
  64.     access_log /data/logs/access.log access; 
  65.     } 

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

  1. ! configuration file for keepalived 
  2. global_defs { 
  3.    notification_email { 
  4.    yuhongchun027@163.com 
  5.         } 
  6.    notification_email_from keepalived@chtopnet.com 
  7.    smtp_server 127.0.0.1 
  8.    smtp_connect_timeout 30 
  9.    router_id lvs_devel 
  10. vrrp_instance vi_1 { 
  11.     state master 
  12.     interface eth0 
  13.     virtual_router_id 51 
  14.     priority 100 
  15.     advert_int 1 
  16.     authentication { 
  17.         auth_type pass 
  18.         auth_pass 1paituan.com 
  19.     } 
  20.     virtual_ipaddress { 
  21.         192.168.1.8 
  22.     } 
  23. vrrp_instance vi_2 { 
  24.     state backup 
  25.     interface eth0 
  26.     virtual_router_id 52 
  27.     priority 99 
  28.     advert_int 1 
  29.     authentication { 
  30.         auth_type pass 
  31.         auth_pass 1paituan.com 
  32.     } 
  33.     virtual_ipaddress { 
  34.         192.168.1.9 
  35.     } 

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

  1. ! configuration file for keepalived 
  2. global_defs { 
  3.    notification_email { 
  4.    yuhongchun027@163.com 
  5.         } 
  6.    notification_email_from keepalived@chtopnet.com 
  7.    smtp_server 127.0.0.1 
  8.    smtp_connect_timeout 30 
  9.    router_id lvs_devel 
  10. vrrp_instance vi_1 { 
  11.     state backup 
  12.     interface eth0 
  13.     virtual_router_id 51 
  14.     priority 99 
  15.     advert_int 1 
  16.     authentication { 
  17.         auth_type pass 
  18.         auth_pass 1paituan 
  19.     } 
  20.     virtual_ipaddress { 
  21.         192.168.1.8                   
  22.     } 
  23. vrrp_instance vi_2 { 
  24.     state master 
  25.     interface eth0 
  26.     virtual_router_id 52 
  27.     priority 100 
  28.     advert_int 1 
  29.     authentication { 
  30.         auth_type pass 
  31.         auth_pass 1paituan 
  32.     } 
  33.     virtual_ipaddress { 
  34.         192.168.1.9                   
  35.     } 

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

  1. #!/bin/bash 
  2. while  : 
  3. do 
  4.  nginxpid=`ps -c nginx --no-header | wc -l` 
  5.  if [ $nginxpid -eq 0 ];then 
  6.   /usr/local/nginx/sbin/nginx 
  7.   sleep 5 
  8.   nginxpid=`ps -c nginx --no-header | wc -l` 
  9.   echo $nginxpid 
  10.     if [ $nginxpid -eq 0 ];then 
  11.  /etc/init.d/keepalived stop 
  12.    fi 
  13.  fi 
  14.  sleep 5 
  15. 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. 1: lo: <loopback,up,lower_up> mtu 16436 qdisc noqueue 
  2. link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 
  3. inet 127.0.0.1/8 scope host lo 
  4. 2: eth0: <broadcast,multicast,up,lower_up> mtu 1500 qdisc pfifo_fast qlen 1000 
  5. link/ether 00:0c:29:99:fb:32 brd ff:ff:ff:ff:ff:ff 
  6. inet 192.168.1.5/24 brd 192.168.1.255 scope global eth0 
  7.   inet 192.168.1.8/32 scope global eth0 

这台是ip为192.168.1.6的机器的ip addr命令显示结果:

  1. 1: lo: <loopback,up,lower_up> mtu 16436 qdisc noqueue 
  2. link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 
  3. inet 127.0.0.1/8 scope host lo 
  4. inet6 ::1/128 scope host 
  5. valid_lft forever preferred_lft forever 
  6. 2: eth0: <broadcast,multicast,up,lower_up> mtu 1500 qdisc pfifo_fast qlen 1000 
  7. link/ether 00:0c:29:7d:58:5e brd ff:ff:ff:ff:ff:ff 
  8. inet 192.168.1.6/24 brd 192.168.1.255 scope global eth0 
  9. inet 192.168.1.9/32 scope global eth0 
  10. inet6 fe80::20c:29ff:fe7d:585e/64 scope link 
  11. valid_lft forever preferred_lft forever 
  12. 3: sit0: <noarp> mtu 1480 qdisc noop 
  13.   link/sit 0.0.0.0 brd 0.0.0.0 

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

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

阅读(3528) | 评论(0) | 转发(4) |
给主人留下些什么吧!~~
")); function link(t){ var href= $(t).attr('href'); href ="?url=" encodeuricomponent(location.href); $(t).attr('href',href); //setcookie("returnouturl", location.href, 60, "/"); }
网站地图