设为首页 收藏本站
查看: 972|回复: 0

[经验分享] nginx+keepalived+apache构建高可用集群

[复制链接]

尚未签到

发表于 2018-11-10 10:42:59 | 显示全部楼层 |阅读模式
  本文描述:nginx基于keepalived实现高可用,基于自身的proxy功能代理web服务器,并实现负载均衡。
  实验环境:redhat5.8
  
实验拓扑结构:nginx+keepalived服务器2台,apache服务器2台,构建简单的高可用集群
DSC0000.png

  ip分配:
  


  • nginx1.weiyang.org 192.168.3.22  nginx1
  • nginx2.weiyang.org 192.168.3.33  nginx2
  • apache1.weiyang.org 192.168.3.205   apache205
  • apache2.weiyang.org 192.168.3.206   apache206
  

  一、实验环境安装和配置
  
nginx和apache的安装配置这里就不细说了,我采用的是编译安装;需要注意的是两台apache的网页文件目录下的index.html中内容分别是:it works from 205 和 it works from 206;便于我们来区分是否实现了负载均衡的效果(注:这里只是虚拟机中的简单实验,实际生产环境中文件必须保持一致)
  二、在前端两台nginx上安装keepalived
  
keepalived的下载地址:http://www.keepalived.org/download.html;这里我使用最新的1.2.7版本。
  
注:事先yum安装开发包组“Development Tools” “Development Libraries” 已事先安装完毕
  
下载完成后解压安装:
  


  • #tar xvf keepalived-1.2.7.tar.gz
  • #cd keepalived-1.2.7
  • #./configure --prefix=/usr/local/keepalived  ##指定keepalived的安装目录
  • #make && make install
  

  安装完成后,为keepalived提供配置文件和服务脚本
  


  • #mkdir /etc/keepalived  ##为keepalived创建配置文件目录,默认配置文件从/etc/keepalived下读取
  • #cp /usr/local/keepalived/sbin/keepalived /usr/sbin/ ##复制keepalived的二进制命令
  • #cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/  ##提供启动脚本
  • #cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/ ##keepalived的主配置文件
  

  编辑/etc/keepalived/keepalived.conf文件,修改内容如下:
  


  • ! Configuration File for keepalived

  • global_defs {
  •    notification_email {
  •      acassen@firewall.loc
  •      failover@firewall.loc
  •      sysadmin@firewall.loc  ##这三个都是邮箱地址,意思是当发生故障时向这三个邮箱发送邮件
  •    }
  •    notification_email_from Alexandre.Cassen@firewall.loc    ##以哪个邮箱向上边定义的三个邮箱发送邮件
  •    smtp_server 127.0.0.1
  •    smtp_connect_timeout 30 ##smtp连接超时时间
  •    router_id LVS_DEVEL  ##服务器标识符
  • }

  • vrrp_instance VI_1 {
  •     state MASTER ##主服务器,从服务器设置为BACKUP;当master发生故障时,会自动转移到从上作为主,当主恢复工作时,再自动转移到定义的主上
  •     interface eth0 ##指定从哪个网卡发送VRRP信息的
  •     virtual_router_id 51 ##虚拟路由的组id,主和从必须在同一个组
  •     priority 100 ##优先权,从的设置为80
  •     advert_int 1
  •     authentication {
  •         auth_type PASS ##认证方式
  •         auth_pass 1111  ##认证的密钥
  •     }
  •     virtual_ipaddress {
  •         192.168.3.18    ##VRRP的ip,也就是向客户端开放的ip,即vip
  •     }
  • }
  • 配置到这里就可结束了,之下的这里用不到;
  

  在另一台同样的方法配置;只要将priority 100 改为80即可(只要小于主定义的100即可);
  
两台服务器上都启动keepalived服务:service keepalived start
  

  
测试keepalived的效果
  
在nginx1上执行如下命令:
  


  • [root@nginx1 ~]# ip addr
  •     1: lo:  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:  mtu 1500 qdisc pfifo_fast qlen 1000
  •         link/ether 00:0c:29:e7:cb:a0 brd ff:ff:ff:ff:ff:ff
  •         inet 192.168.3.22/24 brd 192.168.2.255 scope global eth0
  •         inet 192.168.3.18/32 scope global eth0
  •         inet6 fe80::20c:29ff:fee7:cba0/64 scope link
  •             valid_lft forever preferred_lft forever
  •     3: sit0:  mtu 1480 qdisc noop
  •         link/sit 0.0.0.0 brd 0.0.0.0
  •     ###vip绑定在nginx1上,现在我们停掉nginx1上的keepalived

  •     #service keepalived stop
  •     ###在nginx2上执行ip addr 命令,看到如下结果:
  •     [root@nginx2 ~]# ip addr
  •     1: lo:  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:  mtu 1500 qdisc pfifo_fast qlen 1000
  •         link/ether 00:0c:29:4f:9a:9d brd ff:ff:ff:ff:ff:ff
  •         inet 192.168.3.33/24 brd 192.168.2.255 scope global eth0
  •         inet 192.168.3.18/32 scope global eth0
  •         inet6 fe80::20c:29ff:fe4f:9a9d/64 scope link
  •             valid_lft forever preferred_lft forever
  •     3: sit0:  mtu 1480 qdisc noop
  •         link/sit 0.0.0.0 brd 0.0.0.0

  • 到此为止,基于keepalived实现nginx的高可用就成功了。。
  

  三、下面来做nginx的反向代理,构建简单的高可用负载均衡集群:
  
在前端两台nginx服务器上做同样的修改:
  
编辑nginx的配置文件:
  


  • #vim /etc/nginx/nginx.conf
  •     user nginx nginx; ##以哪个用户和用户组运行nginx;安装nginx之前要先创建这个组和用户
  •     worker_processes  2;    ##开启几个进程
  •     events {
  •     use epoll;              ##nginx的工作机制
  •     worker_connections  1024;   ##单进程最大啊连接数,这是默认值,可修改为65535
  •     }


  •     http {
  •         include       mime.types;
  •         default_type  application/octet-stream;
  •     sendfile        on;
  •     #tcp_nopush     on;

  •     #keepalive_timeout  0;
  •     keepalive_timeout  65;  ##nginx长连接时长

  •     #gzip  on;
  •     upstream weiyang {      ##定义后端web服务器的cluster
  •         server 192.168.3.205:80 max_fails=3 fail_timeout=10s;   ##后端服务器的ip,以及最大错误数和超时时长
  •         server 192.168.3.206:80 max_fails=3 fail_timeout=10s;
  •     }


  •     server {
  •         listen       80;
  •         server_name  192.168.3.18;    ##vrrp的ip地址
  •         location / {
  •                 root   html;
  •                 index  index.html index.html;
  •                 proxy_pass http://weiyang/;     ##为哪个backend做反向代理
  •                 proxy_redirect off;
  •                 proxy_set_header X-Real-IP $remote_addr;
  •                 proxy_set_header X-Forwarded-For Proxy_add_x_forwarded_for;
  •         }
  •         location /nginx {       ##nginx的状态页面
  •                 access_log off;
  •                 stub_status on;
  •         }

  •         #error_page  404              /404.html;

  •         # redirect server error pages to the static page /50x.html
  •         #
  •         error_page   500 502 503 504  /50x.html;
  •         location = /50x.html {
  •             root   html;
  •         }
  •     }
  • }

  • ##nginx做完配置文件更改后重启nginx服务,同时开启后端两台web服务器的httpd服务

  • #service nginx restart
  • #service httpd start
  

  四、实现nginx+keepalived+apache构建高可用集群,我们还要修改如下信息:
  
试想,如果nginx1服务器上的nginx服务故障了,但keepalived服务运行正常,照样会形成单点故障;
  
为了实时的检测nginx服务的运行是否正常,这里写一个小脚本,来检测它的运行情况。
  
脚本实现思想:当nginx服务故障时,我们就直接杀掉keepalived的进程,来实现故障转移:
  
脚本如下:
  


  • # vim ngpid.sh
  • #!/bin/bash
  • N='ps -C nginx --no-header |wc -l'                ## 查看是否有nginx进程,并对其做行计算,把计算值赋给变量N
  • if [ $N -eq 0 ];then                              ## if语句进行判断,若N不为0,此脚本执行结束;若N为0,试着重启nginx服务,睡2秒,
  •          service nginx start
  •          sleep 2
  •          if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then   ##再次判断,若依然为0,
  •          killall keepalived                                   ##则直接杀掉keepalived的所有进程,实现故障转移
  •          fi
  • fi
  • # chmod +x ng_pid.sh

  • 将此脚本放在/root/bash/下,并写入任务计划,每一小时执行一次,如下所示
  • echo -e '* 1 * * * /root/bash/ngpid.sh' >> /etc/crontab
  

  五、访问测试
  
在本地主机浏览器中输入如下地址:
  
http://192.168.3.18  查看页面显示结果是否轮询,
  
这时nginx1为高可用的主:将nginx服务停掉,稍等3秒。。
  
再次访问http://192.168.3.18  查看页面显示是否依然正常轮询
  基于nginx的高可用负载均衡到此配置成功,新手一个,大家多多指教。。



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-633165-1-1.html 上篇帖子: 玩玩负载均衡---在window与linux下配置nginx 下篇帖子: Nginx日志格式设置
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表