我这有三台服务器,三台服务器配置都是 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端口。
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
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