【Django杂记】uwsgi的配置

  • 首先了解wsgi是一个Python  web服务器,uwsgi实现了wsgi所有的功能,性能文档,效率高的服务器。
  • uwsgi是一个通用server服务器,支持Python,ruby等多种语言。uwsgi支持自动伸缩,当空闲超过一定时间,会关闭worker,当请求处理不过来排队时,会创建新的worker
1、安装uwsgi
pip install uwsgi
2、配置uwsgi
  • 创建一个wsgi.init的文件,该文件的内容如下:
[uwsgi]
# 使用nginx连接时使用
socket=0.0.0.0:8000
# 直接做web服务器使用
# http=0.0.0.0:8000
# 项目目录, 与manager.py同级
chdir = /home/计算机名/项目名
# 项目中wsgi.py文件的目录,相当于项目目录
wsgi-file=项目名/wsgi.py

# 主进程,启动一个master进程,来管理其余其他的子进程
master=True
# 设置工作进程的数量
processes=4
# 设置每个工作进程的线程数
threads=2

# python虚拟环境目录绝对路径。如果有的话,home是虚拟环境的根目录,pythonhome是虚拟环境下的bin目录(放置了python执行文件)
# home = /env
# PYTHOMHOME = /env/bin

# pid文件,用于脚本启动,停止
pidfile=uwsgi.pid

# 设置后台运行保存日志。只要配置了daemonize将会让uwsgi后台运行,同时将日志输出到指定目录
daemonize=uwsgi.log

# 服务停止时自动移除unix Socket和pid文件
vacuum = true

# 设置每个工程进程处理请求的上线,达到上限时,将回收(重启)进程,可以预防内存泄露
max-requests=5000

# 静态文件映射
static-map = /static=Django下static目录的绝对路径

# 指定日志文件的权限
logfile-chome=644

# uWSGI服务器运行时的用户ID
uid=xxx
# uWSGI服务器运行时的用户组ID
gid=xxx
# 指定工作进程名称的前缀
procname-prefix-spaced=xxx

# uWSGI加载的木块中哪个变量将被调用
callable=xxx

# 监控项目的py文件的mtime来触发重载(只在开发时使用),py-autoreload表示多长时间检测一次,单位秒
py-autoreload=1

# 在每个worker而不是master中加载应用。默认为false,表示先加载应用,再fork出worker,这样做可以让worker尽量共用内存,只有当写时才copy,由于先加载再fork,但有些东西是不支持fork的,比如socket连接,所以lazy-apps=false时,不要在加载应用时自动创建数据库连接等
lazy-apps=true

# 设置用于uwsgi包解析的内部缓存区大小为64k。默认为4k
buffer-size=32768

# 设置最大日志文件大小
log-maxsize=5000000

# 禁用请求日志记录
disable-logging=true

# 设置socket的监听队列大小(默认为:100)
listem=120

# 这个参数不会影响app内创建线程,只影响wsgi内部的api,默认值为false。可以认为对用户无影响,使用默认值即可。参见:https://github.com/unbit/uwsgi/issues/1141
enable-threads=true

# 设置在平滑的重启(直到接收到的请求处理完才重启)一个工作子进程中,等待这个工作结束的最长描述。这个配置会使在平滑地重启工作子进程中,如果工作进程结束时间超过了8秒就会被强行结束(忽略之前已经接收到的请求而直接结束)
reload-mercy=8

# 通过使用POSIX/UNIX的setrlimit()函数来限制每个uWSGI进程的虚拟内存使用数。这个配置会限制uWSGI的进程占用虚拟内存不超过256M。如果虚拟内存已经达到256M,并继续申请虚拟内存则会使程序报内存错误,本次的http请求将返回500错误。
limit-as = 256

 
# 一个请求花费的时间超过了这个harakiri超时时间,那么这个请求都会被丢弃,并且当前处理这个请求的工作进程会被回收再利用(即重启)
harakiri = 60
3、启动
uwsgi --ini uwsgi.ini
    • 如果想查看启动是否成功:
ps aux | grep uwsgi
4、重新启动
uwsgi --reload uwsgi.pid
5、停止
uwsgi --stop uwsgi.pid
6、示例
[uwsgi]
# 直接作为web服务器 【注意:这里的IP是阿里云的内网IP】
http=172.17.42.6:10000
# http=47.94.132.145:10000

# 项目目录
chdir=/home/weapp/weappProject

# uwsgi文件路径
wsgi-file=weappProject/wsgi.py

home = /home/.virtualenvs/weapp
PYTHONHOME = /home/.virtualenvs/weapp/bin

# 主进程
master=true
processes=4
threads=2

# 请求上线
max-requests=5000

# pid文件,用于脚本启动,停止
pidfile=/home/logs/weapp/uwsgi.pid

# 设置后台运行保存日志
daemonize=/home/logs/weapp/uwsgi.log

# 服务停止时自动停止unix Socket和pid文件
vacuum=true
示例:
[uwsgi]
chdir=/home/git/www/cloudmonitor # 指定项目目录
home=/home/git/www/cloudmonitor/.env # 指定python虚拟环境
wsgi-file=manager.py # 指定加载的WSGI文件
callable=app # 指定uWSGI加载的模块中哪个变量将被调用
master=true # 启动主线程
processes=4 # 设置工作进程的数量
threads=2 # 设置每个工作进程的线程数
socket=127.0.0.1:8888 # 指定socket地址
vacuum=true # 当服务器退出时自动删除unix socket文件和pid文件
logfile-chmod=644 # 指定日志文件的权限
daemonize=%(chdir)/cloudmonitor.log # 进程在后台运行,并将日志打印到指定文件
pidfile=%(chdir)/cloudmonitor.pid # 在失去权限前,将主进程pid写到指定的文件
uid=git # uWSGI服务器运行时的用户id
gid=git # uWSGI服务器运行时的用户组id
procname-prefix-spaced=cloudmonitor # 指定工作进程名称的前缀
  • uWSGI的翻译:https://www.cnblogs.com/zhouej/archive/2012/03/25/2379646.html
posted @   郭祺迦  阅读(1458)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示