gunicorn部署django

转载自:https://blog.csdn.net/qq_15028721/article/details/129298393

gunicorn_config.py文件: 启动命令 guincorn 你的项目.wsgi -c gunicorn_config.py

# -*- coding:utf-8 _*-
"""
@author:lenovo
@file: gunicorn_config.py
@time: 2023/3/2  9:57
"""
import os
import multiprocessing

bind = '127.0.0.1:8000'  # 指定监听的地址和端口,用于nginx转发
backlog = 2048  # 服务器中排队等待的最大连接数,建议值64-2048,超过2048时client连接会得到一个error。

workers = multiprocessing.cpu_count() * 2 + 1  # 用于处理工作的进程数,这里使用了文档建议的值
worker_class = 'gthread'  # worker进程的工作方式,有sync、eventlet、gevent、tornado、gthread, 缺省值sync, django使用gthread的方式好一些。
worker_connections = 1000  # 最大客户端并发数量,默认情况下这个值为1000。此设置将影响gevent和eventlet工作模式

threads = int(480 / workers)  # 数据库连接数=workers*threads*2
timeout = 60  # 访问超时时间,默认30s
graceful_timeout = 60  # 接收到restart信号后,worker可以在graceful_timeout时间内,继续处理完当前requests。
keepalive = 2  # server端保持连接时间,默认情况下值为2。一般设定在1~5秒之间。
limit_request_line = 4094  # HTTP请求行的最大大小,默认值为4094。范围是0~8190,此参数可以防止任何DDOS攻击
limit_request_fields = 100  # 限制HTTP请求中请求头字段的数量,默认值为100,范围是0~32768,此参数可以防止任何DDOS攻击
limit_request_field_size = 8190  # 限制HTTP请求中请求头的大小,默认值为8190

reload = False  # 代码更新时不重启项目
daemon = False  # Gunicorn是否为守护进程(后端进程),默认为False
# max_requests = 1000  # 有内存泄露时使用此选项重启work
# max_requests_jitter = 50  # 重启work的抖动幅度,一般设置为max_requests的5%
pidfile = '/tmp/gunicorn.pid'  # pid文件的文件名

# keyfile = '.../server.key'  # ssl证书密钥文件路径
# certfile = '.../server.crt'  # ssl证书文件路径

accesslog = '-'  # 访问日志文件路径,'-'表示输出到终端
access_log_format = '%(t)s %(h)s "%(r)s" %(s)s %(b)s "%(f)s" "%(L)s"'  # 访问日志文件格式

errorlog = '/tmp/gunicorn.log'  # 错误日志文件路径,'-'表示输出到终端
# loglevel = '-'  # 错误级别,debug(调试)、info(信息)、warning(警告)、error(错误)、critical(危急)

pythonpath = '/home/ubuntu/anaconda3/bin/python -u'  # 逗号分隔的Python执行路径,可以加上参数,这里只有一个路径,-u表示使用无缓冲的二进制终端输出流
project_name = 'Discern'
proc_name = 'gunicorn_%s' % project_name  # 设置进程名称
os.environ.setdefault('DJANGO_SETTINGS_MODULE', '%s.settings' % project_name)  # 设置环境变量指定Django运行使用的配置文件
os.environ.setdefault('WERKZEUG_RUN_MAIN', 'true')  # 设置环境变量告诉wekzeug这个是用于reload的主进程

 2. 部署完成之后碰到了一个问题,django级别的日志无法打印

就是在本地启动runsever,终端会打印http请求信息,但是用gunicorn的时候就没有了
目前认为这是正常的,但是不明所以。 项目上是自己写中间件来自己实现这个日志的打印

 3. supervisor管理gunicorn

mkdir -p /etc/supervisor/conf.d
cd /etc/supervisor
touch supervisord.conf

cd conf.d
touch myproject.ini

# 编辑supervisord.conf ==========
[unix_http_server]
file=/var/run/supervisor.sock   ; the path to the socket file

[supervisord]
logfile=/etc/supervisor/log/supervisord.log    ; 避免被系统删除
logfile_maxbytes=50MB        ; max main logfile bytes b4 rotation; default 50MB
logfile_backups=10           ; # of main logfile backups; 0 means none, default 10
loglevel=info                ; log level; default info; others: debug,warn,trace
pidfile=/var/run/supervisord.pid    ; 避免被系统删除
nodaemon=false               ; start in foreground if true; default false
silent=false                 ; no logs to stdout if true; default false
minfds=1024                  ; min. avail startup file descriptors; default 1024
minprocs=200                 ; min. avail process descriptors;default 200

[rpcinterface:supervisor]    ;使用supervisorctl必须配置
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface 
[supervisorctl]
serverurl=unix:///var/run/supervisor.sock

[include]
files = /etc/supervisor/conf.d/*.ini
# 编辑myproject.ini ==============
[program:myproject]        ;要和文件名称相同
command=gunicorn project.wsgi -c config        ;gunicorn的启动命令
directory=项目根目录,能看到manage.py的那里        ;表示command命令的执行目录,本文用的时候TP框架,school-task为项目名称
autorestart=true        ;自动重启
startsecs=3        ;启动后程序需要保持运行的总秒数,以认为启动成功(将进程从STARTING状态移动到running状态)。设置为0表示程序不需要在任何特定的时间内保持运行
startretries=3        ;启动失败时的最多重试次数
stdout_logfile=/etc/supervisor/log/test.out.log     ;输出日志文件路径
stderr_logfile=/etc/supervisor/log/test.err.log        ;错误日志文件路径
stdout_logfile_maxbytes=2MB        ;设置stdout_logfile的文件大小
stderr_logfile_maxbytes=2MB        ;设置stderr_logfile的文件大小
user=root        ;指定运行的用户
priority=999        ;程序在启动和关闭顺序中的相对优先级
numprocs=1
process_name=%(program_name)s_%(process_num)02d

# 启动命令 =======
#启动supervisord
supervisord -c /etc/supervisor/supervisord.conf

#关闭supervisord
supervisorctl -c /etc/supervisor/supervisord.conf shutdown

#查看supervisord管理的进程。下面四个命令可以不用-c, 直接supervisorctl reload
supervisorctl -c /etc/supervisor/supervisord.conf status all
supervisorctl -c supervisor.conf reload              重新载入配置文件
supervisorctl -c supervisor.conf start [all]|[x]     启动所有/指定的程序进程
supervisorctl -c supervisor.conf stop [all]|[x]      关闭所有/指定的程序进程


#重新加载配置
supervisorctl -c /etc/supervisor/supervisord.conf update

#重新启动supervisord
supervisorctl -c /etc/supervisor/supervisord.conf reload#停止supervisord管理的进程,【process_name】表示子任务名称
supervisorctl -c /etc/supervisor/supervisord.conf stop process_name

#启动supervisord管理的进程,【process_name】表示子任务名称
supervisorctl -c /etc/supervisor/supervisord.conf start process_name



原文地址:https://www.cnblogs.com/mklblog/p/18070785



 

posted @ 2024-10-17 13:32  10132714  阅读(27)  评论(0编辑  收藏  举报