Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1284900
  • 博文数量: 161
  • 博客积分: 10192
  • 博客等级: 上将
  • 技术积分: 2165
  • 用 户 组: 普通用户
  • 注册时间: 2006-07-27 17:09
文章分类

全部博文(161)

文章存档

2012年(2)

2011年(13)

2010年(137)

2009年(5)

2008年(4)

我的朋友

分类: LINUX

2010-08-27 10:51:55

另 外,我维护的电子商务网站并发大约在1000左右,此时,Nginx+Apache集群运行得非常稳定,尤其是apache,并没有想象中那般弱;其实, 在内存足够(>=8G)的情况,测试时不连数据库的话,单台apache+php5能顶得住6000并发,而且相当稳定。在网站升级架构方面,我不 赞成全面淘汰生级,锦上添花式的升级会更好。

本图已被缩小,点击放大显示原图 

第一部分:Nginx+Keepalived的说明及环境说明

喜 欢看我博客或文章的朋友都知道,我一直主力推崇Nginx+Keepalived作web的负载均衡高可用架构,并积极将其用于项目方案中;Nginx负 载均衡作服务器遇到的故障一般有①服务器网线松动等网络故障;②服务器硬件故障从而crash;③nginx服务死掉;遇到前二者情 况,keeaplived是能起到HA的作用的;然而遇到③种情况就没有办法了,但可以通过shell监控解决这问题,从而实现真正意义上的负载均衡高可 用。此篇的最新更新时间为2010年6月25号,下面将其安装步骤详细说明下:

环境:

  1. centos5.3(64位)、nginx-0.7.51、keepalived-1.1.15   
  2. 主nginx负载均衡器:192.168.0.154  
  3. 辅nginx负载均衡器:192.168.9.155  
  4. vip:192.168.0.188

    第二部分:分别安装Nginx负载均衡器及相关配置脚本

    先安装Nginx负载均衡器,nginx负载的配置就用一般的模板来配置了

    1. #添加运行nginx的用户和组www  
    2. groupadd www   
    3. useradd -g www www   
    4. wget   
    5. tar zxvf pcre-7.8.tar.gz  
    6. cd pcre-7.8/  
    7. ./configure  
    8. make && make install  
    9. wget   
    10. tar zxvf nginx-0.7.51.tar.gz  
    11. cd nginx-0.7.51/  
    12. ./configure --user=www --group=www --prefix=/usr/local/webserver/nginx --with-http_stub_status_module --with-http_ssl_module  
    13. make && make install 

    配置nginx负载均衡器的配置文件vim /usr/local/nginx/conf/nginx.conf,此篇文章仅仅只是我的某项目的配置文档,纯80转发;如果对nginx配置有https要求的可参考张宴的相关文章。

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


      第三部分:安装Keepalived,让其分别作web及Nginx的HA

      安装keepalived,并将其做成服务模式,方便以后调试。

      1. wget   
      2. #tar zxvf keepalived-1.1.15.tar.gz  
      3. #cd keepalived-1.1.15  
      4. #./configure --prefix=/usr/local/keepalived  
      5. #make   
      6. #make install  
      7. #cp /usr/local/keepalived/sbin/keepalived /usr/sbin/  
      8. #cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/  
      9. #cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/  
      10. #mkdir /etc/keepalived  
      11. #cd /etc/keepalived/  
      12.  
      13. vim keepalived.conf  
      14. ! Configuration File for keepalived  
      15. global_defs {  
      16.    notification_email {  
      17.    yuhongchun027@163.com  
      18.         }  
      19.    notification_email_from keepalived@chtopnet.com  
      20.    smtp_server 127.0.0.1  
      21.    smtp_connect_timeout 30  
      22.    router_id LVS_DEVEL  
      23. }  
      24. vrrp_instance VI_1 {  
      25.     state MASTER  
      26.     interface eth0  
      27.     virtual_router_id 51  
      28.     mcast_src_ip 192.168.0.154    <==主nginx的IP地址  
      29.     priority 100  
      30.     advert_int 1  
      31.     authentication {  
      32.         auth_type PASS  
      33.         auth_pass chtopnet  
      34.     }  
      35.     virtual_ipaddress {  
      36.         192.168.0.188                      <==vip地址  
      37.     }  
      38. }  
      39. #service keepalived start 

      我们来看一下日志:

      1. [root@ltos ~]# tail /var/log/messages  
      2. Oct 6 03:25:03 ltos avahi-daemon[2306]: Registering new address record for 192.168.0.188 on eth0.  
      3. Oct 6 03:25:03 ltos avahi-daemon[2306]: Registering new address record for 192.168.0.154 on eth0.  
      4. Oct 6 03:25:03 ltos avahi-daemon[2306]: Registering HINFO record with values 'I686'/'LINUX'.  
      5. Oct 6 03:25:23 ltos avahi-daemon[2306]: Withdrawing address record for fe80::20c:29ff:feb9:eeab on eth0.  
      6. Oct 6 03:25:23 ltos avahi-daemon[2306]: Withdrawing address record for 192.168.0.154 on eth0.  
      7. Oct 6 03:25:23 ltos avahi-daemon[2306]: Host name conflict, retrying with <ltos-31> 

      很显然vrrp已经启动,我们还可以通过命令来检查

      1. [root@ltos html]# ip addr  
      2. 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue   
      3.     link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00  
      4.     inet 127.0.0.1/8 scope host lo  
      5.     inet6 ::1/128 scope host   
      6.        valid_lft forever preferred_lft forever  
      7. 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000  
      8.     link/ether 00:0c:29:ba:9b:e7 brd ff:ff:ff:ff:ff:ff  
      9.     inet 192.168.0.154/24 brd 192.168.0.255 scope global eth0  
      10.     inet 192.168.0.188/32 scope global eth0  
      11.     inet6 fe80::20c:29ff:feba:9be7/64 scope link   
      12.        valid_lft forever preferred_lft forever  
      13. 3: sit0: <NOARP> mtu 1480 qdisc noop   
      14.     link/sit 0.0.0.0 brd 0.0.0.0 

      说明vip已经启动,这样主服务器就配置好了,辅机的配置大致一样,除了配置文件有少部分的变化,下面贴出辅机的配置文件:

      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. }  
      11. vrrp_instance VI_1 {  
      12.     state BACKUP  
      13.     interface eth0  
      14.     virtual_router_id 51  
      15.     mcast_src_ip 192.168.0.155              <==辅nginx的IP的地址  
      16.     priority 100  
      17.     advert_int 1  
      18.     authentication {  
      19.         auth_type PASS  
      20.         auth_pass chtopnet  
      21.     }  
      22.     virtual_ipaddress {  
      23.         192.168.0.188  
      24.     }  
      25. }

第四部分:针对Keepalived的不足,用Nginx_pid.sh来监控nginx进程,实现真正意义上的负载均衡高可用。

针 对Nginx+Keepalived,编写nginx监控脚本nginx_pid.sh,此脚本思路其实也很简单,即放置在后台一直监控nginx进程; 如进程消失,尝试重启nginx,如是失败则立即停掉本机的keepalived服务,让另一台负载均衡器接手,此脚本直接从生产环境下载:

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

然 后置于后台运行 sh /root/nginx_pid.sh &,这种写法是错误的,这样你用root用户logout后,此进程会消失;正确写法为nohup/bin/bash /root/nginx_pid.sh &,附带下注释:如果你正在运行一个进程,而且你觉得在退出帐户时该进程还不会结束,那么可以使用nohup命令。该命令可以在你退出root帐 户之后继续运行相应的进程。nohup就是不挂起的意思( no hang up),哈哈,差点老马失蹄了。

后记:

此线上环境网络非常复杂,这也是LVS+Keepalived失败的原因。目前此套架构在1000并发的电子商务网站非常稳定,带来的直接影响就是 nginx_backup一直处于闲置状态。相对于张宴的双机轮询而言,我感觉他的可能更加完美,因为目前我的Nginx仅仅只做了负载均衡器,如果以后 有机会我会尝试做负载均衡器/反向代理加速。

测试其效果方法很简单,分别在主辅机上建立不同的主页,index.html的内容分别为192.168.0.154,192.168.0.155,然后用客户机上elinks ,主机down掉后辅机会马上接替提供服务,间隔时间几乎无法感觉出来,如有疑问请联系(抚琴煮酒)

阅读(1533) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-08-29 08:27:08

Download More than 1000 free IT eBooks: http://free-ebooks.appspot.com

chinaunix网友2010-08-29 08:27:08

Download More than 1000 free IT eBooks: http://free-ebooks.appspot.com