最近公司又重新规划了一下服务器架构,硬件层使用的是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
码字不易,请多多支持!