题外话
如需转载文章,请保留文章出处(blog.csdn.net/knight_zhou)。因为我的很多文章一般是会进行更新的。也避免百度搜出来一大推相似的文章,却找不到原创博主。
nohup启动和使用UWSGI方式启动Python的web项目的区别?
- runserver方法是django开发中经常用到的运行方式,这个运行方式 是django自带的,主要在测试和开发中使用,并且 runserver 开启的方式也是单进程 。
- uWSGI是一个Web服务器,它实现了WSGI协议、uwsgi、http 等协议。注意uwsgi是一种通信协议,而uWSGI是实现uwsgi协议和WSGI协议的 Web 服务器。uWSGI具有超快的性能、低内存占用和多app管理等优点,并且搭配着Nginx就是一个生产环境了,能够将用户访问请求与应用 app 隔离开,实现真正的部署 。相比来讲,支持的并发量更高,方便管理多进程,发挥多核的优势,提升性能
uwsgi 参数详解
#uwsgi --ini uwsgi.ini # 启动
#uwsgi --reload uwsgi.ini # 重启
#uwsgi --stop uwsgi.ini # 关闭
[uwsgi]
# 字符编码
env=LC_ALL=en_US.UTF-8
# 指定IP端口
http = :8386
# the local unix socket file than commnuincate to Nginx 用于和 nginx 进行数据交互的端口
#socket = 127.0.0.1:8001
# 项目目录
chdir = /opt/my_system
# 启动文件地址
wsgi-file = /opt/my_system/manage.py
# uWSGI加载的模块中哪个变量将被调用
callable = app
# 自动移除unix Socket和pid文件当服务停止的时候
vacuum = true
# socket权限设置
chmod-socket = 664
# uWSGI服务器运行时的用户id
uid=root
# uWSGI服务器运行时的用户组id
gid=root
# 启用主进程
master = true
# 进程个数,工作进程的最大数量
processes = 5
# 主进程id文件目录
pidfile = /opt/my_system/uwsgi.pid
# 启用线程
enable-threads=true
# 在每个辅助进程中启动的线程数
threads=4
# 一个高阶的cheap模式,在启动的时候只会分配n个工作进程,并使用自适应算法启动新的进程
cheaper = 10
# 在经过sec秒的不活跃状态的进程会被销毁(进入了cheap模式),并最少保留cheaper指定的进程数
idle = 3600
# 设置自中断时间,设置一个请求的超时时间(秒),如果一个请求超过了这个时间,则请求被丢弃
harakiri=30
# 当一个请求被harakiri杀掉会,会输出一条日志
harakiri-verbose = true
# 开启内存使用情况报告
memory-report = true
# 设置平滑的重启(直到处理完接收到的请求)的长等待时间(秒)
reload-mercy = 10
# 设置缓冲
#post-buffering=4096
# 控制台输出日志目录
daemonize = /var/log/53kf/my_system/my_system.log
# 设置日志监听对象
logto=/var/log/53kf/my_system
# 通过该端口可以监控 uwsgi 的负载情况
stats = 127.0.0.1:8387
# 配置虚拟环境路径
virtualenv = /home/pkuokuo/venv/my_system
#设置用于uwsgi包解析的内部缓存区大小为64k。默认是4k。
buffer-size=65536
#在每个worker而不是master中加载应用
lazy-apps=true
# 设置工作进程使用虚拟内存超过N MB就回收重启
reload-on-as= 1024
# 自动给进程命名
auto-procname = true
# 为进程指定前缀
procname-prefix-spaced = xc-mms
# 设置工作进程每处理N个进程就会被回收重启
max-requests=500000
# 设置工作进程使用物理内存超过N MB就回收重启
reload-on-rss=100
# 设置socket超时时间,默认4秒
socket-timeout=10
# 限制http请求体的大小(Bytes)
limit-post=4096
# clear environment on exit
vacuum = true
# 不记录request日志,只记录错误日志
disable-logging = true
# 将日志打印到syslog上
#log-syslog = true
#stats = /opt/my_system/uwsgi.status
步骤
首先安装依赖
pip install uwsgi
命令行启动:
首先进入虚拟环境
source /home/data/webroot/devops-car/virtual/bin/activate
不带静态文件启动
uwsgi --http 0.0.0.0:9000 --chdir /opt/devops/ --wsgi-file /opt/devops/devops/wsgi.py --master --processes 4 --threads 2
带静态文件启动
uwsgi --http 0.0.0.0:9000 --chdir /opt/devops/ --wsgi-file /opt/devops/devops/wsgi.py --static-map=/static=static --master --processes 4 --threads 2
配置文件启动
(1)目录结构如下,我们再我们的项目根路径下创建文件夹 uwsgi_conf,把配置文件(uwsgi.ini)写在里面,当然日志路径你可以写到其他地方也可以写在这个目录里。
$ tree -L 1 devops/
devops/
├── audit
├── devops
├── manage.py
├── opsdb
├── static
├── sysadmin
├── templates
├── test
└── uwsgi_conf
创建日志目录:
$ tree devops/uwsgi_conf/
devops/uwsgi_conf/
├── logs
│ └── uwsgi.log
├── pid
└── uwsgi.ini
2 directories, 2 files
(2) 编写配置文件uwsgi.ini:
[uwsgi]
chdir=/home/data/webroot/devops-car/devops
module=devops.wsgi:application
processes=8
workers=5
procname-prefix-spaced=uwsgi-devops
py-autoreload=1
http=0.0.0.0:8000
for=static
static-map=/static=%(chdir)/%(_)
endfor=
uid=knight.zhou
gid=knight.zhou
master=true
vacuum=true
thunder-lock=true
enable-threads=true
harakiri=30
post-buffering=4096
daemonize=%(chdir)/uwsgi_conf/logs/uwsgi.log
pidfile=%(chdir)/uwsgi_conf/pid/uwsgi.pid
也可以不指定静态文件,静态文件由Nginx进行解析:
[uwsgi]
chdir=/home/data/webroot/devops-car/devops
module=devops.wsgi:application
processes=8
workers=5
procname-prefix-spaced=uwsgi-devops
py-autoreload=1
http=0.0.0.0:8000
uid=knight.zhou
gid=knight.zhou
master=true
vacuum=true
thunder-lock=true
enable-threads=true
harakiri=30
post-buffering=4096
daemonize=%(chdir)/uwsgi_conf/logs/uwsgi.log
pidfile=%(chdir)/uwsgi_conf/pid/uwsgi.pid
(3) 启动和停止
# 启动
uwsgi --ini uwsgi.ini
# 停止
uwsgi --stop pid/uwsgi.pid
(3) 检查是否启动
$ ps -ef |grep uwsgi
knight.+ 626 598 0 21:26 pts/0 00:00:00 grep --color=auto uwsgi
knight.+ 32617 1 0 21:22 ? 00:00:00 uwsgi-devops uWSGI master
knight.+ 32619 32617 0 21:22 ? 00:00:01 uwsgi-devops uWSGI worker 1
knight.+ 32620 32617 0 21:22 ? 00:00:01 uwsgi-devops uWSGI worker 2
knight.+ 32621 32617 0 21:22 ? 00:00:01 uwsgi-devops uWSGI worker 3
knight.+ 32622 32617 0 21:22 ? 00:00:01 uwsgi-devops uWSGI worker 4
knight.+ 32623 32617 0 21:22 ? 00:00:01 uwsgi-devops uWSGI worker 5
knight.+ 32624 32617 0 21:22 ? 00:00:00 uwsgi-devops uWSGI http 1
注意: 如果启动的时候有通过环境变量区分配置文件,需要修改如下(如果你不是通过设置环境变量启动话,下面的就不需要修改):
$ cat ../devops/wsgi.py
"""
WSGI config for devops project.
It exposes the WSGI callable as a module-level variable named ``application``.
For more information on this file, see
https://docs.djangoproject.com/en/3.1/howto/deployment/wsgi/
"""
import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'devops.settings_prd')
application = get_wsgi_application()