• UWSGI


    UWSGI

     

     

    中文文档:

    https://uwsgi-docs-zh.readthedocs.io/zh_CN/latest/search.html?q=protocol&check_keywords=yes&area=default

    参考学习:

    uwsgi配置:https://www.jianshu.com/p/fb6ca54f355d

    nginx和uwsgi:https://www.cnblogs.com/biggw/p/11342109.html

     

    uwsgi+nginx

    为什么有了uwsgi还需要nginx?

    nginx+uwsgi整个流程

    uwsgi直接和浏览器交互

    uwsgi日志切割

     

     

     

    uwsgi+nginx

     

    为什么有了uwsgi还需要nginx?

     

    nginx+uwsgi整个流程

    nginx是对外的服务接口,外部浏览器通过url访问nginx。nginx接收到浏览器发送过来的http请求,将包进行解析,分析url,如果是静态文件请求就直接将nginx配置的静态文件发送给用户,否则将请求转发给uwsgi服务器。uwsgi接收到请求后将包进行处理,处理成wsgi可以接受的格式,并发给wsgi,wsgi根据请求调用应用程序的某个文件,某个文件的某个函数,最后处理完将返回值再次交给wsgi,wsgi将返回值进行打包,打包成uwsgi能够接收的格式,uwsgi接收wsgi发送的请求,并转发给nginx,nginx最终将返回值返回给浏览器。

    nginx并不是必须的,uwsgi完全可以完成整个的和浏览器交互的流程,但是要考虑某些情况:

    1、安全问题,程序不能直接被浏览器访问到,而是通过nginx,nginx只开放某个接口,uwsgi本身是内网接口,这样运维人员在nginx上加上安全性的限制,可以达到保护程序的作用。[感觉很扯蛋]

    2.负载均衡问题,一个uwsgi很可能不够用,即使开了多个work也是不行,毕竟一台机器的cpu和内存都是有限的,有了nginx做代理,一个nginx可以代理多台uwsgi完成uwsgi的负载均衡。

    3.静态文件处理效率问题,uwsgi处理动态请求的效率很高,但对于静态文件的处理远不如nginx,nginx具备超高处理静态文件的性能(还有gzip,expires压缩缓存等功能),所以对于静态文件的处理交给nginx可以节省一大批的并发请求数目,减轻uwsgi的压力。

     

    uwsgi直接和浏览器交互

    如果仅仅是提供服务,则使用protocol指明协议为http协议

    [uwsgi]
    module = MBOCR.wsgi:application
    master = True
    processes = 4
    max-requests = 5000
    harakiri = 30
    chmod-socket = 666
    socket = :5000
    protocol = http
    uid = root
    gid = root
    vacuum = True

    uwsgi日志切割

    uwsgi默认的日志系统不能配置按天分割,需要你自己去处理分割,处理分割的时候和nginx日志分割类似,nginx日志分割时它会不停的往inode节点里写日志,简单的修改文件并不会改变nginx日志输出,因为他是往那个inode节点里写日志不是往文件写日志,所以nginx提供了一个信号USER1,让nginx重读写日志。uwsgi也和nginx类似,它虽然没提供一个信号去让uwsgi重读写文件,但是它提供了一个配置项:touch-logreopen,它指定监听一个文件,当这个文件的修改日期变化时,就会重新打开日志文件。我们只需要写个脚本,把日志文件内容复制一下,然后把日志文件清空,uwsgi就会重读这个日志文件了,感觉这个配置项比nginx更方便。

    [uwsgi]
    socket = %d%n/django.sock
    chmod-socket = 666
    processes = %k
    pidfile = %d%n/master.pid
    touch-logreopen = %dsplitlog.py
    daemonize = %d%n/run.log
    # clear environment on exit
    # like pid or unix socket
    vacuum = true
    chdir = /website/account/
    wsgi-file = main/wsgi.py
    virtualenv = .venv/

    python版本

    # 写一个python脚本
    import os
    import shutil
    import datetime
    
    SELF = os.path.abspath(__file__)
    BASE_PATH = os.path.dirname(SELF)
    
    
    def yesterday():
        today = datetime.date.today()
        oneday = datetime.timedelta(days=1)
        yesterday = today-oneday
        return yesterday.strftime("%Y-%m-%d")
    
    
    for each in os.listdir(BASE_PATH):
        path = os.path.join(BASE_PATH, each)
        if os.path.isdir(path):
            run_log = os.path.join(path, "run.log")
            if os.path.exists(run_log):
                yesterday_log = os.path.join(path, yesterday() + ".log")
                shutil.move(run_log, yesterday_log)
    
    with open(SELF, "rb+") as file:
        all = file.read()
        file.seek(0, 0)
        file.write(all)
    # 创建一个splitlogTask,写入以下内容
    0 0 * * * /usr/bin/python3 /website/uwsgi.d/splitlog.py
    
    # 使用crontab splitlogTask 注册这个定时任务即可

    sh版本

    # 也可以写一个sh脚本
    
    #!/bin/bash
    DIR=`echo $(cd "$(dirname "$0")"; pwd)`
    LOGDIR="${DIR}/logs"
    
    sourcelogpath="${LOGDIR}/uwsgi_in_docker.log"
    touchfile="${DIR}/.touchforlogrotate"
    
    DATE=`date -d "yesterday" +"%Y-%m-%d"`
    
    destlogpath="${LOGDIR}/uwsgi_in_docker.log.${DATE}"
    
    # 保留的日志备份数
    BACKUP=30
    # 删除30天以前的日志,+${BACKUP}代表多少天前
    find ${LOGDIR} -mtime +${BACKUP} -name "uwsgi*.log*" -exec rm -rf {} ; 
    # 将日志前一天的日志分割
    mv $sourcelogpath $destlogpath
    # 触发uWSGI中的监听事件,uWSGI生成新的日志
    touch $touchfile
    0 0 * * * /bin/bash /code/touchforlogrotate.sh >/dev/null 2>&1

     

    前进时,请别遗忘了身后的脚印。
  • 相关阅读:
    冒泡排序
    Objective-C 命名规范
    时间轴的制作
    CocoaPods 哪些事
    消息转发机制入门篇
    架构
    算法学习
    AutoLayout自动布局
    网络学习
    HDU 3832 Earth Hour (最短路)
  • 原文地址:https://www.cnblogs.com/liudaihuablogs/p/13463308.html
Copyright © 2020-2023  润新知