Nginx——反向代理(三/五)

news2025/1/7 20:00:51

目录

  • 1.Nginx 反向代理
    • 1.1.Nginx 反向代理概述
    • 1.2.Nginx 反向代理的配置语法
      • 1.2.1.proxy_pass
      • 1.2.2.proxy_set_header
      • 1.2.3.proxy_redirect
    • 1.3.Nginx 反向代理实战
    • 1.4.Nginx 的安全控制
      • 1.4.1.如何使用 SSL 对流量进行加密
      • 1.4.2.Nginx 添加 SSL 的支持
      • 1.4.3.Nginx 的 SSL 相关指令
        • 1.4.3.1.生成证书
        • 1.4.3.2.开启 SSL 实例
    • 1.5.反向代理系统调优

本文笔记整理自黑马程序员 Nginx 教程,相关资料可在该视频评论区中领取。

1.Nginx 反向代理

Nginx 的反向代理在现代 Web 应用架构中扮演着重要角色,其主要作用包括但不限于以下几个方面,下面将结合具体例子进行说明:

  • 负载均衡:当有多个后端服务器时,Nginx 反向代理可以根据预定义的规则(如轮询、最少连接、IP哈希等)将请求分发到不同的服务器,从而平衡各服务器的负载,提高整体系统的性能和可用性。例如,假设有三台后端服务器A、B、C,Nginx 可以根据配置将请求依次或按照特定比例分发到这三台服务器上,确保每台服务器都能处理适量的请求。
  • 增强安全性:通过隐藏后端服务器的真实IP地址和架构细节,Nginx 反向代理可以有效地保护后端资源免受直接攻击。同时,它还可以集中实施安全策略,如 SSL/TLS 加密、请求过滤等。例如,Nginx 可以配置为仅允许特定 IP 地址或子网段的请求通过,或者基于请求头信息(如 User-Agent、Referer)进行访问控制,从而阻止或限制潜在的恶意访问。
  • 提升缓存效率:Nginx 反向代理可以缓存静态内容和一些动态内容(如页面预渲染版本),减轻后端服务器的压力,同时提高响应速度。当客户端再次访问相同内容时,Nginx 可以直接从缓存中读取并返回给客户端,而无需再次请求后端服务器。例如,一个热门的新闻网站可能有很多用户频繁访问,Nginx 可以缓存这些新闻页面的内容,从而减少对后端服务器的请求次数和响应时间。
  • 实现灵活的请求路由:通过配置不同的路由规则,Nginx 反向代理可以将不同类型的请求导向不同的后端服务,实现微服务架构或者API网关的功能。例如,可以将对 /api 路径的请求转发到后端 API 服务器,将对 /static 路径的请求转发到静态文件服务器。
  • 简化客户端访问:对于包含多个子系统或服务的复杂应用,Nginx 反向代理可以提供一个统一的访问点,使得客户端无需关心后端的复杂结构。客户端只需与 Nginx 反向代理进行通信,即可访问到所需的资源或服务。例如,一个大型电商平台可能包含多个子系统(如商品系统、订单系统、支付系统等),Nginx可以配置为将不同类型的请求转发到相应的子系统上,客户端只需访问 Nginx 的域名或 IP 地址即可。

1.1.Nginx 反向代理概述

关于正向代理和反向代理,我们在前面的章节已经介绍过了,简而言之就是正向代理代理的对象是客户端,反向代理代理的是服务端,这是两者之间最大的区别。Nginx 即可以实现正向代理,也可以实现反向代理。我们先来通过一个小案例演示下 Nginx 正向代理的简单应用。具体需求如下:

在这里插入图片描述

(1)服务端的设置:

http {
  log_format main 'client send request=>clientIp=$remote_addr serverIp=>$host';
	server{
		listen 80;
		server_name	localhost;
		access_log logs/access.log main;
		location {
			root html;
			index index.html index.htm;
		}
	}
}

(2)使用客户端访问服务端,打开日志查看结果:

在这里插入图片描述

(3)代理服务器设置:

server {
        listen  82;
        resolver 8.8.8.8;	# 设置 DNS 的 IP,用来解析 proxy_pass 中的域名
        location / {
        	proxy_pass http://$host$request_uri;
        }
    }

(4)查看代理服务器的 IP (192.168.200.146) 和 Nginx 配置监听的端口 (82)

(5)在客户端配置代理服务器:

在这里插入图片描述

(6)设置完成后,再次通过浏览器访问服务端

在这里插入图片描述

通过对比,上下两次的日志记录,会发现虽然我们是客户端访问服务端,但是如何使用了代理,那么服务端能看到的只是代理发送过去的请求,这样的化,就使用 Nginx 实现了正向代理的设置。但是 Nginx 正向代理,在实际的应用中不是特别多,所以我们简单了解下,接下来我们继续学习 Nginx 的反向代理,这是 Nginx 比较重要的一个功能。

1.2.Nginx 反向代理的配置语法

Nginx 反向代理模块的指令是由 ngx_http_proxy_module 模块进行解析,该模块在安装 Nginx 的时候已经自己加装到 Nginx 中了,接下来我们把反向代理中的常用指令一一介绍下:

  • proxy_pass
  • proxy_set_header
  • proxy_redirect

1.2.1.proxy_pass

该指令用来设置被代理服务器地址,可以是主机名称、IP 地址加端口号形式。

语法proxy_pass URL;
默认值-
位置location
  • URL:为要设置的被代理服务器地址,包含传输协议 (httphttps://)、主机名称或 IP 地址加端口号、URI 等要素。

那么在编写代理服务器的 proxy_pass 的时候,后面的值要不要加 “/”?接下来通过例子来说明刚才我们提到的问题:

server {
	listen 80;
	server_name localhost;
	location / {
		# proxy_pass http://192.168.200.146;
		proxy_pass http://192.168.200.146/;
	}
}

当客户端访问 http://localhost/index.html,效果是一样的。

server{
	listen 80;
	server_name localhost;
	location /server {
		# proxy_pass http://192.168.200.146;		# 末尾不加 / 会把 /server 拼接到被代理的 IP 地址末尾
		proxy_pass http://192.168.200.146/;			# 末尾加 / 则不会把 /server 拼接到被代理的 IP 地址末尾
	}
}

当客户端访问 http://localhost/server/index.html,这个时候,第一个 proxy_pass 就变成了 http://localhost/server/index.html,第二个 proxy_pass 就变成了 http://localhost/index.html,效果就不一样了。

1.2.2.proxy_set_header

该指令可以更改 Nginx 服务器接收到的客户端请求的请求头信息,然后将新的请求头发送给代理的服务器。

语法proxy_set_header field value;
默认值proxy_set_header Host $proxy_host;
proxy_set_header Connection close;
位置http、server、location

需要注意的是,如果想要看到结果,必须在被代理的服务器上来获取添加的头信息。

被代理服务器: [192.168.200.146]

server {
        listen  8080;
        server_name localhost;
        default_type text/plain;
        return 200 $http_username;
}

代理服务器: [192.168.200.133]

server {
        listen  8080;
        server_name localhost;
        location /server {
                proxy_pass http://192.168.200.146:8080/;
                proxy_set_header username TOM;
        }
    }

1.2.3.proxy_redirect

该指令是用来重置头信息中的 “Location” 和 “Refresh” 的值。

语法proxy_redirect redirect replacement;
proxy_redirect default;
proxy_redirect off;
默认值proxy_redirect default;
位置http、server、location

》为什么要用该指令?

服务端[192.168.200.146]

server {
    listen  8081;
    server_name localhost;
    if (!-f $request_filename){
    	return 302 http://192.168.200.146;
    }
}

代理服务端[192.168.200.133]

server {
	listen  8081;
	server_name localhost;
	location / {
		proxy_pass http://192.168.200.146:8081/;
		proxy_redirect http://192.168.200.146 http://192.168.200.133; # 可以防止向客户端暴露服务器端的 IP 地址。
	}
}

该指令的几组选项:

  • proxy_redirect redirect replacement;
    • redirect:目标,Location 的值
    • replacement:要替换的值
  • proxy_redirect default;
    • default:将 location 块的 uri 变量作为 replacement,将 proxy_pass 变量作为 redirect 进行替换
  • proxy_redirect off;:关闭 proxy_redirect 的功能

1.3.Nginx 反向代理实战

在这里插入图片描述

服务器 1、2、3 存在两种情况

  • 第一种情况:三台服务器的内容不一样。
  • 第二种情况:三台服务器的内容是一样。

上述服务器的 IP 地址如下:

  • 代理服务器:192.168.200.133
  • 服务端 1:192.168.200.146:9001
  • 服务器 2:192.168.200.146:9002
  • 服务器 3:192.168.200.146:9003

如果服务器 1、服务器 2 和服务器 3 的内容不一样,那我们可以根据用户请求来分发到不同的服务器。

# 代理服务器
server {
        listen          8082;
        server_name     localhost;
        location /server1 {
                proxy_pass http://192.168.200.146:9001/;
        }
        location /server2 {
                proxy_pass http://192.168.200.146:9002/;
        }
        location /server3 {
                proxy_pass http://192.168.200.146:9003/;
        }
}
# 服务端 server1
server {
        listen          9001;
        server_name     localhost;
        default_type text/html;
        return 200 '<h1>192.168.200.146:9001</h1>'
}
# 服务端 server2
server {
        listen          9002;
        server_name     localhost;
        default_type text/html;
        return 200 '<h1>192.168.200.146:9002</h1>'
}
# 服务端 server3
server {
        listen          9003;
        server_name     localhost;
        default_type text/html;
        return 200 '<h1>192.168.200.146:9003</h1>'
}

如果服务器 1、服务器 2 和服务器 3 的内容是一样的,该如何处理?见后续的负载均衡部分的内容。

1.4.Nginx 的安全控制

关于 Web 服务器的安全是比较大的一个话题,里面所涉及的内容很多,Nginx 反向代理是如何来提升 Web 服务器的安全呢?答案是安全隔离,即通过代理分开了客户端到应用程序服务器端的连接,实现了安全措施。在反向代理之前设置防火墙,仅留一个入口供代理服务器访问。

在这里插入图片描述

1.4.1.如何使用 SSL 对流量进行加密

(1)翻译成大家能熟悉的说法就是将我们常用的 http 请求转变成 https 请求,那么这两个之间的区别简单的来说两个都是 HTTP 协议,只不过 https 是身披 SSL 外壳的 http。https 是一种通过计算机网络进行安全通信的传输协议。它经由 http 进行通信,利用 SSL/TLS 建立全通信,加密数据包,确保数据的安全性。

  • SSL (Secure Sockets Layer) 安全套接层
  • TLS (Transport Layer Security) 传输层安全

(2)上述这两个是为网络通信提供安全及数据完整性的一种安全协议,TLS 和 SSL 在传输层和应用层对网络连接进行加密。总结来说为什么要使用 https:http 协议是明文传输数据,存在安全问题,而 https 是加密传输,相当于 http+ssl,并且可以防止流量劫持。

(3)Nginx 要想使用 SSL,需要满足一个条件即需要添加一个模块 --with-http_ssl_module,而该模块在编译的过程中又需要 OpenSSL 的支持,这个我们之前已经准备好了。

1.4.2.Nginx 添加 SSL 的支持

(1)完成 --with-http_ssl_module 模块的增量添加:

  • 将原有 /usr/local/nginx/sbin/nginx 进行备份
  • 拷贝 Nginx 之前的配置信息
  • 在 Nginx 的安装源码进行配置指定对应模块 ./configure --with-http_ssl_module
  • 通过 make 模板进行编译
  • 将 objs 下面的 Nginx 移动到 /usr/local/nginx/sbin
  • 在源码目录下执行 make upgrade 进行升级,这个可以实现不停机添加新模块的功能

1.4.3.Nginx 的 SSL 相关指令

因为刚才我们介绍过该模块的指令都是通过 ngx_http_ssl_module 模块来解析的。

  • ssl:该指令用来在指定的服务器开启 HTTPS,可以使用 listen 443 ssl,后面这种方式更通用些。
语法ssl on | off;
默认值ssl off;
位置http、server
server{
	listen 443 ssl;
}
  • ssl_certificate:为当前这个虚拟主机指定一个带有 PEM 格式证书的证书。
语法ssl_certificate file;
默认值
位置http、server
  • ssl_certificate_key:该指令用来指定 PEM secret key 文件的路径
语法ssl_ceritificate_key file;
默认值
位置http、server
  • ssl_session_cache:该指令用来配置用于 SSL 会话的缓存
语法ssl_sesion_cache off|none|[builtin[:size]] [shared:name:size]
默认值ssl_session_cache none;
位置http、server
- off:禁用会话缓存,客户端不得重复使用会话
- none:禁止使用会话缓存,客户端可以重复使用,但是并没有在缓存中存储会话参数
- builtin:内置 OpenSSL 缓存,仅在一个工作进程中使用。
- shared:所有工作进程之间共享缓存,缓存的相关信息用 name 和 size 来指定
- ssl_session_timeout:开启 SSL 会话功能后,设置客户端能够反复使用储存在缓存中的会话参数时间。
语法ssl_session_timeout time;
默认值ssl_session_timeout 5m;
位置http、server
  • ssl_ciphers:指出允许的密码,密码指定为 OpenSSL 支持的格式
语法ssl_ciphers ciphers;
默认值ssl_ciphers HIGH:!aNULL:!MD5;
位置http、server

可以使用 openssl ciphers 查看 openssl 支持的格式。

  • ssl_prefer_server_ciphers:该指令指定是否服务器密码优先客户端密码
语法ssl_perfer_server_ciphers on|off;
默认值ssl_perfer_server_ciphers off;
位置http、server
1.4.3.1.生成证书

方式一:使用阿里云/腾讯云等第三方服务进行购买。

方式二:使用 openssl 生成证书

先要确认当前系统是否有安装 openssl

openssl version

安装下面的命令进行生成

mkdir /root/cert
cd /root/cert
openssl genrsa -des3 -out server.key 1024		# 123456
openssl req -new -key server.key -out server.csr	# 123456
cp server.key server.key.org
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

在这里插入图片描述

最终生成的文件如下:

在这里插入图片描述

1.4.3.2.开启 SSL 实例
server {
    listen       443 ssl;
    server_name  localhost;

    ssl_certificate      /root/cert/server.crt;    # 根据实际情况进行配置
    ssl_certificate_key  /root/cert/server.key;		# 根据实际情况进行配置

    ssl_session_cache    shared:SSL:1m;
    ssl_session_timeout  5m;

    ssl_ciphers  HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers  on;

    location / {
        root   html;
        index  index.html index.htm;
    }
}

验证:

在这里插入图片描述

1.5.反向代理系统调优

反向代理值 Buffer 和 Cache:Buffer翻译过来是"缓冲",Cache 翻译过来是"缓存"。

在这里插入图片描述

总结下:

  • 相同点:两种方式都是用来提供 IO 吞吐效率,都是用来提升 Nginx 代理的性能。
  • 不同点:
    • 缓冲主要用来解决不同设备之间数据传递速度不一致导致的性能低的问题,缓冲中的数据一旦此次操作完成后,就可以删除。
    • 缓存主要是备份,将被代理服务器的数据缓存一份到代理服务器,这样的话,客户端再次获取相同数据的时候,就只需要从代理服务器上获取,效率较高,缓存中的数据可以重复使用,只有满足特定条件才会删除。

(1)Proxy Buffer 相关指令

  • proxy_buffering:该指令用来开启或者关闭代理服务器的缓冲区;
语法proxy_buffering on|off;
默认值proxy_buffering on;
位置http、server、location
  • proxy_buffers:该指令用来指定单个连接从代理服务器读取响应的缓存区的个数和大小。
语法proxy_buffers number size;
默认值proxy_buffers 8 4k | 8K;(与系统平台有关)
位置http、server、location
- number:缓冲区的个数
- size:每个缓冲区的大小,缓冲区的总大小就是 number * size
  • proxy_buffer_size:该指令用来设置从被代理服务器获取的第一部分响应数据的大小。保持与 proxy_buffers 中的 size 一致即可,当然也可以更小。
语法proxy_buffer_size size;
默认值proxy_buffer_size 4k | 8k;(与系统平台有关)
位置http、server、location
  • proxy_busy_buffers_size:该指令用来限制同时处于 BUSY 状态的缓冲总大小。
语法proxy_busy_buffers_size size;
默认值proxy_busy_buffers_size 8k|16K;
位置http、server、location
  • proxy_temp_path:当缓冲区存满后,仍未被 Nginx 服务器完全接受,响应数据就会被临时存放在磁盘文件上,该指令设置文件路径。注意 path 最多设置三层。
语法proxy_temp_path path;
默认值proxy_temp_path proxy_temp;
位置http、server、location
  • proxy_temp_file_write_size:该指令用来设置磁盘上缓冲文件的大小。
语法proxy_temp_file_write_size size;
默认值proxy_temp_file_write_size 8K|16K;
位置http、server、location

通用网站的配置

proxy_buffering on;
proxy_buffer_size 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;

根据项目的具体内容进行相应的调节。

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

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

相关文章

win10 VS2019上libtorch库配置过程

win10 VS2019上libtorch库配置过程 0 引言1 获取libtorch2 在VS上配置使用libtorch库3 结语 0 引言 &#x1f4bb;&#x1f4bb;AI一下&#x1f4bb;&#x1f4bb;   libtorch库是一个用于深度学习的C库&#xff0c;是PyTorch的官方C前端。它提供了用于构建和训练深度学习模…

Windows 环境配置 HTTPS 服务实战

一、 环境准备 win10以上操作系统安装 Certbot申请阿里云\腾讯云域名安装 nginx 1.3以上版本 二、Certbot 安装及 SSL 证书生成 Certbot 是一个免费、开源工具&#xff0c;用于自动化在Web服务器上获取和更新SSL/TLS证书。它可以通过Let’s Encrypt服务获取免费的SSL/TLS证书…

【C++数据结构——图】最小生成树(头歌实践教学平台习题) 【合集】

目录&#x1f60b; 任务描述 相关知识 带权无向图 建立邻接矩阵 Prim算法 1. 算法基本概念 2. 算法背景与目标 3. 算法具体步骤 4. 算法结束条件与结果 测试说明 通关代码 测试结果 任务描述 本关任务&#xff1a;编写一个程序求图的最小生成树。 相关知识 为了完成…

11.认识异常

本节目标 1.异常概念与体系结构 2.异常的处理方式 3.异常的处理流程 4.自定义异常类 1.异常的概念与体系结构 1.1异常的概念 在Java中,将程序执行过程中发生的不正常行为称为异常,比如: 1.算术异常 System.out.println(10/0);//执行结果 Exception in thread "mai…

基于海思soc的智能产品开发(camera sensor的两种接口)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 对于嵌入式开发设备来说&#xff0c;除了图像显示&#xff0c;图像输入也是很重要的一部分。说到图像输入&#xff0c;就不得不提到camera。目前ca…

vulnhub靶场-potato(至获取shell)

arp-scan -l 扫描IP 使用御剑端口扫描扫描端口&#xff0c;扫到了80和7120两个端口&#xff0c;其中7120为ssh端口 使用dirb http://192.168.171.134 扫描目录 发现info.php 访问为phpinfo界面 访问192.168.171.134为一个大土豆&#xff0c;没什么用 所以我们从ssh入手 盲…

Flutter:邀请海报,Widget转图片,保存相册

记录下&#xff0c;把页面红色区域内的内容&#xff0c;转成图片后保存到相册的功能 依赖 # 生成二维码 qr_flutter: ^4.1.0 # 保存图片 image_gallery_saver_plus: ^3.0.5view import package:demo/common/index.dart; import package:ducafe_ui_core/ducafe_ui_core.dart; i…

Milvus×合邦电力:向量数据库如何提升15%电价预测精度

01. 全球能源市场化改革下的合邦电力 在全球能源转型和市场化改革的大背景下&#xff0c;电力交易市场正逐渐成为优化资源配置、提升系统效率的关键平台。电力交易通过市场化手段&#xff0c;促进了电力资源的有效分配&#xff0c;为电力行业的可持续发展提供了动力。 合邦电力…

网络层协议之IP数据包层分片随笔

1.全篇内容均在图中&#xff0c;如何分片以及分片举例细节拆解&#xff0c;见下图: 1.1分片公式&#xff1a; 上述公式中有关/8 再*8目的是为了使用8字节对齐&#xff0c;从而使的分片数据包均为8字节整数倍&#xff01; 1.2.ip层数据包分片计算&图解

TDengine + MQTT :车联网时序数据库如何高效接入

现代新能源汽车&#xff0c;作为一种内部系统极为复杂的交通工具&#xff0c;配备了大量传感器、导航设备、应用软件&#xff0c;这些传感器产生的数据都需要上报到车联网平台当中。对于这些车辆的状态数据&#xff08;如车速、发动机转速等&#xff09;、位置数据&#xff08;…

jenkins入门3 --执行一个小demo

1、新建视图 视图可以理解为是item的集合&#xff0c;这样可以将item分类。新建视频可以选择加入已有的item 2、新建item 1)输入任务名称、选择一个类型&#xff0c;常用的是第一个freestyle project 2&#xff09;进行item相关配置&#xff0c;general 设置项目名字,描述,参数…

【Vue.js】监听器功能(EventListener)的实际应用【合集】

目录 &#x1f914;在实际开发过程中&#xff0c;我遇到了一个颇为棘手的小问题 &#x1f60b;解决这个小问题 问题出现的原因剖析 解决方法阐述 问题成功解决&#xff01;​ &#x1f4d6;相关知识总结 基本概念 使用方法 实际应用场景 &#x1f914;在实际开发过程中…

【C++数据结构——线性表】顺序表的基本运算(头歌实践教学平台习题)【合集】

目录&#x1f60b; 任务描述 相关知识 一、线性表的基本概念 二、初始化线性表 三、销毁线性表 四、判定是否为空表 五、求线性表的长度 六、输出线性表 七、求线性表中某个数据元素值 八、按元素值查找 九、插入数据元素 十、删除数据元素 测试说明 通关代码 测…

【C++数据结构——查找】二分查找(头歌实践教学平台习题)【合集】

目录&#x1f60b; 任务描述 相关知识 一、根据键盘输入的一组有序数据建立顺序表 二、顺序表的输出 三、二分查找算法 测试说明 通关代码 测试结果 任务描述 本关任务&#xff1a;实现二分查找的算法。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a; …

20250103在Ubuntu20.04.5的Android Studio 2024.2.1.12中跑通Hello World

20250103在Ubuntu20.04.5的Android Studio 2024.2.1.12中跑通Hello World 2025/1/3 14:06 百度&#xff1a;android studio helloworld android studio hello world kotlin helloword kotlin 串口 no run configurations added android studio no run configurations added 1、…

卸载干净 IDEA(图文讲解)

目录 1、卸载 IDEA 程序 2、注册表清理 3、残留清理 1、卸载 IDEA 程序 点击屏幕左下角 Windows 图标 -> 设置-控制面板->intellij idea 勾选第一栏 Delete IntelliJ IDEA 2022.2 caches and local history&#xff0c;表示同时删除 IDEA 本地缓存以及历史。 Delete I…

【HarmonyOS】鸿蒙应用实现屏幕录制详解和源码

【HarmonyOS】鸿蒙应用实现屏幕录制详解和源码 一、前言 官方文档关于屏幕录制的API和示例介绍获取简单和突兀。使用起来会让上手程度变高。所以特意开篇文章&#xff0c;讲解屏幕录制的使用。官方文档参见&#xff1a;使用AVScreenCaptureRecorder录屏写文件(ArkTS) 二、方…

我的创作纪念日——《惊变128天》

我的创作纪念日——《惊变128天》 机缘收获日常成就憧憬 机缘 时光飞逝&#xff0c;转眼间&#xff0c;我已在这条创作之路上走过了 128 天。回顾起 2024 年 8 月 29 日&#xff0c;我满怀忐忑与期待&#xff0c;撰写了第一篇技术博客《讲解LeetCode第1题&#xff1a;两数之和…

stm32第一次烧录或者上电运行卡死问题分析

问题描述 单片机烧录代码&#xff08;刚上电&#xff09;无法立即运行&#xff0c;必须要复位一次或多次才能运行&#xff1b;跟踪调试会进入HardFault_Handler中断。 问题分析 烧录配置如下图&#xff0c;首先排除配置问题那么该问题就比较让人头大了&#xff0c;理论上&am…

YOLOV8训练好的best.pt模型转best.onnx并部署成python可调用

今天这篇博文是学习大佬作品以后&#xff0c;执行我的需求后的总结&#xff0c;做了一些代码调整&#xff0c;就此记录一下&#xff0c;非常感谢大佬提供如此好的输出。 已知yolov8 训练好的模型一般是pt格式&#xff0c;比如best.pt&#xff0c;现在我期望这个模型可以转成可以…