1. flask项目文件结构
项目位于 /home/kun/item
, 以下是文件结构
文件结构
.
├── config.py
├── main.py
├── item.ini
└── uwsgi
├── uwsgi.log
├── uwsgi.pid
└── uwsgi.sock
config.py
是flask
的配置文件,
main.py
是flask
的入口文件
item.ini
是uwsgi
的配置文件
uwsgi
文件夹用于存放uwsgi
相关记录文件
2. nginx与uwsgi通信方式
方案一. 通过socket文件通信
- uwsgi配置文件
/home/kun/item/item.ini
[uwsgi]
chdir=/home/kun/item
wsgi-file=main.py
master=true
callable=app
processes=1
threads=2
# socket=0.0.0.0:5010
uwsgi-socket=%(chdir)/uwsgi/uwsgi.sock
chmod-socket=666
#protocol=http
pidfile=%(chdir)/uwsgi/uwsgi.pid
daemonize=%(chdir)/uwsgi/uwsgi.log
- 启动uwsgi
/usr/local/bin/uwsgi /home/kun/item/item.ini
- 检查uwsgi有没有启动成功
ps -ef | grep uwsgi
因为使用socket文件通信,所以无法直接访问端口进行测试是否成功启动。
可以查看指定的sock文件有没有成功生成
- nginx配置文件
在/etc/nginx/conf.d
文件夹下,新增item.conf
(文件名可以随意修改,后缀必须是conf)
server{
listen 5022;
server_name _;
location /
{
include uwsgi_params;
uwsgi_pass unix:/home/kun/item/uwsgi/uwsgi.sock;
}
}
- 测试配置文件是否有效
nginx -t
- 重启nginx
nginx -s reload
- 测试
nginx
配置文件中,使用了5022
端口进行转发
可以使用浏览器
或者postman
测试
方案二. 通过socket端口通信
- uwsgi配置文件
/home/kun/item/item.ini
[uwsgi]
chdir=/home/kun/item
wsgi-file=main.py
master=true
callable=app
processes=1
threads=2
socket=0.0.0.0:5010
#uwsgi-socket=%(chdir)/uwsgi/uwsgi.sock
chmod-socket=666
#protocol=http
pidfile=%(chdir)/uwsgi/uwsgi.pid
daemonize=%(chdir)/uwsgi/uwsgi.log
注意:添加protocol=http,会使Nginx和uWSGI之间uwsgi_params会无法通讯。
- 启动uwsgi
/usr/local/bin/uwsgi /home/kun/item/item.ini
- 检查uwsgi有没有启动成功
ps -ef | grep uwsgi
- nginx配置文件
在/etc/nginx/conf.d
文件夹下,新增item.conf
(文件名可以随意修改,后缀必须是conf)
server{
listen 5022;
server_name _;
location /
{
include uwsgi_params;
uwsgi_pass 127.0.0.1:5010;
}
}
- 测试配置文件是否有效
nginx -t
- 重启nginx
nginx -s reload
- 测试
nginx
配置文件中,使用了5022
端口进行转发
可以使用浏览器
或者postman
测试
方案三. 通过http请求通信
- uwsgi配置文件
/home/kun/item/item.ini
[uwsgi]
chdir=/home/kun/item
wsgi-file=main.py
master=true
callable=app
processes=1
threads=2
socket=0.0.0.0:5010
# uwsgi-socket=%(chdir)/uwsgi/uwsgi.sock
chmod-socket=666
protocol=http
pidfile=%(chdir)/uwsgi/uwsgi.pid
daemonize=%(chdir)/uwsgi/uwsgi.log
- 启动uwsgi
/usr/local/bin/uwsgi /home/kun/item/item.ini
- 检查uwsgi有没有启动成功
ps -ef | grep uwsgi
- nginx配置文件
在/etc/nginx/conf.d
文件夹下,新增item.conf
(文件名可以随意修改,后缀必须是conf)
server{
listen 5022;
server_name _;
location /
{
proxy_pass http://127.0.0.1:5010;
}
}
- 测试配置文件是否有效
nginx -t
- 重启nginx
nginx -s reload
- 测试
nginx
配置文件中,使用了5022
端口进行转发
可以使用浏览器
或者postman
测试
3. 补充:使用nginx实现负载均衡
启动两个uwsgi
,均运行相同的flask
项目,
只是端口不同,一个为5010
, 另一个为5011
uwsgi
配置文件如下
[uwsgi]
chdir=/home/kun/item
wsgi-file=main.py
master=true
callable=app
processes=1
threads=2
socket=0.0.0.0:5010
# uwsgi-socket=%(chdir)/uwsgi/uwsgi.sock
chmod-socket=666
# protocol=http
pidfile=%(chdir)/uwsgi/uwsgi.pid
daemonize=%(chdir)/uwsgi/uwsgi.log
[uwsgi]
chdir=/home/kun/item
wsgi-file=main.py
master=true
callable=app
processes=1
threads=2
socket=0.0.0.0:5011
# uwsgi-socket=%(chdir)/uwsgi/uwsgi.sock
chmod-socket=666
# protocol=http
pidfile=%(chdir)/uwsgi/uwsgi.pid
daemonize=%(chdir)/uwsgi/uwsgi.log
nginx
配置文件
- 轮询
nginx
会自动把每个请求按时间顺序逐一分配到不同的后端服务器
server{
listen 5022;
server_name _;
location /
{
include uwsgi_params;
uwsgi_pass ai-server;
}
}
upstream ai-server{
server 127.0.0.1:5011;
server 127.0.0.1:5010;
}
- 指定权重
指定轮询几率,weight
和访问比率成正比,用于后端服务器性能不均的情况
upstream ai-server{
server 127.0.0.1:5011 weight=10;
server 127.0.0.1:5010 weight=10;
}
- IP绑定 ip_hash
每个请求按访问ip
的hash
结果分配,这样每个访客固定访问一个后端服务器,可以解决session
的问题
upstream ai-server{
ip_hash;
server 127.0.0.1:5011;
server 127.0.0.1:5010;
}
- fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream ai-server{
fair;
server 127.0.0.1:5011;
server 127.0.0.1:5010;
}
- url_hash(第三方)
按访问ur
l的hash
结果来分配请求,使每个url
定向到同一个后端服务器,后端服务器为缓存时比较有效。
upstream ai-server{
server 127.0.0.1:5011;
server 127.0.0.1:5010;
hash $request_uri;
hash_method crc32;
}
网友评论