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即可。

posted @ 2021-08-20 17:33  Shapley  阅读(555)  评论(0编辑  收藏  举报