uWSGI+nginx部署Django项目记录
一:安装uWSGI
1.1安装uWSGI
在/usr/local目录下新建目录:uwsgi,用于存储uWSGI配置文件及日志。配置文件内如如下:
# mysite_uwsgi.ini file [uwsgi] # Django-related settings # the base directory (full path) #指定django的项目目录,第一层 chdir = /usr/local/infoOCR # Django's wsgi file #找到django的wsgi文件 #这里需要写项目的第二层目录Alibab_crm module = infoOCR.wsgi buffer-size = 65536 post-buffering = 65536 # the virtualenv (full path) #填写虚拟环境的绝对路径 home = /usr/local/infoOCR/info_env # process-related settings #启动主进程,来管理其他进程,其它的uwsgi进程都是这个master进程的子进程,如果kill这个master进程,相当于关闭所有的uwsgi进程。 master = true # 保存主进程pid文件 pidfile=uwsgi.pid # maximum number of worker processes processes = 2 # the socket (use the full path to be safe #指定socket协议,运行django,只能与nginx结合时使用 socket = 127.0.0.1:8000 #如果你没用nginx,只想自己启动一个http界面,用这个 #http = 0.0.0.0:8001 # ... with appropriate permissions - may be needed # chmod-socket = 664 # clear environment on exit vacuum = true daemonize=/usr/local/uwsgi/uwsgi.log # 设置最大日志文件大小(简单)分割日志: log-maxsize = 2048 # 按日期分割按以下方法:生成一个监听的文件, # touch .touchforlogrotat 相当于修改了创建时间,系统会重新reload日志 touch-logreopen =/usr/local/uwsgi/.touchforlogrotat
如果想让uWSGI也暴露出http,则打开http部分即可。
经过检验,发现此配置文件没有问题,但要注意,请在实际用时一定要注意:module = infoOCR.wsgi,是否正确!
启动python的虚拟环境,运行:
pip install -r requirements.txt
安装完成后,再运行命令安装uWSGI:
pip install uwsgi
安装完成后,定位到/usr/local/uwsgi目录,运行命令启动uWSGI:
uwsgi uwsgi.ini 或者:uwsgi --ini uwsgi_conf.ini &
启动成功后,可以从浏览器访问8001(前提打开上述配置文件http部分)查看是否正常。
uWSGI的关闭命令网上一边倒,使用以下命令:
uwsgi --stop uwsgi.pid
前提是设置了master=true及pidfile,否则只能用以下命令:
killall -9 uwsgi 或者 pkill -f uwsgi -9
1.2uWSGI日志配置:
首先,在settings.py文件中添加日志配置:
LOGGING = { 'version': 1, # 指明dictConnfig的版本,目前就只有一个版本 'disable_existing_loggers': False, # 禁用所有的已经存在的日志配置 # 格式器 'formatters': { 'standard': { # 详细 'format': '时间:[%(asctime)s] | 级别:[%(levelname)s] | 路径:[%(pathname)s] | '+ '文件名:[%(filename)s] | 方法:[%(funcName)s] | 行数:[%(lineno)d] | 日志消息:\n[%(message)s]\n------------------------------------------------------------', }, 'simple': { # 简单 'format': '时间:%(asctime)s | %(levelname)s | %(message)s', }, }, # 过滤器 'filters': { 'require_debug_true': { '()': 'django.utils.log.RequireDebugTrue', # 此过滤器仅在settings.DEBUG为True时传递记录 }, 'require_debug_false': { '()': 'django.utils.log.RequireDebugFalse', # 此过滤器仅在settings.DEBUG为False时传递记录 }, }, # 处理器,在这里定义了三个处理器。主要指明:处理引擎类、格式器、过滤器、日志等级 'handlers': { 'file_handler': { # 文件处理器,所有高于(包括)debug的消息会被传到"E:/Djlog/file.log" 'level': 'DEBUG', 'class': 'logging.handlers.TimedRotatingFileHandler', 'formatter': 'standard', 'filename': 'E:/Djlog/file.log', }, 'console': { # 流处理器(控制台),所有的高于(包括)debug的消息会被传到stderr,使用的是simple格式器 'level': 'INFO', 'class': 'logging.StreamHandler', 'formatter': 'standard', }, 'mail_admins': { # AdminEmail处理器,所有高于(包括)而error的消息会被发送给站点管理员,使用的是special格式器 'level': 'ERROR', 'class': 'django.utils.log.AdminEmailHandler', 'formatter': 'standard', 'include_html': False, # 是否发送那些回溯信息,因为这些都是很敏感的系统系统,如果被人截获,可能会发生危险,所以要谨慎 'filters': ['require_debug_false'], # 当settings.DEBUG=False的时候,AdminEmailHandler才生效 }, }, # 记录器。主要指明:处理器、日志等级 'loggers': { 'django': { # 使用file_handler处理器,所有高于(包括)info的消息会被发往console和file_handler处理器,向父层次传递信息 'handlers': ['file_handler', 'console'], 'level': 'INFO', 'propagate': False, # 是否继承父类的log信息 }, # 'django.request': { # 所有高于(包括)error的消息会被发往console和mail_admins处理器,消息不向父层次发送 # 'handlers': ['mail_admins', 'console'], # 'level': 'DEBUG', # 'propagate': False, # }, # 'myproject.custom': { # 所有高于(包括)info的消息同时会被发往console和mail_admins处理器 # 'handlers': ['mail_admins', 'console'], # 'level': 'INFO', # 'propagate': False, # }, } }
其中,file_handler部分中的filename不可缺少,并且一定要符合实际路径,否则会编译出错。
日志的调用逻辑为:logger->handler-formatter,其中前2个处理节点可以设置记录level,如果2个节点设置了不同的level,则以高者为准。
其次,在views.py(示例)中添加logger声明:
import logging logger = logging.getLogger('django')
在getLogger中填写django这个logger,如果不写,则系统会自动创建一个logger,但以控制台输出为准。并不按照配置文件走。
然后在业务方法中写:
def hello(request): logger.error('Something went wrong!') return HttpResponse('ok', content_type="application/json")
这样就会在配置中的filename和console中输出info及以上的日志。
问题:如果想利用uwsgi来记录django中的业务日志,怎么办?
1.3uWSGI获取django日志
其实uwsgi记录的是django中console类型的日志,按此规律,若让uwsgi获取django中的业务日志,则只需要在settings.py文件中修改如下:
'django': { # 使用file_handler处理器,所有高于(包括)info的消息会被发往console和file_handler处理器,向父层次传递信息 'handlers': ['console'], 'level': 'INFO', 'propagate': False, # 是否继承父类的log信息 },
然后,重启uwsgi,然后就会在uwsgi.log中看到相关日志:
1.4不合并uWSGI和django日志
如果不想合并uWSGI和django的日志,则只需要修改settings.py中相关配置为:
'handlers': ['file_handler','console'],
这样就能在uWSGI日志及django指定的日志文件中分别看到相关日志。
1.5按日期分割uwsgi日志:
uWSGI日志文件大了查看起来会不方便,为此需要分割日志:
方法一:直接指定日志文件大小:
log-maxsize=2048
方法二:按日期进行分割,步骤如下:
在uwsgi.ini配置文件中添加一行:
# 生成一个监听的文件,
# touch .touchforlogrotat 相当于修改了创建时间,系统会重新reload日志
touch-logreopen =/usr/local/uwsgi/.touchforlogrotat
然后在特定文件夹(本次示例为/usr/local/uwsg/)建立一个脚本文件logbackups.sh
#!/bin/bash LOGDIR="/usr/local/uwsgi" # uwsgi.log路径 DATE=`date -d "yesterday" +"%Y-%m-%d"` # 注意不是单引号 #NEWDIR="/root/Logs/${DATE}" # uwsgi.newlog 路径 #mkdir -p ${NEWDIR} mv ${LOGDIR}/uwsgi.log ${LOGDIR}/uwsgi-${DATE}.log touch ${LOGDIR}/.touchforlogrotat # .touchforlogrotat 路径
注意最后一行和uwsgi.ini里面的写法相同。
然后重启uwsgi,并在文件夹/usr/local/uwsgi文件夹中运行:sh ./logbackups.sh进行测试,如果发现生成了新的带日期的日志,说明ok,否则请检查并修改脚本文件内容。之后,运行
crontab -e
''' * * * * * 执行任务 第一个* 一小时当中的第几分钟:0-59 第二个* 一天当中的第几个小时:0-23 第三个* 一月当中的第几天:1-31 第四个* 一年当中的第几个月:1-12 第五个* 一周当中的第几个星期:0-7 0,7都代表周日 ''' 0 0 * * * sh /usr/local/uwsgi/logbackups.sh
即可完成日志分割配置。
二:安装nginx
拷贝nginx-1.20.1.tar.gz到目录:/usr/local,运行命令解压:tar -zxvf nginx-1.20.1.tar.gz,解压后注意不要修改文件夹名称为nginx,因为nginx的编译安装目录就是nginx,这样会与源文件目录冲突。直接进入nginx-1.20.1目录,运行:
./configure
make&&make install
安装完成后,打开conf/nginx.conf文件,修改配置内容,和uWSGI相互匹配。方法有两种:
定位到:location /部分:
方法一:假如uWSGI服务器也开启http,则在location中添加:
proxy_pass http://127.0.0.1:8001
即采用http代理方式,转发到uWSGI,但这样失去了使用wsgi协议优势,性能降低不少,不推荐。
方法二:采用wsgi协议,在location部分添加:
include /usr/local/nginx/conf/uwsgi_params; uwsgi_pass 127.0.0.1:8000
这样采用wsgi代理方式,性能会更好。
配置完成后,启动及关闭nginx方法为:
启动:sbin/nginx
关闭:sbin/nginx -s stop
重启:sbin/nginx -s reload
查找nginx和配置文件:
whereis nginx
然后在列表中把第一个地址后面加参数 -t.
隐藏nginx版本:
在nginx.config文件的http部分添加一行:
server_tokens off;
保存后,sbin/nginx -s reload即可。