草庐IT

nginx双机热备高可用解决方案

itnihao 2023-03-28 原文
                          结构图

1.用户通过DNS查询,得到随机的VIP1和VIP2。

2.VIP1和VIP2属于热备,负载均衡,高可用

  当RIP1无法访问,主机2会检测到,将VIP1的ip加到的eth0:ha2,即在任何时候都有高可用

3.shell脚本vip和rip要对应,nginx_loadbalance_vip1.sh运行于主机1,运行命令为 

#nohup ./nginx_loadbalance_vip1.sh >/dev/null & 后台运行

4.对于2台机器的监控,只需监控RIP即可,同时可以写一个监控脚本运行的crontab,防止脚本意外终止

--------------------------------------------------------------------

 主机1的脚本如下

cat nginx_loadbalance_vip1.sh

  1. #!/bin/bash 
  2.  
  3. LANG=C 
  4. date=$(date -d "today" +"%Y-%m-%d %H:%M:%S") 
  5. BIND_VIP1=192.168.16.238 
  6. BIND_VIP2=192.168.16.239 
  7. WEB_IP_RIP1=192.168.16.240 
  8. WEB_IP_RIP2=192.168.16.241 
  9. NETMASK=255.255.255.0 
  10. GATEWAY=192.168.16.1 
  11. BROADCAST=219.232.254.255 
  12. function_bind_vip1() 
  13.     /sbin/ifconfig eth0:ha1 ${BIND_VIP1} broadcast ${BROADCAST} netmask ${NETMASK} up 
  14.     /sbin/route   add -host ${GATEWAY}   dev eth0:ha1 
  15.  
  16.  
  17. function_bind_vip2() 
  18.     /sbin/ifconfig eth0:ha2 ${BIND_VIP2} broadcast ${BROADCAST} netmask ${NETMASK} up 
  19.     /sbin/route  add  -host ${GATEWAY}   dev eth0:ha2 
  20.  
  21. function_restart_nginx() 
  22.     kill -USR1 `cat /var/log/nginx/nginx.pid` 
  23.  
  24. function_remove_vip1() 
  25.    /sbin/ifconfig eth0:ha1 ${BIND_VIP1} broadcast ${BROADCAST} netmask ${NETMASK} down 
  26.  
  27. function_remove_vip2() 
  28.    /sbin/ifconfig eth0:ha2 ${BIND_VIP2} broadcast ${BROADCAST} netmask ${NETMASK} down 
  29.  
  30. function_vip_arping1() 
  31.    /sbin/arping -I eth0 -c 3 -s ${BIND_VIP1} ${GATEWAY} > /dev/null 2>&1 
  32.  
  33. function_vip_arping2() 
  34.    /sbin/arping -I eth0 -c 3 -s ${BIND_VIP2} ${GATEWAY} > /dev/null 2>&1 
  35.  
  36. bind_time_vip1="N"
  37. bind_time_vip2="N"
  38.  
  39.  
  40.  
  41.  
  42. while true 
  43. do 
  44.       httpcode_rip1=`/usr/bin/curl -o /dev/null -s -w %{http_code} http://${WEB_IP_RIP1}/status.htm` 
  45.       httpcode_rip2=`/usr/bin/curl -o /dev/null -s -w %{http_code} http://${WEB_IP_RIP2}/status.htm` 
  46. #vip1 
  47. if [ x$httpcode_rip1 == "x200" ]; 
  48. then 
  49.    if [ $bind_time_vip1="N" ]; 
  50.    then 
  51.        function_bind_vip1 
  52.        function_vip_arping1 
  53.        function_restart_nginx 
  54.        bind_time_vip1="Y" 
  55.    fi  
  56.       function_vip_arping1 
  57. else 
  58.    if [ $bind_time_vip1 == "Y" ]; 
  59.    then 
  60.         
  61.  
  62.        function_remove_vip1 
  63.        bind_time_vip1="N" 
  64.    fi 
  65. fi 
  66.  
  67. #vip2 
  68. if [ x$httpcode_rip2 == "x200" ]; 
  69. then 
  70.    if [ $bind_time_vip2="Y" ]; 
  71.    then 
  72.        function_remove_vip2 
  73.        bind_time_vip2="N" 
  74.    fi  
  75. else 
  76.    if [ $bind_time_vip2 == "N" ]; 
  77.    then 
  78.        function_bind_vip2 
  79.        function_vip_arping2 
  80.        function_restart_nginx 
  81.        bind_time_vip2="Y" 
  82.    fi 
  83.        function_vip_arping2 
  84. fi 
  85. sleep 5 
  86. done 
主机2的脚本如下

cat nginx_loadbalance_vip2.sh

  1. #!/bin/bash 
  2.  
  3. LANG=C 
  4. date=$(date -d "today" +"%Y-%m-%d %H:%M:%S") 
  5. BIND_VIP1=192.168.16.239 
  6. BIND_VIP2=192.168.16.238 
  7. WEB_IP_RIP1=192.168.16.241 
  8. WEB_IP_RIP2=192.168.16.240 
  9. NETMASK=255.255.255.0 
  10. GATEWAY=192.168.16.1 
  11. BROADCAST=219.232.254.255 
  12. function_bind_vip1() 
  13.     /sbin/ifconfig eth0:ha1 ${BIND_VIP1} broadcast ${BROADCAST} netmask ${NETMASK} up 
  14.     /sbin/route   add -host ${GATEWAY}   dev eth0:ha1 
  15.  
  16.  
  17. function_bind_vip2() 
  18.     /sbin/ifconfig eth0:ha2 ${BIND_VIP2} broadcast ${BROADCAST} netmask ${NETMASK} up 
  19.     /sbin/route  add  -host ${GATEWAY}   dev eth0:ha2 
  20.  
  21. function_restart_nginx() 
  22.     kill -USR1 `cat /var/log/nginx/nginx.pid` 
  23.  
  24. function_remove_vip1() 
  25.    /sbin/ifconfig eth0:ha1 ${BIND_VIP1} broadcast ${BROADCAST} netmask ${NETMASK} down 
  26.  
  27. function_remove_vip2() 
  28.    /sbin/ifconfig eth0:ha2 ${BIND_VIP2} broadcast ${BROADCAST} netmask ${NETMASK} down 
  29.  
  30. function_vip_arping1() 
  31.    /sbin/arping -I eth0 -c 3 -s ${BIND_VIP1} ${GATEWAY} > /dev/null 2>&1 
  32.  
  33. function_vip_arping2() 
  34.    /sbin/arping -I eth0 -c 3 -s ${BIND_VIP2} ${GATEWAY} > /dev/null 2>&1 
  35.  
  36. bind_time_vip1="N"
  37. bind_time_vip2="N"
  38.  
  39.  
  40.  
  41.  
  42. while true 
  43. do 
  44.       httpcode_rip1=`/usr/bin/curl -o /dev/null -s -w %{http_code} http://${WEB_IP_RIP1}/status.htm` 
  45.       httpcode_rip2=`/usr/bin/curl -o /dev/null -s -w %{http_code} http://${WEB_IP_RIP2}/status.htm` 
  46. #vip1 
  47. if [ x$httpcode_rip1 == "x200" ]; 
  48. then 
  49.    if [ $bind_time_vip1="N" ]; 
  50.    then 
  51.        function_bind_vip1 
  52.        function_vip_arping1 
  53.        function_restart_nginx 
  54.        bind_time_vip1="Y" 
  55.    fi  
  56.       function_vip_arping1 
  57. else 
  58.    if [ $bind_time_vip1 == "Y" ]; 
  59.    then 
  60.         
  61.  
  62.        function_remove_vip1 
  63.        bind_time_vip1="N" 
  64.    fi 
  65. fi 
  66.  
  67. #vip2 
  68. if [ x$httpcode_rip2 == "x200" ]; 
  69. then 
  70.    if [ $bind_time_vip2="Y" ]; 
  71.    then 
  72.        function_remove_vip2 
  73.        bind_time_vip2="N" 
  74.    fi  
  75. else 
  76.    if [ $bind_time_vip2 == "N" ]; 
  77.    then 
  78.        function_bind_vip2 
  79.        function_vip_arping2 
  80.        function_restart_nginx 
  81.        bind_time_vip2="Y" 
  82.    fi 
  83.        function_vip_arping2 
  84. fi 
  85. sleep 5 
  86. done 
注意:本文来自于张宴的nginx书籍对双机热备的讲解,脚本也来自书中,本人对其有小小的改动,大家可以参看原书的详细内容

有关nginx双机热备高可用解决方案的更多相关文章

  1. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  2. ruby - 在 jRuby 中使用 'fork' 生成进程的替代方案? - 2

    在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',

  3. ruby-on-rails - 如何使辅助方法在 Rails 集成测试中可用? - 2

    我在app/helpers/sessions_helper.rb中有一个帮助程序文件,其中包含一个方法my_preference,它返回当前登录用户的首选项。我想在集成测试中访问该方法。例如,这样我就可以在测试中使用getuser_path(my_preference)。在其他帖子中,我读到这可以通过在测试文件中包含requiresessions_helper来实现,但我仍然收到错误NameError:undefinedlocalvariableormethod'my_preference'.我做错了什么?require'test_helper'require'sessions_hel

  4. 屏幕录制为什么没声音?检查这2项,轻松解决 - 2

    相信很多人在录制视频的时候都会遇到各种各样的问题,比如录制的视频没有声音。屏幕录制为什么没声音?今天小编就和大家分享一下如何录制音画同步视频的具体操作方法。如果你有录制的视频没有声音,你可以试试这个方法。 一、检查是否打开电脑系统声音相信很多小伙伴在录制视频后会发现录制的视频没有声音,屏幕录制为什么没声音?如果当时没有打开音频录制,则录制好的视频是没有声音的。因此,建议在录制前进行检查。屏幕上没有声音,很可能是因为你的电脑系统的声音被禁止了。您只需打开电脑系统的声音,即可录制音频和图画同步视频。操作方法:步骤1:点击电脑屏幕右下侧的“小喇叭”图案,在上方的选项中,选择“声音”。 步骤2:在“声

  5. 【高数】用拉格朗日中值定理解决极限问题 - 2

    首先回顾一下拉格朗日定理的内容:函数f(x)是在闭区间[a,b]上连续、开区间(a,b)上可导的函数,那么至少存在一个,使得:通过这个表达式我们可以知道,f(x)是函数的主体,a和b可以看作是主体函数f(x)中所取的两个值。那么可以有,  也就意味着我们可以用来替换 这种替换可以用在求某些多项式差的极限中。方法: 外层函数f(x)是一致的,并且h(x)和g(x)是等价无穷小。此时,利用拉格朗日定理,将原式替换为 ,再进行求解,往往会省去复合函数求极限的很多麻烦。使用要注意:1.要先找到主体函数f(x),即外层函数必须相同。2.f(x)找到后,复合部分是等价无穷小。3.要满足作差的形式。如果是加

  6. 深度学习部署:Windows安装pycocotools报错解决方法 - 2

    深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal

  7. ruby-on-rails - 如何用不同的用户运行nginx主进程 - 2

    A/ctohttp://wiki.nginx.org/CoreModule#usermaster进程曾经以root用户运行,是否可以以不同的用户运行nginxmaster进程? 最佳答案 只需以非root身份运行init脚本(即/etc/init.d/nginxstart),就可以用不同的用户运行nginxmaster进程。如果这真的是你想要做的,你将需要确保日志和pid目录(通常是/var/log/nginx&/var/run/nginx.pid)对该用户是可写的,并且您所有的listen调用都是针对大于1024的端口(因为绑定(

  8. Ruby 守护进程和 JRuby - 备选方案 - 2

    我有一个应用程序正在从Ruby迁移到JRuby(由于需要通过Java提供更好的Web服务安全支持)。我使用的gem之一是daemons创建后台作业。问题在于它使用fork+exec来创建后台进程,但这对JRuby来说是禁忌。那么-是否有用于创建后台作业的替代gem/wrapper?我目前的想法是只从shell脚本调用rake并让rake任务永远运行......提前致谢,克里斯。更新我们目前正在使用几个与Java线程相关的包装器,即https://github.com/jmettraux/rufus-scheduler和https://github.com/philostler/acts

  9. ruby - 如何更快地解决 project euler #21? - 2

    原始问题Letd(n)bedefinedasthesumofproperdivisorsofn(numberslessthannwhichdivideevenlyinton).Ifd(a)=bandd(b)=a,whereab,thenaandbareanamicablepairandeachofaandbarecalledamicablenumbers.Forexample,theproperdivisorsof220are1,2,4,5,10,11,20,22,44,55and110;therefored(220)=284.Theproperdivisorsof284are1,2,

  10. ruby-on-rails - self 在 Rails 模型中的值(value)是什么?为什么没有明显的实例方法可用? - 2

    我的rails3.1.6应用程序中有一个自定义访问器方法,它为一个属性分配一个值,即使该值不存在。my_attr属性是一个序列化的哈希,除非为空白,否则应与给定值合并指定了值,在这种情况下,它将当前值设置为空值。(添加了检查以确保值是它们应该的值,但为简洁起见被删除,因为它们不是我的问题的一部分。)我的setter定义为:defmy_attr=(new_val)cur_val=read_attribute(:my_attr)#storecurrentvalue#makesureweareworkingwithahash,andresetvalueifablankvalueisgiven

随机推荐