Python 模块 Uvicorn 实战指南

news2025/1/11 7:55:27

在这里插入图片描述

文章目录

    • 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

from fastapi import FastAPI

app = 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.StreamHandler
    formatter: default
loggers:
  uvicorn:
    handlers: [console]
    level: INFO
root:
  handlers: [console]
  level: INFO

3. 实现高级功能

3.1 支持 WebSocket

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

from fastapi import FastAPI, WebSocket

app = 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.coloradmin.cn/o/2274797.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

音频数据增强:提升音频信号质量的多种技术

在音频处理和机器学习领域,音频数据增强是一种常用的技术,旨在通过对原始音频信号进行各种变换和处理,生成更多样化的训练数据。   这不仅可以提高模型的鲁棒性,还能改善其在真实世界应用中的表现。本文将介绍几种常用的音频数据…

uniapp vue2版本如何设置i18n

如何设置i18n在该软件设置过语言的情况下优先选择所设置语言,在没有设置的情况下,获取本系统默认语言就,将系统默认语言设置为当前选择语言。 1、下载依赖: npm install vue-i18n --save 2、创建相关文件(在最外层&…

vulnhub靶场【DC系列】之9 the final 结束篇

前言 靶机:DC-8,IP地址为192.168.10.11,后续因为靶机重装,IP地址变为192.168.10.13 攻击:kali,IP地址为192.168.10.2 都采用VMWare,网卡为桥接模式 对于文章中涉及到的靶场以及工具&#xf…

网络安全 | 网络安全法规:GDPR、CCPA与中国网络安全法

网络安全 | 网络安全法规:GDPR、CCPA与中国网络安全法 一、前言二、欧盟《通用数据保护条例》(GDPR)2.1 背景2.2 主要内容2.3 特点2.4 实施效果与影响 三、美国《加利福尼亚州消费者隐私法案》(CCPA)3.1 背景3.2 主要内…

基于QT和C++的实时日期和时间显示

一、显示在右下角 1、timer.cpp #include "timer.h" #include "ui_timer.h" #include <QStatusBar> #include <QDateTime> #include <QMenuBar> Timer::Timer(QWidget *parent) :QMainWindow(parent),ui(new Ui::Timer) {ui->setup…

STM32小实验2

定时器实验 TIM介绍 TIM&#xff08;Timer&#xff09;定时器 定时器可以对输入的时钟进行计数&#xff0c;并在计数值达到设定值时触发中断 16位计数器、预分频器、自动重装寄存器的时基单元&#xff0c;在72MHz计数时钟下可以实现最大59.65s的定时 不仅具备基本的定时中断…

【软考】软件设计师

「学习路线」&#xff08;推荐该顺序学习&#xff0c;按照先易后难排序&#xff09; 1、上午题—计算机系统&#xff08;5~6分&#xff09;[1.8; ] 2、上午题—程序设计语言&#xff08;固定6分&#xff09;[1.9; ] 3、下午题—试题一&#xff08;15分&#xff09; 4、上午题—…

2030年中国AI人才缺口或达400万,近屿智能助力AI人才储备增长

在当今数字化浪潮下&#xff0c;人工智能&#xff08;AI&#xff09;已成为推动各行业发展的关键力量。然而&#xff0c;吸引和留住 AI 人才正成为全球性难题&#xff0c;中国亦不例外。据麦肯锡 2022 年全球人工智能商业高管调查&#xff0c;75% 的中国受访者在招聘数据科学家…

一块钱的RISC-V 32位芯片

‍‍ ‍‍之前跟一个朋友聊天&#xff0c;说以后的芯片一定是越来越趋向于定制化&#xff0c;比如我们需要一个ADC芯片&#xff0c;这颗ADC芯片需要有串口功能&#xff0c;那就只开发一颗这样的芯片就好了&#xff0c;其他的功能都可以裁剪掉。 ➵➵➵➵➵➵➵➵➵➵➵➵➵➵➵…

rk3568平台Buildroot编译实践:内核rootfs定制 及常见编译问题

目录 编译前准备常规编译流程定制内核修改内核 参数并增量 保存修改rootfs并增量 保存修改rootfs包下载源rootfs软件包增删refBuildroot 是一个用于自动化构建嵌入式 Linux 系统的工具。它通过使用简单的配置文件和 Makefile,能够从源代码开始交叉编译出一个完整的、可以运行在…

机器翻译优缺点

随着科技的飞速发展&#xff0c;机器翻译是近年来翻译行业的热门话题&#xff0c;在人们的生活和工作中日益普及&#xff0c;使用机器能够提高翻译效率&#xff0c;降低成本。尽管关于机器翻译为跨语言交流带来了诸多便利&#xff0c;但在译文的正确率和局限性方面存在一定争议…

R 语言科研绘图 --- 折线图-汇总

在发表科研论文的过程中&#xff0c;科研绘图是必不可少的&#xff0c;一张好看的图形会是文章很大的加分项。 为了便于使用&#xff0c;本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中&#xff0c;获取方式&#xff1a; R 语言科研绘图模板 --- sciRplothttps://mp.…

30天开发操作系统 第 12 天 -- 定时器 v1.0

前言 定时器(Timer)对于操作系统非常重要。它在原理上却很简单&#xff0c;只是每隔一段时间(比如0.01秒)就发送一个中断信号给CPU。幸亏有了定时器&#xff0c;CPU才不用辛苦地去计量时间。……如果没有定时器会怎么样呢?让我们想象一下吧。 假如CPU看不到定时器而仍想计量时…

自动化测试:6大关键脚本类型及使用要点

测试脚本在自动化测试中扮演着至关重要的角色&#xff0c;特别是常见的六种关键脚本类型及其使用范围和注意事项&#xff0c;它们能够确保系统在不同负载和环境下稳定运行&#xff0c;保障接口交互的准确性和安全性&#xff0c;从而节省时间和人力成本&#xff0c;推动项目高效…

算法题(31):两数之和-输入有序数组

审题&#xff1a; 在确定有唯一解的前提下&#xff0c;找出两个下标对应的元素值之和等于target的下标&#xff0c;并存入数组中返回 思路&#xff1a; 方法一&#xff1a;暴力搜索&#xff08;超时&#xff09; 利用两个循环进行所有情况的枚举&#xff0c;让每个元素依次与其…

9 个大数据示例

被称为大数据的技术是数字时代最具影响力的创新之一。强大的分析揭示了隐藏在大量数据中的模式和相关性&#xff0c;几乎为所有行业的规划和决策提供依据。事实上&#xff0c;就在过去十年间&#xff0c;大数据的应用已经发展到几乎触及我们生活方式、购物习惯以及日常消费选择…

低代码从“产品驱动”向“场景驱动”转型,助力数字化平台构建

一、前言 在数字化时代的大潮中&#xff0c;从宏观层面来看&#xff0c;新技术的落地速度不断加快&#xff0c;各行各业的数字化进程呈现出如火如荼的态势。而从微观层面剖析&#xff0c;企业面临着行业格局快速变化、市场竞争日益激烈以及成本压力显著增强等诸多挑战。 据专…

基于Python编程语言的自动化渗透测试工具

摘 要 近些年来网络安全形势变得越来越严峻&#xff0c;全球数百万个政企遭遇过不同程度的网络攻击。渗透测试是一种对目标进行信息安全评估的方法&#xff0c;而目前该行业仍在存在着安全服务行业价格昂贵&#xff0c;安全人才缺口巨大&#xff0c;在渗透测试时步骤繁琐、效率…

【教程】数据可视化处理之2024年各省GDP排名预测!

过去的一年里&#xff0c;我国的综合实力显著提升&#xff0c;在新能源汽车、新一代战机、两栖攻击舰、航空航天、芯片电子、装备制造等领域位居全球前列。虽然全国各省市全年的经济数据公布还需要一段时间&#xff0c;但各地的工业发展数据&#xff0c;财政收入数据已大概揭晓…

Mysql快速列出来所有列信息

文章目录 需求描述实现思路1、如何查表信息2、如何取字段描述信息3、如何将列信息一行展示4、拼接最终结果 需求描述 如何将MySQL数据库中指定表【tb_order】的所有字段都展示出来&#xff0c;以备注中的中文名为列名。 实现思路 最终展示效果&#xff0c;即拼接出可执行执行…