django项目使用uwsgi方式启动
环境:虚拟机ubuntu 20.0 django2.2 python3.6.8
基于docker 部署
前言目的:
由python manage.py runserver
单进程的启动方式,更改为使用uwsgi多进程方式启动,增加服务并发数
知识补充 WSGI /uwsgi /uWSGI
WSGI:是python Web服务器网关接口。是python应用程序/框架和Web服务器之间通信的一种规范,通信协议
uwsgi:是线路协议,常用于uWSGI服务器与其他网络服务器的数据通信
uWSGI:实现了uwsgi和WSGI两种协议的Web服务器
uWSGI环境安装:pip install uwsgi
文件配置:在项目根目录下(manage.py同级目录), 创建名为 uwsgi.ini
的文件,文件内容如下
[uwsgi]
# 项目绝对路径
chdir = /root/TinyscanWebServer/
;套接字方式的IP地址:端口号【此模式需要有nginx,如果只用uwsgi的话可以忽略此项】
;socket=0.0.0.0:8000
# 监听的端口,当没有nginx时使用这个
http = 0.0.0.0:8000
# 静态资源代理 映射目录,实际静态目录
;static-map = /static= /root/TinyscanWebServer/static
# 主应用中的wsgi文件
wsgi-file = /root/TinyscanWebServer/TinyscanWebServer/wsgi.py
# 启动一个master进程来管理其他的子进程
master = True
# 开启四个进程
processes = 4
# 两个线程
thread = 2
# 设置每个工作进程处理请求上限,达到上限时,将回收/重启,可预防内存泄漏
max-request = 5000
# 服务停止时自动移除unix socket和pid 文件
vacuum = True
# uwsgi 日志
#daemonize = /root/TinyscanWebServer/logs/uwsgi.log
logto = /root/TinyscanWebServer/logs/ty_log.log
# 日志格式化
logformat = %(ltime) | pid:%(pid) wid:%(wid) | %(proto) %(status) | %(method) | %(host)%(uri) | request_body_size:%(cl) | response_body_size:%(rsize)
# 服务的pid记录文件
pidfile = uwsgi.pid
uWSGI日志文件配置说明
-
daemonize配置日志方式会以后台守护进程的方式写入配置的日志文件
-
logto 会以非后台守护进程方式写入日志文件,适用于docker 部署的方式
docker部署,在uwsgi启动过程中,docker 日志中出现[uWSGI] getting INI configuration from uwsgi.ini
,uwsgi.log 日志也并没有报错,但是容器却起不来,很有可能就是uWSGI的配置文件中配置了daemonize
,改为logto
就可以了。
uWSGI格式化参数说明
可参照官网:https://doc.codingdict.com/uwsgi/uwsgi-docs-zh.readthedocs.io/zh_CN/latest/LogFormat.html
# 这些是从当前请求内部的 wsgi_request 结构获取的。
%(uri) -> REQUEST_URI
%(method) -> REQUEST_METHOD
%(user) -> REMOTE_USER
%(addr) -> REMOTE_ADDR
%(host) -> HTTP_HOST
%(proto) -> SERVER_PROTOCOL
%(uagent) -> HTTP_USER_AGENT (自1.4.5起)
%(referer) -> HTTP_REFERER (自1.4.5起)
# 这些是简单的函数,调用来生成日志变量值:
%(status) -> HTTP响应状态码
%(micros) -> 响应时间,以微秒为单位
%(msecs) -> 响应时间,以毫秒为单位
%(time) -> 请求开始的时间戳
%(ctime) -> 请求开始的ctime
%(epoch) -> Unix格式的当前时间
%(size) -> 响应体大小 + 响应头大小 (自1.4.5起)
%(ltime) -> 人类可读(Apache风格)的请求时间 (自1.4.5起)
%(hsize) -> 响应头大小 (自1.4.5起)
%(rsize) -> 响应体大小 (自1.4.5起)
%(cl) -> 请求内容体大小 (自1.4.5起)
%(pid) -> 处理请求的worker的pid (自1.4.6起)
%(wid) -> 处理请求的worker的id (自1.4.6起)
%(switches) -> 异步切换数 (自1.4.6起)
%(vars) -> 请求中的CGI变量数 (自1.4.6起)
%(headers) -> 已生成的响应头数 (自1.4.6起)
%(core) -> 运行请求的核心 (自1.4.6起)
%(vsz) -> 地址空间/虚拟内存使用 (单位为字节) (自1.4.6起)
%(rss) -> RSS内存使用 (单位为字节) (自1.4.6起)
%(vszM) -> 地址空间/虚拟内存使用 (单位为MB) (自1.4.6起)
%(rssM) -> RSS内存使用 (单位为MB) (自1.4.6起)
%(pktsize) -> 内部的请求uwsgi包大小 (自1.4.6起)
%(modifier1) -> 请求的modifier1 (自1.4.6起)
%(modifier2) -> 请求的modifier2 (自1.4.6起)
%(metric.XXX) -> 访问XXX度量值 (见 度量(Metrics)子系统)
%(rerr) -> 请求的读错误数 (自1.9.21起)
%(werr) -> 请求的写错误数 (自1.9.21起)
%(ioerr) -> 请求的读写错误数 (自1.9.21起)
%(tmsecs) -> 请求开始时间戳,自纪元起,单位为毫秒 (自1.9.21起)
%(tmicros) -> 请求开始时间戳,自纪元起,单位为微秒 (自1.9.21起)
%(var.XXX) -> 请求变量XXX的内容 (例如var.PATH_INFO,自1.9.21起可用)