三周精通FastAPI:42 手动运行服务器 - Uvicorn Gunicorn with Uvicorn

news2024/11/16 13:28:36

官方文档:Server Workers - Gunicorn with Uvicorn - FastAPI

使用 fastapi 运行命令

可以直接使用fastapi run命令来启动FastAPI应用:

fastapi run main.py

如执行

fastapi run openapi.py

启动后显示: 

INFO     Using path openapi.py                                     
INFO     Resolved absolute path                                    
         /Users/skywalk/work/fastapi/openapi.py                    
INFO     Searching for package file structure from directories with
         __init__.py files                                         
INFO     Importing from /Users/skywalk/work/fastapi                
                                                                   
 ╭─ Python module file ─╮                                          
 │                      │                                          
 │  🐍 openapi.py       │                                          
 │                      │                                          
 ╰──────────────────────╯                                          
                                                                   
INFO     Importing module openapi                                  
INFO     Found importable FastAPI app                              
                                                                   
 ╭─ Importable FastAPI app ──╮                                     
 │                           │                                     
 │  from openapi import app  │                                     
 │                           │                                     
 ╰───────────────────────────╯                                     
                                                                   
INFO     Using import string openapi:app                           
                                                                   
 ╭─────────── FastAPI CLI - Production mode ───────────╮           
 │                                                     │           
 │  Serving at: http://0.0.0.0:8000                    │           
 │                                                     │           
 │  API docs: http://0.0.0.0:8000/docs                 │           
 │                                                     │           
 │  Running in production mode, for development use:   │           
 │                                                     │           
 │  fastapi dev                                        │           
 │                                                     │           
 ╰─────────────────────────────────────────────────────╯           
                                                                   
INFO:     Started server process [82331]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)

这将适用于大多数情况。😎
例如,您可以使用该命令在容器、服务器等中启动FastAPI应用程序。

手动运行服务器 - Uvicorn¶

在远程服务器计算机上运行 FastAPI 应用程序所需的主要东西是 ASGI 服务器程序,例如 Uvicorn

有 3 个主要可选方案:

  • Uvicorn:高性能 ASGI 服务器。
  • Hypercorn:与 HTTP/2 和 Trio 等兼容的 ASGI 服务器。
  • Daphne:为 Django Channels 构建的 ASGI 服务器。

服务器主机和服务器程序¶

关于名称,有一个小细节需要记住。 💡

服务器”一词通常用于指远程/云计算机(物理机或虚拟机)以及在该计算机上运行的程序(例如 Uvicorn)。

请记住,当您一般读到“服务器”这个名词时,它可能指的是这两者之一。

当提到远程主机时,通常将其称为服务器,但也称为机器(machine)、VM(虚拟机)、节点。 这些都是指某种类型的远程计算机,通常运行 Linux,您可以在其中运行程序。

安装服务器程序¶

您可以使用以下命令安装 ASGI 兼容服务器:

UvicornHypercorn

  • Uvicorn,一个快如闪电 ASGI 服务器,基于 uvloop 和 httptools 构建。
pip install "uvicorn[standard]"
  • Hypercorn,一个也与 HTTP/2 兼容的 ASGI 服务器。
pip install hypercorn

Tip

通过添加standard,Uvicorn 将安装并使用一些推荐的额外依赖项。

其中包括uvloop,它是asyncio的高性能替代品,它提供了巨大的并发性能提升。

运行服务器程序¶

您可以按照之前教程中的相同方式运行应用程序,但不使用--reload选项,例如:

Uvicorn

uvicorn main:app --host 0.0.0.0 --port 80

Hypercorn

hypercorn main:app --bind 0.0.0.0:80

Warning

如果您正在使用--reload选项,请记住删除它。

--reload 选项消耗更多资源,并且更不稳定。

它在开发期间有很大帮助,但您不应该生产环境中使用它。

Hypercorn with Trio¶

Starlette 和 FastAPI 基于 AnyIO, 所以它们才能同时与 Python 的标准库 asyncio 和Trio 兼容。

尽管如此,Uvicorn 目前仅与 asyncio 兼容,并且通常使用 uvloop, 它是asyncio的高性能替代品。

但如果你想直接使用Trio,那么你可以使用Hypercorn,因为它支持它。 ✨

安装具有 Trio 的 Hypercorn¶

首先,您需要安装具有 Trio 支持的 Hypercorn:

pip install "hypercorn[trio]"

Run with Trio¶

然后你可以传递值trio给命令行选项--worker-class:

hypercorn main:app --worker-class trio

这将通过您的应用程序启动 Hypercorn,并使用 Trio 作为后端。

现在您可以在应用程序内部使用 Trio。 或者更好的是,您可以使用 AnyIO,使您的代码与 Trio 和 asyncio 兼容。 🎉

部署概念¶

这些示例运行服务器程序(例如 Uvicorn),启动单个进程,在所有 IP(0.0.0.0)上监听预定义端口(例如80)。

这是基本思路。 但您可能需要处理一些其他事情,例如:

  • 安全性 - HTTPS
  • 启动时运行
  • 重新启动
  • Replication(运行的进程数)
  • 内存
  • 开始前的步骤

在接下来的章节中,我将向您详细介绍每个概念、如何思考它们,以及一些具体示例以及处理它们的策略。 🚀

Server Workers - Gunicorn with Uvicorn¶

让我们回顾一下之前的部署概念:

  • 安全性 - HTTPS
  • 启动时运行
  • 重新启动
  • 复制(运行的进程数)
  • 内存
  • 启动前的先前步骤

到目前为止,通过文档中的所有教程,您可能已经在单个进程上运行了像 Uvicorn 这样的服务器程序

部署应用程序时,您可能希望进行一些进程复制,以利用多核并能够处理更多请求。

正如您在上一章有关部署概念中看到的,您可以使用多种策略。

在这里我将向您展示如何将 Gunicorn 与 Uvicorn worker 进程 一起使用。

Info

如果您正在使用容器,例如 Docker 或 Kubernetes,我将在下一章中告诉您更多相关信息:容器中的 FastAPI - Docker。

特别是,当在 Kubernetes 上运行时,您可能不想使用 Gunicorn,而是运行 每个容器一个 Uvicorn 进程,但我将在本章后面告诉您这一点。

Gunicorn with Uvicorn Workers¶

Gunicorn主要是一个使用WSGI标准的应用服务器。 这意味着 Gunicorn 可以为 Flask 和 Django 等应用程序提供服务。 Gunicorn 本身与 FastAPI 不兼容,因为 FastAPI 使用最新的 ASGI 标准

但 Gunicorn 支持充当 进程管理器 并允许用户告诉它要使用哪个特定的 worker类。 然后 Gunicorn 将使用该类启动一个或多个 worker进程

Uvicorn 有一个 Gunicorn 兼容的worker类。

使用这种组合,Gunicorn 将充当 进程管理器,监听 端口 和 IP。 它会将通信传输到运行Uvicorn类的worker进程。

然后与Gunicorn兼容的Uvicorn worker类将负责将Gunicorn发送的数据转换为ASGI标准以供FastAPI使用。

安装 Gunicorn 和 Uvicorn¶

pip install "uvicorn[standard]" gunicorn

这将安装带有standard扩展包(以获得高性能)的 Uvicorn 和 Gunicorn。

Run Gunicorn with Uvicorn Workers¶

接下来你可以通过以下命令运行Gunicorn:

gunicorn main:app --workers 4 --worker-class uvicorn.workers.UvicornWorker --bind 0.0.0.0:80

输出:

[19499] [INFO] Starting gunicorn 20.1.0
[19499] [INFO] Listening at: http://0.0.0.0:80 (19499)
[19499] [INFO] Using worker: uvicorn.workers.UvicornWorker
[19511] [INFO] Booting worker with pid: 19511
[19513] [INFO] Booting worker with pid: 19513
[19514] [INFO] Booting worker with pid: 19514
[19515] [INFO] Booting worker with pid: 19515
[19511] [INFO] Started server process [19511]
[19511] [INFO] Waiting for application startup.
[19511] [INFO] Application startup complete.
[19513] [INFO] Started server process [19513]
[19513] [INFO] Waiting for application startup.
[19513] [INFO] Application startup complete.
[19514] [INFO] Started server process [19514]
[19514] [INFO] Waiting for application startup.
[19514] [INFO] Application startup complete.
[19515] [INFO] Started server process [19515]
[19515] [INFO] Waiting for application startup.
[19515] [INFO] Application startup complete.

让我们看看每个选项的含义:

  • main:app:这与 Uvicorn 使用的语法相同,main 表示名为"main"的 Python 模块,因此是文件 main.py。 app 是 FastAPI 应用程序的变量名称。

    • 你可以想象 main:app 相当于一个 Python import 语句,例如:

       from main import app 
    • 因此,main:app 中的冒号相当于 from main import app 中的 Python import 部分。

  • --workers:要使用的worker进程数量,每个进程将运行一个 Uvicorn worker进程,在本例中为 4 个worker进程。

  • --worker-class:在worker进程中使用的与 Gunicorn 兼容的工作类。

    • 这里我们传递了 Gunicorn 可以导入和使用的类:

      import uvicorn.workers.UvicornWorker
      
  • --bind:这告诉 Gunicorn 要监听的 IP 和端口,使用冒号 (:) 分隔 IP 和端口。

    • 如果您直接运行 Uvicorn,则可以使用--host 0.0.0.0--port 80,而不是--bind 0.0.0.0:80(Gunicorn 选项)。

在输出中,您可以看到它显示了每个进程的 PID(进程 ID)(它只是一个数字)。

你可以看到:

  • Gunicorn 进程管理器 以 PID 19499 开头(在您的情况下,它将是一个不同的数字)。
  • 然后它开始Listening at: http://0.0.0.0:80
  • 然后它检测到它必须使用 uvicorn.workers.UvicornWorker 处的worker类。
  • 然后它启动4个worker,每个都有自己的PID:19511195131951419515

Gunicorn 还将负责管理死进程重新启动新进程(如果需要保持worker数量)。 因此,这在一定程度上有助于上面列表中重启的概念。

尽管如此,您可能还希望有一些外部的东西,以确保在必要时重新启动 Gunicorn,并且在启动时运行它等。

Uvicorn with Workers¶

Uvicorn 也有一个选项可以启动和运行多个 worker进程

然而,到目前为止,Uvicorn 处理worker进程的能力比 Gunicorn 更有限。 因此,如果您想拥有这个级别(Python 级别)的进程管理器,那么最好尝试使用 Gunicorn 作为进程管理器。

无论如何,您都可以像这样运行它:

uvicorn main:app --host 0.0.0.0 --port 8080 --workers 4
输出:
INFO:     Uvicorn running on http://0.0.0.0:8080 (Press CTRL+C to quit)
INFO:     Started parent process [27365]
INFO:     Started server process [27368]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     Started server process [27369]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     Started server process [27370]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     Started server process [27367]
INFO:     Waiting for application startup.
INFO:     Application startup complete.

这里唯一的新选项是 --workers 告诉 Uvicorn 启动 4 个工作进程。

您还可以看到它显示了每个进程的 PID,父进程(这是 进程管理器)的 PID 为27365,每个工作进程的 PID 为:2736827369, 2737027367

部署概念¶

在这里,您了解了如何使用 Gunicorn(或 Uvicorn)管理 Uvicorn 工作进程并行应用程序的执行,利用 CPU 中的 多核,并 能够满足更多请求

从上面的部署概念列表来看,使用worker主要有助于复制部分,并对重新启动有一点帮助,但您仍然需要照顾其他部分:

  • 安全 - HTTPS
  • 启动时运行
  • 重新启动
  • 复制(运行的进程数)
  • 内存
  • 启动之前的先前步骤

容器和 Docker¶

在关于 容器中的 FastAPI - Docker 的下一章中,我将介绍一些可用于处理其他 部署概念 的策略。

我还将向您展示 官方 Docker 镜像,其中包括 Gunicorn 和 Uvicorn worker 以及一些对简单情况有用的默认配置。

在那里,我还将向您展示如何 从头开始构建自己的镜像 以运行单个 Uvicorn 进程(没有 Gunicorn)。 这是一个简单的过程,并且可能是您在使用像 Kubernetes 这样的分布式容器管理系统时想要做的事情。

回顾¶

您可以使用Gunicorn(或Uvicorn)作为Uvicorn工作进程的进程管理器,以利用多核CPU并行运行多个进程

如果您要设置自己的部署系统,同时自己处理其他部署概念,则可以使用这些工具和想法。

请查看下一章,了解带有容器(例如 Docker 和 Kubernetes)的 FastAPI。 您将看到这些工具也有简单的方法来解决其他部署概念。 ✨

实践

使用嗯Gunicorn启动Uvicorn workers

安装库

安装fastapi库

pip install fastapi[standard]

安装uvicorn和gunicorn库 

pip install "uvicorn[standard]" gunicorn

启动服务

将下面代码写入myapp.py文件

import uvicorn
from fastapi import FastAPI

app = FastAPI()


@app.get("/")
def root():
    a = "a"
    b = "b" + a
    return {"hello world": b}


if __name__ == "__main__":
    uvicorn.run(app, host="0.0.0.0", port=8000)

 

 接下来你可以通过以下命令运行Gunicorn:

gunicorn myapp:app --workers 4 --worker-class uvicorn.workers.UvicornWorker --bind 0.0.0.0:80

注意,因为是绑定80端口,所以需要使用管理员权限,因为可能需要使用sudo命令:

sudo gunicorn myapp:app --workers 4 --worker-class uvicorn.workers.UvicornWorker --bind 0.0.0.0:80

启动后显示:

[2024-11-14 11:00:26 +0800] [7942] [INFO] Starting gunicorn 23.0.0
[2024-11-14 11:00:26 +0800] [7942] [INFO] Listening at: http://0.0.0.0:80 (7942)
[2024-11-14 11:00:26 +0800] [7942] [INFO] Using worker: uvicorn.workers.UvicornWorker
[2024-11-14 11:00:26 +0800] [7943] [INFO] Booting worker with pid: 7943
[2024-11-14 11:00:26 +0800] [7944] [INFO] Booting worker with pid: 7944
[2024-11-14 11:00:26 +0800] [7945] [INFO] Booting worker with pid: 7945
[2024-11-14 11:00:26 +0800] [7946] [INFO] Booting worker with pid: 7946
[2024-11-14 11:00:27 +0800] [7943] [INFO] Started server process [7943]
[2024-11-14 11:00:27 +0800] [7943] [INFO] Waiting for application startup.
[2024-11-14 11:00:27 +0800] [7943] [INFO] Application startup complete.
[2024-11-14 11:00:27 +0800] [7945] [INFO] Started server process [7945]
[2024-11-14 11:00:27 +0800] [7945] [INFO] Waiting for application startup.
[2024-11-14 11:00:27 +0800] [7945] [INFO] Application startup complete.
[2024-11-14 11:00:27 +0800] [7944] [INFO] Started server process [7944]
[2024-11-14 11:00:27 +0800] [7944] [INFO] Waiting for application startup.
[2024-11-14 11:00:27 +0800] [7944] [INFO] Application startup complete.
[2024-11-14 11:00:27 +0800] [7946] [INFO] Started server process [7946]
[2024-11-14 11:00:27 +0800] [7946] [INFO] Waiting for application startup.
[2024-11-14 11:00:27 +0800] [7946] [INFO] Application startup complete.
[2024-11-14 11:01:22 +0800] [7942] [INFO] Handling signal: winch

 现在一套FastAPI的Web服务就启动了。在生产环境中,我们一般外面会再放一层nginx。

nginx配置

使用Gunicorn启动5000和5001端口的Uvicorn workers

gunicorn myapp:app --workers 4 --worker-class uvicorn.workers.UvicornWorker --bind 0.0.0.0:5000
gunicorn myapp:app --workers 4 --worker-class uvicorn.workers.UvicornWorker --bind 0.0.0.0:5001

写example.com域名nginx配置

假设域名是example.com, 那么在nginx的原来默认配置文件里,加上一句include example.com.conf:

default_type application/octet-stream;

include example.com.conf;

然后写文件example.com.conf文件:

upstream example.com{
    ip_hash;
    server 127.0.0.1:5000;
    server 127.0.0.1:5001;
}
 
server {
    listen 80;
 
    # optional ssl configuration
 
    listen 443 ssl;
    ssl_certificate /path/to/ssl/pem_file;
    ssl_certificate_key /path/to/ssl/certificate_key;
 
    # end of optional ssl configuration
 
    server_name  example.com;
 
    access_log  /var/log/nginx/access.log;
 
    location / {
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Host $host:$server_port;
        proxy_set_header X-Forwarded-Port $server_port;
	proxy_set_header Host $host:$server_port;
        client_max_body_size    10m;
        client_body_buffer_size 128k;
        proxy_connect_timeout   60s;
        proxy_send_timeout      90s;
        proxy_read_timeout      90s;
        proxy_buffering         off;
        proxy_temp_file_write_size 64k;
        proxy_pass http://example.com;
        proxy_redirect          off;
    }
}

这样一台真正的WEB服务器就启动完成了。在升级扩充服务器的时候,只需要再换更好的服务器, gunicorn启动更多的进程即可。如果扩充了更多服务器,则可以启动5002、5003等更多的端口,nginx这里只要再加上更多的流量均衡服务器配置即可。

 

upstream example.com{
    ip_hash;
    server 127.0.0.1:5000;
    server 127.0.0.1:5001;
    server 192.168.1.101:5002;
    server 10.0.0.12:5003;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2241528.html

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

相关文章

springboot的社区团购系统设计录像

springboot的社区团购系统设计录像 springboot的社区团购系统设计

C++清除所有输出【DEV-C++】所有编辑器通用 | 算法基础NO.1

各位小伙伴们,上一期的保留小数位数教学够用一辈子,有不错的点赞量,可我连一个粉丝铁粉都没有,你愿意做我的第一个铁粉吗?OK废话不多说,开始! 温故与知心 可能你也学过,且是工作者…

【Pytorch】Python random 模块

Python random 模块主要用于生成随机数,是常用的一个包,random 模块实现了各种分布的伪随机数生成器。在训练传统机器学习模型或者深度神经网络模型的过程中经常会用到。要使用 random 函数必须先导入: import random1. random() 使用random(…

Android OpenGLES2.0开发(八):Camera预览

严以律己,宽以待人 引言 终于到该章节了,还记得Android OpenGLES2.0开发(一):艰难的开始章节说的吗?写这个系列的初衷就是因为每次用到GLSurfaceViewCamera预览时,总是CtrlC、CtrlV从来没有研究…

JMX Exporter源码解读+生产环境最佳实践+解决其抓取指标超时问题

文章目录 背景第一版配置-查询所有MBean第二版配置-配置白名单第三版配置-增加Cache第四版配置-修改jmx_exorter源码禁用默认jvm导出第五版配置-基于第四版excludeObjectNameAttributes第六版配置-修改jmx_exorter源码includeObjectNameAttributes配置基于release-1.0.1分支修改…

前端(3)——快速入门JaveScript

参考: 罗大富 JavaScript 教程 | 菜鸟教程 JavaScript 教程 1. JaveScript JavaScript 简称 JS JavaScript 是一种轻量级、解释型、面向对象的脚本语言。它主要被设计用于在网页上实现动态效果,增加用户与网页的交互性。作为一种客户端脚本语言&#…

人工智能:塑造未来的工作与生活

目录 人工智能技术的应用前景与影响 人工智能的历史与现状 人工智能的应用领域 人工智能的前景与挑战 个人视角:人工智能的应用前景与未来 人工智能在生活中的潜力 面对人工智能带来的挑战 我的观点与建议 结语 人工智能技术的应用前景与影响 随着人工智能…

东土国产自主智能控制器,亮相第七届长三角科技成果交易博览会

近日,第七届长三角科技成果交易博览会(以下简称“长三角科交会”)在上海汽车会展中心开幕。为展示嘉定新城产业集聚成果,宣传新城核心区投资环境,新城公司连续第六届参加长三角科交会。 在此次展会上,新城…

AUTOSAR_EXP_ARAComAPI的7章笔记(4)

☞返回总目录 相关总结:本地 / 网络多绑定用例总结 7.3.2 本地/网络多绑定用例 在前一节中,我们看到了的一种多绑定特殊变体,现在来看,也可认为是一种真实情况的变体。 假设有一个与上一章节相似的情景,唯一的区别…

ubuntu将firewall-config导出为.deb文件

firewall-config ubuntu是canonial 公司维护的,用wireshark测过,开机会给他们公司发遥测(开了ufw阻塞所有连接也一样,canonial在里面把代码改了)firewall-config是fedora(爱好者维护,公益版本)自带的防火墙…

LabVIEW中坐标排序与旋转 参见附件snippet程序

LabVIEW中坐标排序与旋转 参见附件snippet程序LabVIEW中坐标排序与旋转 参见附件snippet程序 - 北京瀚文网星科技有限公司 在LabVIEW中处理坐标排序的过程,尤其是按顺时针或逆时针排列坐标点,常见的应用包括处理几何形状、路径规划等任务。下面我将为您…

基于微信小程序的校园超市购物系统设计与实现,LW+源码+讲解

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本超市购物系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息&a…

如何使用EasyExcel生成多列表组合填充的复杂Excel示例

作者:Funky_oaNiu 一、(需求)生成的表格效果:二、搞一个模板文件三、建立对应的表格实体类四、开始填充五、Vue3前端发起请求下载六、官方文档及AI问答 一、(需求)生成的表格效果: 其中只有顶部…

AdaBoost 二分类问题

代码功能 生成数据集: 使用 make_classification 创建一个模拟分类问题的数据集。 数据集包含 10 个特征,其中 5 个是有用特征,2 个是冗余特征。 数据集划分: 将数据分为训练集(70%)和测试集(3…

权限相关知识

1.Linux权限的概念 在说Linux权限的概念之前我来问大家一个问题,你们觉得什么是权限? 权限平时的体现呢,就比如不是校长的亲戚就不能逛办公室,没充会员的爱奇艺看不了VIP影视剧,没成会员的的蛋糕店拿不到会员价等等等…

Python爬虫项目 | 一、网易云音乐热歌榜歌曲

文章目录 1.文章概要1.1 实现方法1.2 实现代码1.3 最终效果 2.具体讲解2.1 使用的Python库2.2 代码说明2.2.1 创建目录保存文件2.2.2 爬取网易云音乐热歌榜单歌曲 2.3 过程展示 3 总结 1.文章概要 学习Python爬虫知识,实现简单的一个小案例,网易云音乐热…

苍穹外卖-后端部分

软件开发整体介绍 前端搭建 在非中文目录中双击nginx.exe然后浏览器访问localhost即可 后端搭建 基础准备 导入初始文件 使用git进行版本控制 创建本地仓库和远程仓库,提交Git 连接数据库 连接数据库把资料中的文件放入运行即可 前后端联调测试 苍穹外卖项目接口文档…

3D电子商务是什么?如何利用3D技术提升销售转化?

在数字化浪潮席卷全球的今天,网上购物已成为消费者日常生活中不可或缺的一部分。然而,尽管其便捷性无可比拟,但传统电商模式中的“看不见、摸不着”问题始终困扰着消费者与商家。商品是否符合期望、尺寸是否合适、颜色是否真实……这些不确定…

EXCEL延迟退休公式

如图: A B为手工输入 C2EOMONTH(A2,B2*12) D2EOMONTH(C2,IF(C2>DATEVALUE("2025-1-1"),INT((DATEDIF(DATEVALUE("2025-1-1"),C2,"m")4)/4),0)) E2EOMONTH(A2,B2*12IF(EOMONTH(A2,B2*12)>DATEVALUE("2025-1-1"),INT(…

OpenSSL 自签名

参考文档:unigui开发人员工作手册2021 参考文章:保姆级OpenSSL下载及安装教程-CSDN博客 下载 Win32/Win64 OpenSSL Installer for Windows - Shining Light Productions 进入后向下拉找到下载位置,建议下载二进制版本的精简版&#xff0c…