使用ASGI部署Django的几种方式

服务器介绍

  • Daphne是一个纯PythonASGI服务器,用于UNIX,由Django项目的成员维护。它充当ASGI的参考服务器。
  • Hypercorn是一个支持HTTP/1、HTTP/2和HTTP/3的ASGI服务器,重点是协议支持。
  • Uvicorn是一个基于 uvloop 和 httptools ,强调速度。

为什么要使用asgi?

uwsgi并不能处理websocket请求,所以需要asgi服务器来处理websocket请求

WSGI、uwsgi和ASGI协议

  • 请求接收与转发:WSGI、uwsgi和ASGI服务器负责接收来自客户端的请求,并将请求转发给相应的应用程序处理。这一过程中,服务器需要解析请求中的信息,并将必要的数据传递给应用程序。
  • 应用程序处理:应用程序根据接收到的请求数据进行处理,并生成相应的响应。在处理过程中,应用程序可以调用各种资源和方法,以完成对请求的处理。
  • 响应返回:应用程序处理完请求后,将生成的响应返回给服务器。服务器再将响应发送回客户端。在这一过程中,协议规定了响应的格式和传输方式

方式一:使用Daphne部署Django

**Daphne:**目的是提供高效、快速的HTTP和WebSocket服务,可以处理大量并发连接

python3.7及以上版本才可安装

安装 Daphne

python -m pip install daphne

在 Daphne 中运行 Django

一旦 Daphne 安装完毕,你就可以使用 daphne 命令了,它将用来启动 Daphne 服务进程。在最简单的情形下,Daphne 加上包含一个 ASGI 应用模块的位置和应用的名称(以冒号分隔)。

对于一个典型的 Django 项目,可以像下面这样来启动 Daphne

> daphne myproject.asgi:application

命令格式:

daphne -b <绑定IP> -p <绑定端口> myproject.asgi:application

它将开启一个进程,监听 127.0.0.1:8000 。这需要你的项目位于 Python path 上。为了确保这点,你应该在与 manage.py 文件相同的路径中运行这个命令。

例如,以下命令将启动一个绑定在127.0.0.1:8000上,使用4个工作进程的Daphne服务器,并将访问日志输出到access.log文件中:

daphne --bind 127.0.0.1 --port 8000 --workers 4 --access-log access.log myproject.asgi:application

常用参数详解

下面是一些常用的 Daphne 参数:

--port: 指定 Daphne 监听的端口,默认为8000。

--bind: 指定 Daphne 监听的 IP 地址和端口,格式为ip:port。

--unix-socket: 指定 Daphne 监听的 Unix 域套接字路径。

--verbosity: 指定日志详细程度,可选的值有 0(只输出错误信息)、1(输出错误信息和警告信息)、2(输出错误信息、警告信息和一般信息)。

--access-log: 指定访问日志文件路径,如果不指定,则不会记录访问日志。

--root-path: 指定静态文件根目录,用于提供静态文件服务。

--ping-interval: 指定 Websocket ping 的间隔时间,单位为秒,默认为20秒。

--ping-timeout: 指定 Websocket ping 超时时间,单位为秒,默认为30秒。

--http-timeout: 指定 HTTP 请求超时时间,单位为秒,默认为120秒。

--websocket-timeout: 指定 Websocket 连接超时时间,单位为秒,默认为120秒。

方式二:使用Hypercorn部署Django

安装Hypercorn

> python -m pip install hypercorn

在 Hypercorn 中运行 Django

安装了Hypercorn后 hypercorn 命令可用于运行ASGI应用程序。调用Hypercorn时需要使用包含ASGI应用程序对象的模块的位置,后跟应用程序的名称(用冒号分隔)。

对于一个典型的Django项目,调用Hypercorn将如下所示:

> hypercorn myproject.asgi:application

执行位置同上

方式三:使用Uvicorn部署Django

安装Uvicorn

> python -m pip install uvicorn

在 Uvicorn 中运行 Django:

uvicorn myproject.asgi:application

执行位置同上

使用nginx代理转发配置参考:

upstream backend {

server 127.0.0.1:8000;

There could be more than a backend here

}

server {

server_name my-domain.com;

location / {

proxy_pass http://backend;

proxy_set_header Host $host;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_set_header X-Forwarded-Proto $scheme;

}

}

直接代理转发

参考文档:

如何使用 ASGI 来部署 | Django 文档 | Django

Deploying --- Channels 4.0.0 documentation

相关推荐
Patrick在香港15 分钟前
一个斜杠,把毫秒变成十几秒
android·数据库·python·性能优化·正则表达式·回溯·redos
2601_9679801122 分钟前
Python 初学者必备的常用内置函数
python·编程语言·内置函数·初学者·常用函数
OnlineProxy29 分钟前
移动应用数据爬取:通过模拟器与流量嗅探对 API 进行逆向工程
爬虫·python·httpx
染指11101 小时前
162.Agent-LangGraph-检查点的作用
人工智能·python·langchain·agents
我命由我123451 小时前
访客系统形式(有用户概念、无用户概念)
java·开发语言·前端·javascript·python·产品运营·产品经理
xixingzhe21 小时前
图表中同比与环比的区别:看趋势还是看变化?
开发语言·python
forest_092 小时前
当 AI 搜索开始「自我进化」,谁来进化它的核实?——「已核实」结论复核器:3 条结论挖出 2 个洞(附可运行代码)
人工智能·python·机器学习·prompt·agi
小小张说故事2 小时前
Python 的 str 为什么设计成不可变?拆开字符串驻留、字符串池,以及 += 拼接到底慢在哪
后端·python
ljt27249606612 小时前
Python笔记(十一)--Numpy(一)
笔记·python·numpy
时早玖沐2 小时前
KOOK「找不到语音频道」:同一个错误假设,我犯了三次
python·开源·ai编程