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

 

前进时,请别遗忘了身后的脚印。
原文地址:https://www.cnblogs.com/liudaihuablogs/p/13463308.html