Nginx + keepalived 主备负载均衡搭建实战

2012-10-20 小程 网站应用

  公司一个业务网站系统之前上线时有提过做负载均衡方案,但后来因为种种原因未能正常上线,整个系统全部是单点故障,运行了大半年时间没有出过故障已经是烧高香了。现在系统访问量上来了,需要对系统进行升级解决单点故障的问题。老板说要我负责把这个系统升级方案规划好。
   我根据目前一些资料情况,给出了一份用nginx+keepalived做主备负载均衡的方案,另外老板也比较倾向于nginx软件,所以方案给出了之后,就开始实施了。下面是一些配置过程,通过这次的系统升级,也熟悉了一些对nginx这个高效软件的应用。

1.系统环境
  前端两台centos5.6 64位系统装nginx 和 keepalived 做负载均衡,后端全部是windows2008系统的IIS提供web服务。(只列出部分机器)

点击查看原图


  方案规划中,通过keepalived虚拟出两个公网IP地址,分别做域名指向,将www.abc.com指向220.180.112.14,将域名pic.abc.com域名指向220.180.112.15,配置nginx做负载均衡,对www.abc.com的访问负载到内网"web1"和"web2"上,对pic.abc.com的访问负载到"图片1"和"图片2"两台机器上。网络拓扑图如下:

点击查看原图


2. 安装配置过程
软件下载

 
 
  1. [root@itdhz ~]# wget http://nginx.org/download/nginx-1.2.3.tar.gz
  2. [root@itdhz ~]# wget http://nchc.dl.sourceforge.net/project/pcre/pcre/8.12/pcre-8.12.tar.gz
  3. [root@itdhz ~]# wget http://www.keepalived.org/software/keepalived-1.2.7.tar.gz


1) Nginx安装配置(两台机器一样安装)

 
 
  1. [root@itdhz ~]# tar zxvf pcre-8.12.tar.gz
  2. [root@itdhz ~]# cd pcre-8.12
  3. [root@itdhz ~]# ./configure
  4. [root@itdhz ~]# make && make install
  5.  
  6. [root@itdhz ~]# groupadd www
  7. [root@itdhz ~]# useradd g www www
  8. [root@itdhz ~]# tar zxvf nginx-1.2.3.tar.gz
  9. [root@itdhz ~]# cd nginx-1.2.3
  10. [root@itdhz ~]# ./configure --user=www --group=www \
  11. --prefix=/usr/local/nginx \
  12. --with-http_stub_status_module \
  13. --with-http_ssl_module
  14. [root@itdhz ~]# make && make install


2) Keepalived安装配置(两台机器都要安装)

 
 
  1. [root@itdhz ~]# tar zxvf keepalived-1.2.7.tar.gz
  2. [root@itdhz ~]# cd keepalived-1.2.7
  3. [root@itdhz ~]# ./configure –prefix=/usr/local/keepalived
  4. [root@itdhz ~]# make && make install
  5. [root@itdhz ~]# mkdir /etc/keepalived
  6. [root@itdhz ~]# cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
  7. [root@itdhz ~]# cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
  8. [root@itdhz ~]# cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/
  9. [root@itdhz ~]# chkconfig --add keepalived
  10. [root@itdhz ~]# chkconfig keepalived on


3) Keepalived 配置

(主keepalived即nginx-1上的配置)
 
 
  1. ! Configuration File for keepalived
  2. global_defs {
  3. notification_email {
  4. root@189.cn
  5. }
  6. notification_email_from root@189.cn
  7. smtp_server 127.0.0.1
  8. smtp_connect_timeout 30
  9. router_id LVS_DEVEL
  10. }
  11. vrrp_script Monitor_Nginx {
  12. script "/usr/local/scripts/nginx_pid.sh"
  13. interval 2
  14. weight 2
  15. }
  16. //定义一个检测nginx程序的脚本
  17. vrrp_instance VI_1 {
  18. state MASTER
  19. interface eth1 // 实例绑定到一块稳定的网卡上
  20. virtual_router_id 51
  21. priority 180 // 评定优先级,数值大的为master
  22. advert_int 1 // 心跳检测时间,单位秒
  23. authentication { // 主备nginx之间的通信认证
  24. auth_type PASS
  25. auth_pass 1234
  26. }
  27. track_script {
  28. Monitor_Nginx
  29. }
  30. virtual_ipaddress { // 配置VIP、子网掩码、VIP要游动的网卡
  31. 220.180.112.14/27 dev eth0
  32. 220.180.112.15/27 dev eth0
  33. 172.16.10.99/24 dev eth1
  34. }
  35. }

(备keepalived 上的配置)
 
 
  1. ! Configuration File for keepalived
  2. global_defs {
  3. notification_email {
  4. root@189.com
  5. }
  6. notification_email_from root@189.cn
  7. smtp_server 127.0.0.1
  8. smtp_connect_timeout 30
  9. router_id LVS_DEVEL
  10. }
  11. vrrp_script Monitor_Nginx {
  12. script "/usr/local/scripts/nginx_pid.sh"
  13. interval 2
  14. weight 2
  15. }
  16. vrrp_instance VI_1 {
  17. state BACKUP
  18. interface eth1
  19. virtual_router_id 51
  20. priority 100
  21. advert_int 1
  22. authentication {
  23. auth_type PASS
  24. auth_pass 1234
  25. }
  26. track_script {
  27. Monitor_Nginx
  28. }
  29. virtual_ipaddress {
  30. 220.180.112.14/27 dev eth0
  31. 220.180.112.15/27 dev eth0
  32. 172.16.10.99/24 dev eth1
  33. }
  34. }

(/usr/local/scripts/nginx_pid.sh脚本的内容)
 
 
  1. [root@itdhz ~]# cat /usr/local/scripts/nginx_pid.sh
  2. #!/bin/bash
  3. A=`ps -C nginx --no-header |wc -l`
  4. if [ $A -eq 0 ];then // 判断nginx是否未启用
  5. /usr/local/nginx/sbin/nginx // 运行nginx
  6. sleep 3
  7. if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
  8. //3秒后检测,如果nginx启动出错就关闭keepalived
  9. killall keepalived
  10. fi
  11. fi

4) Nginx配置
  两台nginx的配置一样,如下:
 
 
  1. user www www;
  2. worker_processes 1;
  3.  
  4. #error_log logs/error.log;
  5. #error_log logs/error.log notice;
  6. #error_log logs/error.log info;
  7.  
  8. #pid logs/nginx.pid;
  9.  
  10. events {
  11. use epoll;
  12. worker_connections 51200;
  13. }
  14.  
  15. http {
  16. include mime.types;
  17. default_type application/octet-stream;
  18.  
  19. log_format main '$remote_addr - $remote_user [$time_local] "$request" '
  20. '$status $body_bytes_sent "$http_referer" '
  21. '"$http_user_agent" "$http_x_forwarded_for"';
  22.  
  23. access_log logs/access.log main;
  24.  
  25. sendfile on;
  26. #tcp_nopush on;
  27.  
  28. #keepalive_timeout 0;
  29. keepalive_timeout 65;
  30.  
  31. gzip on;
  32.  
  33. #####################################
  34. # web
  35. upstream web {
  36. server 172.16.10.10;
  37. server 172.16.10.11;
  38. ip_hash;
  39. }
  40.  
  41. # pic
  42. upstream pic {
  43. server 172.16.10.20;
  44. server 172.16.10.21;
  45. ip_hash;
  46. }
  47.  
  48. # natip
  49. upstream natip {
  50. server 172.16.10.20:8080;
  51. server 172.16.10.21:8080;
  52. ip_hash;
  53. }
  54.  
  55. #########################################
  56. # web
  57. server {
  58. listen 80;
  59. server_name www.abc.com;
  60.  
  61. location / {
  62. proxy_pass http://web;
  63. proxy_set_header Host $host;
  64. proxy_set_header X-Real-IP $remote_addr;
  65. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  66. }
  67. location /status {
  68. stub_status on;
  69. access_log off;
  70. error_log off;
  71. }
  72. }
  73.  
  74. # pic
  75. server {
  76. listen 80;
  77. server_name pic.abc.com;
  78.  
  79. location / {
  80. proxy_pass http://pic;
  81. proxy_set_header Host $host;
  82. proxy_set_header X-Real-IP $remote_addr;
  83. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  84. }
  85. location /status {
  86. stub_status on;
  87. access_log off;
  88. error_log off;
  89. }
  90. }
  91.  
  92. # natip
  93. server {
  94. listen 8080;
  95. server_name 172.16.10.4;
  96.  
  97. location / {
  98. proxy_pass http://natip;
  99. proxy_set_header Host $host;
  100. proxy_set_header X-Real-IP $remote_addr;
  101. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  102. }
  103. location /status {
  104. stub_status on;
  105. access_log off;
  106. error_log off;
  107. }
  108. }
  109. }

3. Keepalived 主备切换测试
  首先启动两台服务器的keepalived和nginx,Keepalived虚拟出两个公网IP地址,220.180.112.14和15,长ping此IP地址,关闭nginx-1机器上的keepalived服务,ping在中断2-3秒后又恢复正常,访问web站点正常,查看备用keepalived日志,发现参数由BACKUP变为MASTER,关闭nginx-1机器的网卡也能实现一样的效果。重新启用nginx-1的keepalived和nginx服务,再分别尝试关闭nginx-2机器上的keepalived服务或者网卡,发现ping以及页面访问都正常。

4. Nginx 负载均衡测试
  Nginx负载均衡常用的有两种负载方式,rr和ip_hash,rr负载是根据用户访问请求进行后台real-server的轮询,ip_hash负载是将用户访问web时的IP地址,进行一个hash算法,根据得出的值的情况将用户访问分配到对应的real-server上,用户如果IP地址不变将会一直访问同一台real-server。两种负载均衡在其中一台real-server宕机的情况下,都会选择下一台将访问转移到下一台real-server上。我们这里采用ip_hash负载方式。

  Nginx通过下面的代码将对220.180.112.14的访问负载到172.16.10.10和11两台内网web服务器上,访问通过IP地址能够正常访问页面,停止172.16.10.10和11其中一块网卡,访问不中断。

 
 
  1. upstream 220.180.112.14 {
  2. server 172.16.10.10;
  3. server 172.16.10.11;
  4. ip_hash;
  5. }

5. 上面就是整个nginx+keepalived实现主备负载均衡过程中的一些配置,完成根据自己实施情况来写,有什么不对的地方,或者好的建议,希望大家留言告之,大家共同交流学习。


标签: nginx 负载均衡 upstream keepalived

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值