Django+Nginx+uWSGI集群负载均衡部署方案

概念解析:

  • WSGI

是Python应用程序或框架和Web服务器之间的一种接口,WSGI 没有官方的实现, 因为WSGI更像一个协议. 只要遵照这些协议,WSGI应用(Application)都可以在任何服务器(Server)上运行, 反之亦然。 WSGI标准在 PEP 333 中定义并被许多框架实现,其中包括现广泛使用的django框架。所以说WSGI是一种标准

  • uWSGI

可以看作是一个应用程序,帮助我们实现WSGI协议,Http协议,这样我们可以不再关注网络通信的底层实现,将精力更多放在处理HTTP请求数据,返回HTML。利用uWSGI可以是我们的web应用得到更强的并发能力,uWSGI也可以返回静态文件(css,js,img…),但是很笨拙,一般静态文件都交由Nginx进行传输,所以配置中一般不配置static-map,如果直接由uWSGI接受HTTP请求则需要设置http:xxxx,如果只需要与反向代理服务器进行交互则只需要接受socket,uWSGI与Nginx交互相当于两个进程间交互,一般使用的是.sock文件或者指定端口接受socket。指定端口时再使用浏览器访问相应端口,uWSGI会提示skip,跳过该HTTP请求。

  • Nginx

Nginx接受来自客户端的Http请求发送给uWSGI,uWSGI处理请求并将关键信息传递给web应用(django,flask等),应用返回Response经由uWSGI发送给Nginx,Nginx再发送给客户端。 同时结合keepalived对前端nginx实现HA高可用,Keepalived是Linux下面实现VRRP备份路由的高可靠性运行件。基于Keepalived设计的服务模式能够真正做到主服务器和备份服务器故障时IP瞬间无缝交接。二者结合,可以构架出比较稳定的软件LB方案。

  • 总结

nginx相当于是服务器,负责接收请求;uwsgi是服务器和服务端应用程序的通信协议,规定了怎么把请求转发给应用程序和返回。通信过程: 客户端发送一个http请求,被nginx服务器接收,nginx服务器将请求转发给uwsgi,uwsgi将请求转发给实现uwsgi协议的应用程序(Django)。

部署方案:

系统环境

ubunt16.04

server: 10.18.221.81

node1: 10.18.221.80

node2: 10.18.221.82

···

nodeN: 10.18.221.125

 

1.在server 10.18.221.81安装Nginx

apt-get install nginx

2.server 10.18.221.81安装uwsgi

下载地址 https://pypi.org/project/uWSGI/#files
下载后得到文件uwsgi-2.0.17.1.tar.gz 
解压后进入uwsgi-2.0.17.1文件夹
执行python setup.py install 命令,静静等待安装完毕即可。

3.修改nginx配置文件  /etc/nginx/nginx.conf

保持其他默认配置不动,只添加以下代码:

upstream www.test.com{
        #ip_hash;                                                         #保持session一致;注意:当负载调度算法为ip_hash时,后端服务器在负载均衡调度中的状态不能是weight 和backup。       
        server 10.18.221.80:80    weight=1  max_fails=3  fail_timeout=5s; #max_fails 表示健康检查失败的次数,这里表示次数为3次,即标记该服务器down了
        server 10.18.221.80:8080  weight=2  max_fails=3  fail_timeout=5s backup;#热备配置(RS)节点的高可用,这标志着这个服务器作为备份服务器,若主服务器全部宕机了,就会向它转发请求
        server 10.18.221.125:80   weight=2  max_fails=3  fail_timeout=5s down;#这标识着服务器永远不可用,这个参数可配合ip_hash使用。
        server 10.18.221.81:80    weight=1  max_fails=3  fail_timeout=5s;
        server 10.18.221.81:8025  weight=4  max_fails=3  fail_timeout=5s;

        keepalive 64;
}

server{
    listen  8082;
    server_name  www.test.com;

    location / {
        include      uwsgi_params;    #uwsgi_params在nginxconf文件夹下自带,uwsgi_pass一定要跟uwsgi_conf.ini中写的地址完全一致
        proxy_pass   www.test.com;
        

    }

}

 

保存后重启nginx

service nginx restart

注意:如果使用  uwsgi_pass  www.test.com 显示为Bad Request(400),考虑是不是django中的访问权限的问题。

进入Django的settings配置:

ALLOWED_HOSTS = ['10.18.221.80']     #这里修改为部署uwsgi服务器的ip

4.用uwsgi加载项目

分别进入服务器的项目代码目录,随后执行  

uwsgi -s 0.0.0.0:80 -w code     #或者8080、8081

至此,完成负载均衡的全部配置。

你可能感兴趣的:(Linux)