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
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的压力。
如果仅仅是提供服务,则使用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默认的日志系统不能配置按天分割,需要你自己去处理分割,处理分割的时候和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脚本 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脚本 #!/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