Python 模块 Uvicorn 实战指南

devtools/2025/1/11 13:15:35/

在这里插入图片描述

文章目录

    • 1. 介绍和安装
      • 1.1 介绍
      • 1.2 安装
    • 2. 创建基础应用
      • 2.1 简单的 HTTP 应用
      • 2.2 添加日志
    • 3. 实现高级功能
      • 3.1 支持 WebSocket
      • 3.2 优化运行性能
    • 4. Nginx 配置反向代理
      • 4.1 安装与配置 Nginx
      • 4.2 启用 SSL 支持
      • 4.3 性能优化建议
    • 5. 常见问题与解决方案
      • 5.1 高并发问题
      • 5.2 WebSocket 超时
      • 5.3 日志不完整
    • 6. 总结

Uvicorn 是一个高性能的 ASGI 实现。它是构建和运行 Python 基于 ASGI 的 Web 和实时服务器应用的理想选择。它特别适合于构建高性能、实时的应用,如 WebSocket、HTTP/2、GraphQL API等。本文将通过一些实战例子,教你如何使用 Uvicorn 构建和运行应用。

1. 介绍和安装

1.1 介绍

Uvicorn 是一个基于 Python 的轻量级 ASGI 服务器,以 uvloop 和 httptools 为核心,以提供极速和高效。

1.2 安装

使用 pip 安装:

pip install uvicorn

如果需要最高性能,建议安装以下选项:

pip install uvicorn[standard]

该包含 uvloop 和 httptools,并提供完善的日志和进程以及完整的处理能力。

2. 创建基础应用

2.1 简单的 HTTP 应用

创建一个文件,名为 app.py

python">from fastapi import FastAPIapp = FastAPI()@app.get("/")
def read_root():return {"message": "Hello, World!"}

使用 Uvicorn 运行该应用:

uvicorn app:app --host 0.0.0.0 --port 8000 --reload

2.2 添加日志

实际应用中,日志很重要。使用 --log-level 可以控制日志输出:

uvicorn app:app --log-level debug

定制日志格式:

uvicorn app:app --log-config logging.yaml

一个例子 logging.yaml

version: 1
formatters:default:format: "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
handlers:console:class: logging.StreamHandlerformatter: default
loggers:uvicorn:handlers: [console]level: INFO
root:handlers: [console]level: INFO

3. 实现高级功能

3.1 支持 WebSocket

在添加 WebSocket 支持时,可以使用 FastAPI 的高性能功能。

python">from fastapi import FastAPI, WebSocketapp = FastAPI()@app.websocket("/ws")
async def websocket_endpoint(websocket: WebSocket):await websocket.accept()while True:data = await websocket.receive_text()await websocket.send_text(f"Message text was: {data}")

运行该应用,并使用浏览器接入 WebSocket。

3.2 优化运行性能

在高流量场景中,使用 --workers 可以超现行处理。

uvicorn app:app --host 0.0.0.0 --port 8000 --workers 4

举例:指定服务器使用 uvloop :

uvicorn app:app --loop uvloop

4. Nginx 配置反向代理

在生产环境中,使用 Nginx 作为反向代理,可以提供以下优势:

  • SSL 支持
  • 更好的负载均衡能力
  • 请求过滤与缓存

以下是具体配置步骤:

4.1 安装与配置 Nginx

  1. 安装 Nginx

在基于 Debian 的系统中:

sudo apt update
sudo apt install nginx

在基于 Red Hat 的系统中:

sudo yum install nginx
  1. 编辑 Nginx 配置文件

创建或修改一个 Nginx 站点配置文件,例如 /etc/nginx/sites-available/uvicorn

server {listen 80;server_name example.com;location / {proxy_pass http://127.0.0.1:8000;proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";proxy_set_header Host $host;proxy_cache_bypass $http_upgrade;}error_log /var/log/nginx/uvicorn_error.log;access_log /var/log/nginx/uvicorn_access.log;
}
  1. 启用站点配置

在基于 Debian 的系统中:

sudo ln -s /etc/nginx/sites-available/uvicorn /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

在基于 Red Hat 的系统中,直接编辑 /etc/nginx/nginx.conf 添加上述配置,然后重新加载 Nginx:

sudo nginx -t
sudo systemctl reload nginx

4.2 启用 SSL 支持

使用 Let’s Encrypt 为域名启用 HTTPS 支持:

  1. 安装 Certbot:
sudo apt install certbot python3-certbot-nginx
  1. 自动配置 HTTPS:
sudo certbot --nginx -d example.com

完成后,Nginx 将自动更新为支持 HTTPS 的配置。

  1. 定期更新证书:

Certbot 会自动添加定期更新任务。如果需要手动测试:

sudo certbot renew --dry-run

4.3 性能优化建议

  • 启用 HTTP/2 支持

listen 指令中添加 http2

listen 443 ssl http2;
  • 启用 Gzip 压缩

在 Nginx 配置中启用 Gzip 压缩:

gzip on;
gzip_types text/plain application/json application/javascript text/css;
  • 优化缓冲设置

调整 proxy_buffer_sizeproxy_buffers

proxy_buffer_size 128k;
proxy_buffers 4 256k;
proxy_busy_buffers_size 256k;

5. 常见问题与解决方案

5.1 高并发问题

在高并发场景下,Uvicorn 可能会因为 CPU 饱和而表现出瓶颈。解决方案包括:

  • 增加 --workers 参数以启用多进程。
  • 使用负载均衡器(如 Nginx 或 HAProxy)分配请求。

5.2 WebSocket 超时

WebSocket 可能在高流量时出现超时问题。可以通过调整 Uvicorn 的 --timeout-keep-alive 参数增加连接存活时间:

uvicorn app:app --timeout-keep-alive 120

5.3 日志不完整

日志在高负载时可能出现丢失情况。解决方法是使用独立日志管理器(如 ELK 或 Fluentd)集中处理日志。


6. 总结

Uvicorn 是构建现代高性能 Python 应用的利器。通过灵活的配置和良好的性能优化,它可以轻松应对从开发到生产的各种场景。在这篇文章中,我们涵盖了 Uvicorn 的安装、基础功能、性能优化以及部署技巧。希望这些内容能帮助你更高效地使用 Uvicorn。

如果你有任何问题或建议,请在评论区留言,一起交流学习!


http://www.ppmy.cn/devtools/149619.html

相关文章

ETL的工作原理

ETL的工作原理 什么是ETL_云计算主题库-阿里云 ETL的工作原理可以分为三个主要的步骤:Extract(提取)、Transform(转换)、Load(加载)。 工作步骤 描述 Extract (提取)…

Kotlin | Android Provider 的实现案例

目标 使用 Android Room 实现持久化库。 代码 Kotlin 代码编写 DemoDatabase,在build生成 DemoDatabase_Impl 疑问 Provider的数据会存在设备吗? 内部存储: 当使用 Room 创建数据库(如 DemoDatabase),数据库文件通常…

nginx运行之后显示的是上一个项目,如何解决

重启 Nginx 使配置生效 修改 Nginx 配置后,你需要重新加载或重启 Nginx,以使配置生效。执行以下命令: sudo nginx -t # 测试配置是否正确 sudo systemctl restart nginx # 重启 Nginxbash 复制代码 检查浏览器缓存 浏览器可能缓存了旧…

代码随想录算法训练营第六十天|KM94.城市间货物运输Ⅰ|KM95.城市间货物运输Ⅱ|KM96.城市间货物运输Ⅲ

94. 城市间货物运输 I 2、Bellman_ford队列优化算法(又名SPFA) SPFA是对Bellman_ford算法的优化,由于Bellman_ford 算法 每次都是对所有边进行松弛,其实是多做了一些无用功。其实只需要对 上一次松弛的时候更新过的节点作为出发节…

网络安全 | DevSecOps:将安全融入DevOps开发生命周期

网络安全 | DevSecOps:将安全融入DevOps开发生命周期 一、前言二、DevSecOps 的概念与原则2.1 DevSecOps 的概念2.2 DevSecOps 的原则 三、DevSecOps 的关键实践3.1 安全需求分析与管理3.2 安全设计与架构3.3 安全编码实践3.4 安全测试策略3.5 安全部署与运维 四、D…

sklearn-逻辑回归-制作评分卡

目录 数据集处理 分箱 分多少个箱子合适 分箱要达成什么样的效果 对一个特征进行分箱的步骤 分箱的实现 封装计算 WOE 值和 IV值函数 画IV曲线,判断最佳分箱数量 结论 pd.qcut 执行报错 功能函数封装 判断分箱个数 在银行借贷场景中,评分卡是…

宝塔安装教程,bt怎么安装 linux

Centos安装脚本 yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh 37a09b35 Ubuntu/Deepin安装脚本 wget -O install.sh http://download.bt.cn/install/install-ubuntu_6.0.sh && sudo b…

《HeadFirst设计模式》笔记(下)

11 代理模式 代理要做的就是控制和管理访问。 你的客户对象所做的就像是在做远程方法调用,但其实只是调用本地堆中的“代理”对象上的方法,再由代理处理所有网络通信的低层细节。 Java的RMI提供了客户辅助对象和服务辅助对象,为客户辅助对…