工具

Nginx与uWSGI部署

2020-06-12  本文已影响0人  鹊南飞_

1. flask项目文件结构

项目位于 /home/kun/item, 以下是文件结构
文件结构

.
├── config.py                                         
├── main.py
├── item.ini
└── uwsgi
    ├── uwsgi.log
    ├── uwsgi.pid
    └── uwsgi.sock

config.pyflask的配置文件,
main.pyflask的入口文件
item.iniuwsgi的配置文件
uwsgi文件夹用于存放uwsgi相关记录文件

2. nginx与uwsgi通信方式

方案一. 通过socket文件通信
  1. 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

  1. 启动uwsgi
/usr/local/bin/uwsgi /home/kun/item/item.ini
  1. 检查uwsgi有没有启动成功
ps -ef | grep uwsgi

因为使用socket文件通信,所以无法直接访问端口进行测试是否成功启动。
可以查看指定的sock文件有没有成功生成

  1. 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;
    }
}

  1. 测试配置文件是否有效
nginx -t
  1. 重启nginx
nginx -s reload
  1. 测试
    nginx配置文件中,使用了5022端口进行转发
    可以使用浏览器或者postman测试
方案二. 通过socket端口通信
  1. 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会无法通讯。

  1. 启动uwsgi
/usr/local/bin/uwsgi /home/kun/item/item.ini
  1. 检查uwsgi有没有启动成功
ps -ef | grep uwsgi
  1. nginx配置文件
    /etc/nginx/conf.d文件夹下,新增item.conf(文件名可以随意修改,后缀必须是conf)
server{
    listen 5022;
    server_name _;
    location /
    {
        include uwsgi_params;
        uwsgi_pass 127.0.0.1:5010;
    }
}

  1. 测试配置文件是否有效
nginx -t
  1. 重启nginx
nginx -s reload
  1. 测试
    nginx配置文件中,使用了5022端口进行转发
    可以使用浏览器或者postman测试
方案三. 通过http请求通信
  1. 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

  1. 启动uwsgi
/usr/local/bin/uwsgi /home/kun/item/item.ini
  1. 检查uwsgi有没有启动成功
ps -ef | grep uwsgi
  1. nginx配置文件
    /etc/nginx/conf.d文件夹下,新增item.conf(文件名可以随意修改,后缀必须是conf)
server{
    listen 5022;
    server_name _;
    location /
    {
        proxy_pass http://127.0.0.1:5010;
 
    }
}

  1. 测试配置文件是否有效
nginx -t
  1. 重启nginx
nginx -s reload
  1. 测试
    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配置文件

  1. 轮询
    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;
}

  1. 指定权重
    指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况
upstream ai-server{
      server 127.0.0.1:5011 weight=10;
      server 127.0.0.1:5010 weight=10;
}
  1. IP绑定 ip_hash
    每个请求按访问iphash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题
upstream ai-server{
      ip_hash;
      server 127.0.0.1:5011;
      server 127.0.0.1:5010;
}
  1. fair(第三方)
    按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream ai-server{
      fair;
      server 127.0.0.1:5011;
      server 127.0.0.1:5010;
}
  1. url_hash(第三方)
    按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
upstream ai-server{
      server 127.0.0.1:5011;
      server 127.0.0.1:5010;
      hash $request_uri;  
      hash_method crc32; 
}

4. 补充:nginx使用https

nginx使用https

上一篇 下一篇

猜你喜欢

热点阅读