码迷,mamicode.com
首页 > 其他好文 > 详细

keepalive+nginx 热备跟负载均衡

时间:2018-08-16 13:56:51      阅读:307      评论:0      收藏:0      [点我收藏+]

标签:监听   smt   work   pid   png   ini   [1]   image   ade   

结构图

技术分享图片

keepalived配置

master跟backup除了state跟优先级,其它一样,优先级master需大于backup

! 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 192.168.200.1
   #smtp_connect_timeout 30
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
   #vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_script chk_nginx {         
    script "/etc/keepalived/chk_nginx.sh"   
    interval 2             
}

vrrp_instance VI_1 {
    state BACKUP
    interface ens192
    virtual_router_id 51
    priority 30
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        10.0.0.233
    }
    notify_master "/usr/bin/python2.7 /etc/keepalived/send.py XXX@qq.com 报!222成为主机! 报!222成为主机!"
    notify_fault "/usr/bin/python2.7 /etc/keepalived/send.py XXX@qq.com 报!222已挂! 10.0.0.222故障!请尽快修复!"
    track_script {
      chk_nginx                 
    }    
}

其中检测nginx状态的脚本如下,当发现自身nginx没有运行,杀掉keepalived的进程

脚本运行不了可能是centos shell运行报语法错误: 未预期的文件结尾

#!/bin/bash
run=`ps -C nginx --no-header | wc -l`
if [ $run -eq 0 ]; then
    /usr/local/nginx/sbin/nginx -s stop
    /usr/local/nginx/sbin/nginx
    sleep 3
    if [ `ps -C nginx --no-header | wc -l` -eq 0 ]; then
        systemctl stop keepalived
    fi
fi

其中,调用python发送邮件的代码

# coding=utf-8
import smtplib,sys
from email.mime.text import MIMEText

class Msmtp():
    def __init__(self, target, subject, content):#收件人、标题、内容
        self.msg_from = 发出邮件的邮箱
        self.password = 邮箱的授权码
        self.sender = smtplib.SMTP_SSL("smtp.qq.com", 465)
        self.msg_to = target
        self.subject = subject
        self.content = content

    def _login(self):
        self.sender.login(self.msg_from, self.password)

    def _msg(self):
        self.msg = MIMEText(self.content)
        self.msg[Subject] = self.subject
        self.msg[From] = self.msg_from
        self.msg[To] = self.msg_to

    def send_mail(self):
        self._login()
        self._msg()
        self.sender.sendmail(self.msg_from, self.msg_to, self.msg.as_string())
        self.sender.quit()



if __name__ == __main__:
    a = Msmtp(sys.argv[1], sys.argv[2], sys.argv[3])
    a.send_mail()

nginx配置

#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  ‘$remote_addr - $remote_user [$time_local] "$request" ‘
    #                  ‘$status $body_bytes_sent "$http_referer" ‘
    #                  ‘"$http_user_agent" "$http_x_forwarded_for"‘;

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    upstream hello1 {#负载均衡
        server 10.0.0.111:6666 max_fails=3 fail_timeout=3600s;#后台有问题3600s内不访问
        server 10.0.0.222:6666 max_fails=3 fail_timeout=3600s;#后台性能瓶颈的话直接在此加后台
        #server 10.0.0.18:80 max_fails=3 fail_timeout=3600s;#可直接转发到nginx或者tomcat等其他服务器上
    }

    server {
        listen       80;
        server_name  localhost;

        charset utf-8;

        location / {
            root   html;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
    server {
        listen       666;
        server_name  10.0.0.233;#监听虚拟IP

        charset utf-8;
        
        location /{
            root   html;
            index  index.html index.htm;
        }
        location /hello{
            proxy_pass   http://hello1/hello;
        }
    }
}

测试后台代码

# encoding=utf8
from flask import Flask, request


app = Flask(__name__)
app.app_context().push()


@app.route(/hello)
def hello():
    ip = request.remote_addr
        return hello world<br/>我是10.0.0.222<br/>访问者IP为: +ip


def runFlask(port):
    app.run(host=0.0.0.0,port=port)
    CORS(app, supports_credentials=True)


if __main__ == __name__:
    runFlask(6666)

 

 

 

测试

1. 10.0.0.111跟10.0.0.222均开启nginx及keepalived

 

keepalive+nginx 热备跟负载均衡

标签:监听   smt   work   pid   png   ini   [1]   image   ade   

原文地址:https://www.cnblogs.com/lurenjia1994/p/9486448.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!