(干货)Nginx实现双机热备(原创)

最近公司又重新规划了一下服务器架构,硬件层使用的是keeplived+nginx的组合,软件层规划使用nginx做双机热备,这里的双机热备的意思是,比如有两台服务器同时在运行,一台主,一台备,正常使用中,nginx都会将请求转发到主服务器,只有当主服务器报500的错误时候,才会将请求转发到备用服务器

上一张简单的架构图:
主要通过nginx转发到uwsgi,每个容器里都是uwsgi运行,
在这里插入图片描述

先准备两台服务器:

第一台服务器准备

1、因为使用的服务器是docker开出来的,每个docker使用uwsgi进行部署,uwsgi使用http模式,附上相关配置
这里使用的端口是9001

[uwsgi]
http = 0.0.0.0:9001 # http模式,注意IP一定要0.0.0.0,不然外部客户端无法从主机访问到docker中

#socket=192.168.0.68:8443,/home/python/server.crt,/home/python/server.key
#socket=127.0.0.1:8008
#chdir = /home/python/data/wdzk_project/wd_server/wd_server
chdir = /root/data/system/server_system
wsgi-file = config/wsgi.py
processes = 8
threads = 4

enable-threads=true
#daemonize = uwsgi.log

master=True

2、使用uwsgi将代码运行起来
命令:/root/install/server/bin/uwsgi --ini /root/data/system/server_system/uwsgi_config.ini

我们看到服务起来了
在这里插入图片描述
这台服务器是192.168.0.36:9001

docker中不要忘记映射端口,不明白的兄弟自己去百度

在这里插入图片描述

第二台服务器准备

跟上面一样的配置,不多说了,同时docker也要映射uwsgi端口8008才能使用
然后启动,第二台服务器192.168.0.36:8008,

然后两台服务器都准备好了,先测试服务是不是能用
第一台没有问题
在这里插入图片描述
对应的日志也打印出来了,8008这台服务器对应的是36-20022名字

在这里插入图片描述

第二台也没有问题:
在这里插入图片描述
对应的日志,9001这台服务器对应的是36-30022名字
在这里插入图片描述

最重点来了;
nginx配置

proxy_next_upstream http_502 http_500 http_504  error timeout invalid_header;
upstream doc{
                server 192.168.0.36:9001 backup max_fails=3 fail_timeout=30s;
                server 127.0.0.1:8008 max_fails=3 fail_timeout=30s;
        }

location /server/ {
                proxy_pass http://doc;
                }

这里的server 127.0.0.1:8008,代表的是192.168.0.36:8008这台服务器,因为nginx也是部署在这里的,所以直接用本地地址了

backup max_fails=3 fail_timeout=30s:
backup 代表备用服务器,正常情况是不会请求过去的
max_fails=3 fail_timeout=30s表示30S内有3次失败的请求,就会自动切换到备用服务器

proxy_next_upstream 模块指定在何种情况下一个失败的请求应该被发送到下一台后端服务器:

error # 和后端服务器建立连接时,或者向后端服务器发送请求时,或者从后端服务器接收响应头时,出现错误
timeout # 和后端服务器建立连接时,或者向后端服务器发送请求时,或者从后端服务器接收响应头时,出现超时
invalid_header # 后端服务器返回空响应或者非法响应头
http_500 # 后端服务器返回的响应状态码为500
http_502 # 后端服务器返回的响应状态码为502
http_503 # 后端服务器返回的响应状态码为503
http_504 # 后端服务器返回的响应状态码为504
http_404 # 后端服务器返回的响应状态码为404
off # 停止将请求发送给下一台后端服务器

需要理解一点的是,只有在没有向客户端发送任何数据以前,将请求转给下一台后端服务器才是可行的。也就是说,如果在传输响应到客户端时出现错误或者超时,这类错误是不可能恢复的。

配置完了,重启服务器

接下来测试环节:
首先设置8008的服务器为主服务器,,这里的端口28000是docker映射到主机的端口,对应的nginx里面的8000,所以访问端口28000就是访问Nginx的8000
在这里插入图片描述

在这里插入图片描述

我们可以看到请求一直落在8008上

在这里插入图片描述
此时模拟一下8008服务报500错误
我们添加了一个未知名的导包
在这里插入图片描述
然后重启服务,这时候8008服务的uwsgi还是可以正常启动的

然后再次请求到服务器
在这里插入图片描述
还是正常的,我们看看日志
在这里插入图片描述
8008的日志说已经没有这个模块了,再看看9001
在这里插入图片描述
我们看到请求落在了9001上,nginx帮助我们完成了双机热备

这时我把9001停掉,再访问
在这里插入图片描述

再请求,服务报502
在这里插入图片描述
成功
最后附上nginx配置

user  root;
worker_processes  1;
#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


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

    #access_log  logs/access.log  main;

    sendfile        on;
 

 
    keepalive_timeout  65;
	client_max_body_size 20	M; 
    #gzip  on;

	proxy_next_upstream http_502 http_500 http_504  error timeout invalid_header;
	upstream doc{
		server 192.168.0.36:9001 backup max_fails=3 fail_timeout=30s;
		server 127.0.0.1:8008 max_fails=3 fail_timeout=30s;
	}

    server {
        listen       8000;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;
	    access_log  /root/data/nginx_access.log;
        error_log   /root/data/nginx_error.log;
        
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

       location /server/ {
			proxy_pass http://doc;
                }
    }
}

参考文档
https://www.cnblogs.com/gaoyuechen/p/7921569.html

码字不易,请多多支持!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值