使用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

相关推荐
ROBOT玲玉24 分钟前
Milvus 中,FieldSchema 的 dim 参数和索引参数中的 “nlist“ 的区别
python·机器学习·numpy
小_太_阳41 分钟前
Scala_【1】概述
开发语言·后端·scala·intellij-idea
智慧老师1 小时前
Spring基础分析13-Spring Security框架
java·后端·spring
Kai HVZ1 小时前
python爬虫----爬取视频实战
爬虫·python·音视频
古希腊掌管学习的神1 小时前
[LeetCode-Python版]相向双指针——611. 有效三角形的个数
开发语言·python·leetcode
m0_748244831 小时前
StarRocks 排查单副本表
大数据·数据库·python
B站计算机毕业设计超人1 小时前
计算机毕业设计PySpark+Hadoop中国城市交通分析与预测 Python交通预测 Python交通可视化 客流量预测 交通大数据 机器学习 深度学习
大数据·人工智能·爬虫·python·机器学习·课程设计·数据可视化
路人甲ing..2 小时前
jupyter切换内核方法配置问题总结
chrome·python·jupyter
游客5202 小时前
opencv中的常用的100个API
图像处理·人工智能·python·opencv·计算机视觉
每天都要学信号2 小时前
Python(第一天)
开发语言·python