美文网首页工具
Nginx与uWSGI部署

Nginx与uWSGI部署

作者: 鹊南飞_ | 来源:发表于2020-06-12 12:03 被阅读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

    相关文章

      网友评论

        本文标题:Nginx与uWSGI部署

        本文链接:https://www.haomeiwen.com/subject/ujhgtktx.html