django 使用nginx实现负载均衡

1.环境配置

我这有三台服务器,三台服务器配置都是 Centos 7.6, django 2.1, mysql 8.0,三台服务器都配置uwsgi,但是只有一台服务器中配置了nginx.

注意: 首先请确保三台服务器上的django项目都能正常运行,建议先用 python manage.py runserver 127.0.0.1:8000 运行看看项目运行是否正常


121.196.187.***:8000   master    安装了nginx,mysql数据放在该服务器

121.40.18.***:8001  slave1    安装了mysql服务,但是连接的是远程master主机的mysql

121.196.190.***:8002  slave2   安装了mysql服务,但是连接的是远程master主机的mysql

我也是第一次配置,所以我不知道mysql是不是应该单独拿出来放一台服务器,关键我也没有钱再买一台服务器了,然后需要注意的是,我用的是mysql 8.0,django远程连接mysql服务时会出现 django.db.utils.OperationalError: (2059, "Authentication plugin 'caching_sha2_password' cannot be loaded:  错误,原因是 mysql8.0 对用户密码的加密方式为caching_sha2_password, django暂时还不支持这种新增的加密方式.

更新mysql用户密码加密方式

use mysql;
select user,plugin from user where user='root';

alter user 'root'@'%' identified with mysql_native_password by '你的密码'

flush privileges

还有需要注意的是,记得开通3306端口,我用的是阿里云服务器,所以还得在阿里云上给服务器的网络开启3306端口。


2.nginx文件配置,以及 slave 服务器的uwsgi配置

my_nginx.conf 内容如下:

这个文件我是添加软连接到 /etc/nginx/conf.d/ 下面,你也可以直接修改nginx下的nginx.conf

upstream website {
    # 这里我设置的127.0.0.1就是我的master主机,因为在这台主机上部署的nginx
    server 127.0.0.1:8000;
    server 121.40.18.***:8001;
    server 121.196.190.***:8002;    
}

server {
    listen      80;
    server_name 121.196.187.***; # substitute your machine's IP address or FQDN
    charset     utf-8;

    client_max_body_size 75M;   # adjust to taste

    location /static {
        alias /usr/local/untitled/static/; # static path
    }

    location / {
        include     uwsgi_params; # the uwsgi_params file you installed
        proxy_pass http://website;
    }
    
    # 设置静态文件过期时间
    location /usr/local/untitled/static/.*\.(jpg|jpeg|png|gif|icon)$
    {
        expires 30d;
    }

    location /usr/local/untitled/static/.*\.(js|css)?$ 
    {
        expires 10d;
    }
    
}

nginx 负载均衡的配置和一般nginx的配置主要区别在于 upstream 设置,以及由之前单机的 uwsgi_pass 变为 proxy_pass, 网上给的理由是由之前的socket通信变为http通信。

两台 slave 服务器的uwsgi.ini 文件配置如下 ,端口记得改,我没有尝试设置过一样,不知道有什么影响

[uwsgi]
# Django-related settings
# the base directory (full path)
chdir = /usr/local/untitled
# Django's wsgi file
module = untitled.wsgi
# the virtualenv (full path)

# process-related settings
# master
master = true
# maximum number of worker processes
processes = 1
threads = 1

#socket = 127.0.0.1:8002
http = 0.0.0.0:8002

# chmod-socket = 664
# clear environment on exit
vacuum = true
virtualenv = /root/.virtualenvs/python_company
pidfile = /usr/local/untitled/conf/uwsgi.pid

我的项目名就是untitled,这个名字看着改, 一开我设置的是 http=127.0.0.1:8002, 但是master的nginx一直连接不上,提示

connect() failed (111: Connection refused) while connecting to upstream, 干脆设置个 http=0.0.0.0:8002,结果还真连接了,不知道这样设置有什么问题,先这样吧。。。

同时还需要打开slave服务器对应的端口,这里以打开8002端口为例

# 开启端口
firewall-cmd --zone=public --add-port=8002/tcp --permanent

#重启生效
firewall-cmd --reload

3.测试nginx负载均衡是否有效

master开启 nginx 和uwsgi, 两台 slave 开启uwsgi,uwsgi最好通过 uwsgi  uwsgi.ini 来启动,这样可以看到请求网站请求信息,默认配置的nginx负载均衡使用的是轮询, 每个请求会依次发给三台服务器处理,所以刷新几次页面,三台服务器依次收到请求,则表示nginx负载均衡是有效的


分组查看各种连接状态

netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
返回结果示例: 
LAST_ACK 5  (正在等待处理的请求数) 
SYN_RECV 30 
ESTABLISHED 1597 (正常数据传输状态) 
FIN_WAIT1 51 
FIN_WAIT2 504 
TIME_WAIT 1057 (处理完毕,等待超时结束的请求数) 

LAST_ACK 21  (正在等待处理的请求数) 
SYN_RECV 29
ESTABLISHED 8458  (正常数据传输状态) 
FIN_WAIT1 160
FIN_WAIT2 728
TIME_WAIT 3774  (处理完毕,等待超时结束的请求数) 
 
状态:描述 
CLOSED:无连接是活动的或正在进行 
LISTEN:主机在等待进入呼叫 
SYN_RECV:一个连接请求已经到达,等待确认 
SYN_SENT:应用已经开始,打开一个连接 
ESTABLISHED:正常数据传输状态 
FIN_WAIT1:应用说它已经完成 
FIN_WAIT2:另一边已同意释放 
ITMED_WAIT:等待所有分组死掉 
CLOSING:两边同时尝试关闭 
TIME_WAIT:另一边已初始化一个释放 
LAST_ACK:等待所有分组死掉

使用这上面的命令是可以查看主机的种连接状态,其中ESTABLISHED 就是并发连接状态的显示数的了。如果仅仅只是想查看并发连接数,可以简化一下命令,如下:

netstat -nat|grep ESTABLISHED|wc -l

你可能感兴趣的:(Django,linux,django,nginx,负载均衡)