当前位置: 首页 > news >正文

tornado+gunicorn部署设置max_body_size

背景

想通过 gunicornmax_requests 配置实现重启进程,解决一些内存泄露问题。

因为gunicorn启动配置的是 tornado.web.Application 实例,并非直接使用 tornado.httpserver.HTTPServer 导致无法设置 max_body_sizemax_buffer_size

而 gunicore配置项 中只有 limit_request_line /limit_request_fields / limit_request_field_size 无法满足 tornado的限制配置。

现状

依赖版本如下:

  • Python3.9
  • tornado==6.5.2
  • gunicorn==23.0.0

app.py

# 定义实例
app = tornado.web.Application(url_patterns)

gunicorn.conf.py

# 因为用的docker部署有restart配置
daemon = False
# 不能设置为True, tornado的IOLoop不能被共享
preload_app = False
# 可以有效解决OOM的问题
max_requests = 102400
max_requests_jitter = 1024
# 连接的空闲时间(秒),对应 idle_connection_timeout=60
keepalive = 60
# 对应 body_timeout/请求处理超时
timeout = 60
# bind
# port = os.environ.get("PROJECT_PORT", 8000)
# bind = "0.0.0.0:{}".format(port)
worker_class = "tornado"

启动命令

gunicorn -c gunicorn.conf.py --bind 0.0.0.0:8000 --workers 2 app:app

自定义 TornadoWorker

解决方式可以通过自定义 TornadoWorker . 代码是基于 gunicorn 源码修改的,主要修改 server_class 初始化的部分,增加了 max_body_size 相关配置。

最终的是同步修改 gunicore 启动 worker_class 配置:

worker_class = "gunicorn_worker.MyTornadoWorker"

gunicorn_worker 代码实现如下:

#!/usr/bin/env python
# coding=utf-8
import typingfrom gunicorn.sock import ssl_context
from gunicorn.workers.gtornado import TornadoWorkerimport tornado
from tornado.wsgi import WSGIContainer
from tornado.ioloop import IOLoop, PeriodicCallbackMAX_FILE_SIZE = 100 * 1024 * 1024  # 100MBclass MyTornadoWorker(TornadoWorker):"""专门为tornado>=6定制因为需要实现设置 max_body_size"""def run(self) -> None:self.ioloop = IOLoop.instance()self.alive = Trueself.server_alive = False# tornado >= 5self.callbacks = []self.callbacks.append(PeriodicCallback(self.watchdog, 1000))self.callbacks.append(PeriodicCallback(self.heartbeat, 1000))for callback in self.callbacks:callback.start()# Assume the app is a WSGI callable if its not an# instance of tornado.web.Application or is an# instance of tornado.wsgi.WSGIApplicationapp = self.wsgiif not isinstance(app, WSGIContainer) and not isinstance(app, tornado.web.Application):app = WSGIContainer(app)# Monkey-patching HTTPConnection.finish to count the# number of requests being handled by Tornado. This# will help gunicorn shutdown the worker if max_requests# is exceeded.httpserver = tornado.httpserver.HTTPServerif hasattr(httpserver, "HTTPConnection"):old_connection_finish = httpserver.HTTPConnection.finishdef finish(other: typing.Any) -> None:self.handle_request()old_connection_finish(other)httpserver.HTTPConnection.finish = finishserver_class = httpserverelse:class _HTTPServer(tornado.httpserver.HTTPServer):def on_close(instance: typing.Any, server_conn: typing.Any) -> None:self.handle_request()super().on_close(server_conn)server_class = _HTTPServerif self.cfg.is_ssl:server = server_class(app,ssl_options=ssl_context(self.cfg),max_body_size=MAX_FILE_SIZE,max_buffer_size=MAX_FILE_SIZE,)else:server = server_class(app,max_body_size=MAX_FILE_SIZE,max_buffer_size=MAX_FILE_SIZE,)self.server = serverself.server_alive = Truefor s in self.sockets:s.setblocking(0)if hasattr(server, "add_socket"):  # tornado > 2.0server.add_socket(s)elif hasattr(server, "_sockets"):  # tornado 2.0server._sockets[s.fileno()] = sserver.no_keep_alive = self.cfg.keepalive <= 0server.start(num_processes=1)self.ioloop.start()
http://www.dtcms.com/a/585949.html

相关文章:

  • 大鹏网络网站建设报价asp 建站
  • SSM基于Java的医疗器械销售系统oy281(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
  • CTFHub Web进阶-PHP:Bypass_disable_function通关9之iconv,bypass iconv1,bypass iconv2
  • 排序算法介绍
  • 服装私人订制网站高端网站建设公司名字
  • CSP-S 练习题:美丽的集合(ST表、二分查找、数论基础-GCD 的应用)
  • 建设一个本地网站网站内容怎么编辑
  • 接口测试基础知识
  • 新网站建设的感想做网站虚拟主机配置
  • LeetCode 419 - 棋盘上的战舰
  • 【视觉】对比分析 GigE Vision、USB3Vision、UCV三种协议
  • 无锡网站制作8揭阳专业做网站公司
  • 建站之星平台怒江网站制作
  • 网站推广技巧汨罗做网站价格
  • Qt-视频播放器
  • 基于单片机的电子琴设计与乐曲存储播放实现
  • 企业站seo哪家好任何人任意做网站销售产品违法吗
  • TensorRT笔记(1):自定义MNIST数据集推理类
  • 基本魔法语言函数(一)(C语言)
  • 西电现代密码学实验三
  • winlogon登录对话框user32!sldrawtext显示星号
  • 昌吉做网站推广的公司php网站后台忘记密码
  • 非法网站开发爱企业 查询
  • 【P1】win10安装 Docker教程
  • 苹果CMS搭建方法技术文章大纲
  • 台州黄岩做网站宁夏众擎达网站建设
  • 电商网站构建网站不支持php
  • 【好书】简史推荐(20251108)
  • [C++]缺省参数-声明和定义歧义问题
  • 做美食教程的网站有哪些软件商店app