当前位置: 首页 > news >正文

http 502 和 504 的区别

首先看一下概念:

  • 502:作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应。
  • 503:由于临时的服务器维护或者过载,服务器当前无法处理请求。这个状况是临时的,并且将在一段时间以后恢复。如果能够预计延迟时间,那么响应中可以包含一个 Retry-After 头用以标明这个延迟时间。如果没有给出这个 Retry-After 信息,那么客户端应当以处理500响应的方式处理它。  注意:503状态码的存在并不意味着服务器在过载的时候必须使用它。某些服务器只不过是希望拒绝客户端的连接。
  • 504:作为网关或者代理工作的服务器尝试执行请求时,未能及时从上游服务器(URI标识出的服务器,例如HTTP、FTP、LDAP)或者辅助服务器(例如DNS)收到响应。  注意:某些代理服务器在DNS查询超时时会返回400或者500错误。

通俗的来说,nginx作为一个代理服务器,将请求转发到其他服务器或者php-cgi来处理,当nginx收到了无法理解的响应时,就返回502。当nginx超过自己配置的超时时间还没有收到请求时,就返回504错误。

502

上面说到nginx收到了无法理解的响应,什么是无法理解的响应呢?

  • nginx无法与php-fpm进行连接。
  • nginx在连接php-fpm一段时间后发现与php-fpm的连接被断开。

那么什么时候会出现上面的情况呢?

  • php-fpm没有启动,nginx无法将请求交给php-fpm
  • php-fpm运行脚本超时,php-fpm终止了脚本的执行和执行脚本的Worker进程,nginx发现自己与php-fpm的连接断开。

我们逐一实验上述的情况:

php-fpm没有启动

我们关闭php-fpm。

[root@localhost ~]# service php-fpm stopStopping php-fpm:                                          [  OK  ]

刷新页面,发现返回502错误:

screenshot

image

nginx的error_log:

2016/11/06 11:03:01 [error] 3860#0: *37 connect() failed (111: Connection refused) while connecting to upstream, client: 127.0.0.1, server: _, request: "GET /www/muke/index.php HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "127.0.0.1"

php-fpm请求超时

我们首先将php-fpm.conf中的 max_terminate_request 改成5s:

request_terminate_timeout = 5

在php脚本中添加如下语句:

sleep(20);

刷新页面,发现返回502错误:

screenshot

image

查看php-fpm的error_log,有如下日志:

[06-Nov-2016 12:26:07] WARNING: [pool www] child 6669, script '/usr/share/nginx/html/www/muke/index.php' (request: "GET /www/muke/index.php") execution timed out (5.482902 sec), terminating
[06-Nov-2016 12:26:07] WARNING: [pool www] child 6669 exited on signal 15 (SIGTERM) after 647.401329 seconds from start
[06-Nov-2016 12:26:07] NOTICE: [pool www] child 6774 started

查看nginx的error_log,有如下日志:

 2016/11/06 12:26:07 [error] 6228#0: *46 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 127.0.0.1, server: _, request: "GET /www/muke/index.php HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "127.0.0.1"

php-fpm max_children

另外,关于网上说的适当增加max_children参数可能会解决502的问题,我没有实验出来,但是说一下我的实验过程:

关于502与max_children之间的关系,有这样的说法:

max_children最大子进程数,在高并发请求下,达到php-fpm最大响应数,后续的请求就会出现502错误的。

首先我很怀疑这样的说法,因为假设php-fpm的max_children设置为10,即有10个worker子进程。那么假设此时同时有10个并发请求都在占用worker进程进行处理,那么这时第11个请求到来时,就直接拒绝这个请求,连一个等待队列都没有吗?

为了证实我的想法,首先修改max_children的选项如下:

pm.max_children = 1

具体修改过程conf里有详细的说明,pm的值在这里需要为static。

重启php-fpm,查看worker子进程的数量:

[root@localhost ~]# ps aux | grep php-fpm
root      7596  0.0  0.1 245812  3808 ?        Ss  14:10  0:00 php-fpm: master process (/etc/php-fpm.conf)
apache    7597  0.0  0.3 245844  6120 ?        S    14:10  0:00 php-fpm: pool www

确实变为了一个。

为了增加实验效果,在php文件中增加:

sleep(20);

此时同时打开三个页面,同时发3个请求。如果按照上面的说法,只有一个请求被worker进程处理,其余2个请求因为没有多余的worker处理而被拒绝,返回502。但是实验的结果并不是如此,三个页面最终都返回了http code 200。说明是有一个等待队列存在的。那么这个等待队列是什么呢?

在网上搜寻了一段时间,发现有如下的想法:

当backlog队列满了,会出现502错误

什么是backlog队列呢?

首先我们使用ss命令,观察当前活跃的套接字:

[root@localhost ~]# ss -ln
State      Recv-Q Send-Q                                              Local Address:Port                                                Peer Address:Port 
LISTEN      0      128                                                    127.0.0.1:6942                                                          *:*  
LISTEN      0      128                                                            *:56517                                                          *:*   
LISTEN      0      128                                                    127.0.0.1:9000                                                          *:*   
LISTEN      0      50                                                              *:3306                                                          *:*   
LISTEN      0      128                                                    127.0.0.1:63342                                                          *:*  
LISTEN      0      128                                                            :::111                                                          :::*   
LISTEN      0      128                                                            *:111                                                            *:*   
LISTEN      0      128                                                            *:80                                                            *:*   
LISTEN      0      128                                                            :::60816                                                        :::*   
LISTEN      0      128                                                            :::22                                                            :::*   
LISTEN      0      128                                                            *:22                                                            *:*   
LISTEN      0      128                                                    127.0.0.1:631                                                            *:*  
LISTEN      0      128                                                          ::1:631                                                          :::*   
LISTEN      0      100                                                          ::1:25                                                            :::*   
LISTEN      0      100                                                    127.0.0.1:25                                                            *:*

我们观察127.0.0.1:9000这一行:

LISTEN      0      128                                                    127.0.0.1:9000                                                          *:*

关注Recv-Q和Send-Q这两个字段。啥意思呢?我也不懂。参考TCP queue 的一些问题的说法:

LISTEN 状态: Recv-Q 表示的当前等待服务端调用 accept 完成三次握手的 listen backlog 数值,也就是说,当客户端通过 connect() 去连接正在 listen() 的服务端时,这些连接会一直处于这个 queue 里面直到被服务端 accept();Send-Q 表示的则是最大的 listen backlog 数值,这就就是上面提到的 min(backlog, somaxconn) 的值。

其余状态: 非 LISTEN 状态之前理解的没有问题。Recv-Q 表示 receive queue 中的 bytes 数量;Send-Q 表示 send queue 中的 bytes 数值。

其余的细节查看刚才贴出的参考链接。

于是,将php-fpm的conf中的listen.backlog修改为1:

; Set listen(2) backlog. A value of '-1' means unlimited.
; Default Value: -1
listen.backlog = 1

重启php-fpm,查看修改结果:

[root@localhost ~]# ss -ln | grep 9000
LISTEN    0      1                127.0.0.1:9000                    *:*

修改成功。php-fpm目前的backlog为1,即php-fpm的等待队列里只能有一个请求在等待worker进程进行处理。

同时发三个请求,查看结果:

结果为:三个请求又最终成功返回http code 200。与我猜想的不符和啊,不是backlog为1吗?

最后发现下面一段话:

当 queue 满了之后,服务器并不会按照理论所述,不再对 SYN 进行应答,返回 ETIMEDOUT。根据这篇文档的描述,实际情况并非如此,服务器会随机的忽略收到的 SYN,建立起来的连接数可以无限的增加,只不过客户端会遇到延时以及超时的情况。

再实验一次,同时运行ss -ln:

[root@localhost ~]# ss -ln | grep 9000
LISTEN    2      1                127.0.0.1:9000                    *:*

过一段时间后:

[root@localhost ~]# ss -ln | grep 9000
LISTEN    1      1                127.0.0.1:9000                    *:*

发现Recv-Q字段的值为2,过一段时间变为1,说明php-fpm并没有拒绝后两次请求。

那么最终的结论是:适当增加max_children还是有用的,这样的话php-fpm能同时处理的请求增加,客户端的延迟等待时间也会相应的减小。

fastcgi_buffer系列

还有种说法是当nginx的fastcgi的buffer设置过小时,也会有502。

fastcgi_buffer_size 1k;
fastcgi_buffers 2 1k;
fastcgi_busy_buffers_size 1k;

这个自己也没有实验出来,自己理解的是如果buffer开启过小的话,work进程需要将response body中在buffer放不下的部分放到磁盘上,降低了效率,work进程的响应时间会变慢,效率降低。假如此时有高并发的请求,可能会出现502错误。

504

504即nginx超过了自己设置的超时时间,不等待php-fpm的返回结果,直接给客户端返回504错误。但是此时php-fpm依然还在处理请求(在没有超出自己的超时时间的情况下)。

这里有三个相关的配置:

fastcgi_connect_timeout 300; 
# 指定连接到后端FastCGI的超时时间。
fastcgi_send_timeout 300;
# 向FastCGI传送请求的超时时间,这个值是指已经完成两次握手后向FastCGI传送请求的超时时间。 
fastcgi_read_timeout 300;
# 接收FastCGI应答的超时时间,这个值是指已经完成两次握手后接收FastCGI应答的超时时间。

这里我们将fastcgi_read_timeout设置为1s,后端还是延迟20s,观测效果:

screenshot

nginx返回504错误。

相关文章:

http 502 和 504 的区别

首先看一下概念: 502:作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应。503:由于临时的服务器维护或者过载,服务器当前无法处理请求。这个状况是临时的,并且将在一段时间以后恢…...

农业园区气象站

农业园区气象站是一种专为农业生产和科研设计的气象监测设备,它集成了多种传感器和技术,用于实时、准确地监测和记录农业园区内的气象数据。以下是农业园区气象站的主要功能和用处: 一、主要功能 实时监测:农业园区气象站能够实时…...

机器学习学习笔记-20241211

文章目录 空间归纳偏置局部性(Locality)平移不变性(Translation Invariance)空间关系(Spatial Relationships)尺度不变性(Scale Invariance)上下文依赖(Context Dependen…...

【在Linux世界中追寻伟大的One Piece】HTTP Session

目录 1 -> 引入HTTP Session 1.1 -> 定义 1.2 -> 工作原理 1.3 -> 安全性 1.4 -> 超时和失效 1.5 -> 用途 2 -> 模拟session行为 3 -> 实验测试session 1 -> 引入HTTP Session 1.1 -> 定义 HTTP Session是服务器用来跟踪用户与服务器交…...

人工智能|自然语言处理——机器翻译评价指标Bleu和Rouge

在机器翻译任务中,BLEU 和 ROUGE 是两个常用的评价指标,BLEU 根据精确率(Precision)衡量翻译的质量,而 ROUGE 根据召回率(Recall)衡量翻译的质量 BLEU(Bilingual Evaluation Understudy): BLEU是一种用于评…...

【前端】JavaScript中的函数形式参数:预解析与作用域详解

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: 前端 文章目录 💯前言💯示例代码💯1. 形式参数的预解析模拟预解析后的代码 💯2. 函数作用域与子函数的关系代码详解 💯3. 扩展:块作用域与变量提…...

自然语言处理的未来愿景

自然语言处理的未来愿景 在这个信息爆炸的时代,计算机如何理解和生成我们日常使用的语言,已经成为一个引人注目的问题。你有没有想过,为什么智能助手能理解你的指令?又或者,为什么社交媒体上的推荐引擎能够精准地推荐你喜爱的内容?这背后,正是自然语言处理(NLP)在发挥…...

Vmodel环境配置

1.conda create -n pytorch311 python3.11 # 重新进入虚拟环境 source activate # 退出虚拟环境 conda deactivate 最后,重新执行 conda activate pytorch311 pip install torch-2.0.0cpu-cp311-cp311-linux_x86_64 配置Graph-WaveNet网络: pip…...

nvm-windows | node版本管理

问题: npm ERR! notsup Not compatible with your version of node/npm: npm10.9.2 npm ERR! notsup Required: {"node":"^18.17.0 || >20.5.0"} npm ERR! notsup Actual: {"npm":"9.5.0","node":"v18.…...

GLM-4V-Flash:智谱AI引领多模态视觉模型新潮流

点击访问 chatTools 免费体验GPT最新模型,包括o1推理模型、GPT4o 和Claude等模型! 随着人工智能技术的不断进步,多模态模型逐渐成为行业关注的焦点。智谱AI作为国内领先的人工智能公司,再次以创新姿态推出了首款免费多模态视觉模型…...

二、ubuntu单盘改软raid1

将单盘系统转换为软 RAID 1 是一个复杂的过程,尤其是在已经有数据的生产环境中进行时。这个过程涉及备份现有数据、创建 RAID 阵列、迁移数据以及更新引导加载程序(如 GRUB)。以下是详细的步骤指南: 前提条件 备份数据&#xff…...

「Mac玩转仓颉内测版45」小学奥数篇8 - 排列组合计算

本篇将通过 Python 和 Cangjie 双语讲解如何计算排列与组合。这道题目旨在让学生学会使用排列组合公式解决实际问题,并加深对数学知识和编程逻辑的理解。 关键词 小学奥数Python Cangjie排列与组合 一、题目描述 编写一个程序,计算从 n 个不同元素中取…...

【零成本抽象】基本概念与在C++中的实现

零成本抽象概念是由 Bjarne Stroustrup 提出的,他在 1994 年的著作中就有相关设想,2016 年其在 C++ 大会登台演讲时,明确阐述了 C++ 中的 “零成本抽象” 这一理念。 一、零成本抽象概念 Bjarne Stroustrup提出的零成本抽象概念,是指在编程中使用高级抽象机制时,不会产生…...

域渗透入门靶机之HTB-Cicada

easy难度的windows靶机 信息收集 端口探测 nmap -sT --min-rate 10000 -p- 10.10.11.35 -oA ./port 发现开放了53,88,389等端口,推测为域控 进一步信息收集,对爆破的端口进行更加详细的扫描 小tips:对于众多的端口&…...

(仓颉) Cangjie 刷力扣基础语法小结

文章目录 🧓官方资料🧓力扣经典前 3 题🕷️[1. 两数之和 - 力扣(LeetCode)](https://leetcode.cn/problems/two-sum/description/)🕷️[2. 两数相加 - 力扣(LeetCode)](https://leet…...

Phoenix5.1.3安装

环境说明 准备三台服务器,分别为:bigdata141(作为HBase主节点)、bigdata142、bigdata143,已经搭建好HBase集群,我这边HBase版本为2.2.7再准备一台服务器,bigdata144,可作为Phoenix客…...

深入理解 Apache Shiro:安全框架全解析

亲爱的小伙伴们😘,在求知的漫漫旅途中,若你对深度学习的奥秘、JAVA 、PYTHON与SAP 的奇妙世界,亦或是读研论文的撰写攻略有所探寻🧐,那不妨给我一个小小的关注吧🥰。我会精心筹备,在…...

机器学习:全面学习路径指南

摘要: 本文精心规划了一条从入门到精通机器学习的学习路线,详细涵盖了基础理论构建、核心技术栈掌握、主流算法学习、实践项目锻炼以及前沿领域探索等多个关键阶段。通过逐步深入各个层面,介绍必备的数学知识、编程工具、经典与现代机器学习算…...

二叉树交换相关算法题|递归/非递归交换所有节点左右子树(C)

交换左右子树 设树B是一棵采用链式结构存储的二叉树,编写一个把树B中所有节点的左右子树进行交换的函数 算法思想 采用递归算法实现交换二叉树的左右子树,首先交换root节点左孩子的左右子树,然后交换root节点右孩子的左右子树,…...

什么是纯虚函数?什么是抽象类?纯虚函数和抽象类在面向对象编程中的意义是什么?

纯虚函数 纯虚函数是一个在基类中声明但不实现的虚函数。它的声明方式是在函数声明的末尾添加 0。这意味着这个函数没有提供具体的实现,任何继承这个基类的派生类都必须提供这个函数的实现,否则它们也会变成抽象类,无法实例化。 示例&#…...

高效利用资源:分布式有状态服务的高可靠性设计

在分布式系统设计中,实现有状态服务的高可靠性通常采用主备切换的方式。当主服务停止工作时,备服务接管任务,例如通过Keepalive实现VIP的切换以保证可用性。然而,这种方式存在资源浪费的问题,因为备服务始终处于空转状…...

网络安全中的 SOC 是什么?

当今世界,网络威胁日益增多,确保网络安全已成为各种规模企业的首要任务。网络安全讨论中经常出现的一个术语是 SOC,即安全运营中心的缩写。但网络安全中的 SOC 是什么呢? SOC在防御网络威胁、管理安全事件和全天候监控系统方面发…...

QtCreator UI界面 菜单栏无法输入中文

如下图红色所示的区域,直接输入是无法输入中文的: 解决方法:在右边的属性值里输入即可 也可以参考这位同学的解决方法:友情链接...

圆桌对话:AI数字笔迹,数字化时代的重要驱动力 | 2024 AI+数字笔迹创新应用发展论坛

12月6日,以“聚焦创新应用,AI引领赋能”为主题的2024 AI数字笔迹创新应用发展论坛在重庆两江新区举办。本届论坛由重庆市大数据应用发展管理局和重庆两江新区管理委员会联合指导,重庆亲笔签数字科技有限公司主办。 论坛现场一场题为“数字化…...

Tablesaw封装Plot.ly实现数据可视化

上文介绍tablesaw的数据处理功能,本文向你展示其数据可视化功能,并通过几个常用图表示例进行说明。 Plot.ly包装 可视化是数据分析的重要组成部分,无论你只是“查看”新数据集还是验证机器学习算法的结果。Tablesaw是一个开源、高性能的Java…...

在Linux(ubuntu22.04)搭建rust开发环境

1.安装rust 1.安装curl: sudo apt install curl 2.安装rust最新版 curl --proto ‘https’ --tlsv1.2 https://sh.rustup.rs -sSf | sh 安装完成后出现:Rust is installed now. Great! 重启当前shell即可 3.检验是否安装成功 rustc --version 结果出现&…...

Less和SCSS,哪个更好用?

前言 Less 和 SCSS 都是流行的 CSS 预处理器,它们的目的都是扩展 CSS 的功能,使样式表更具组织性、可维护性和可重用性。虽然它们有许多相似之处,但在语法、特性和工作方式上也存在一些差异。 Less Less 是一种动态样式表语言,…...

vuex作用及五大组成部分

Vuex 是 Vue.js 官方的状态管理工具,用于管理应用中的全局状态。它的作用主要是解决组件间的状态共享和数据同步问题,特别是在组件复杂嵌套或兄弟组件通信中提供清晰、结构化的解决方案。 Vuex 的作用 集中管理状态: 将组件的共享状态抽取出…...

vue借助西瓜播放器插件实现视频播放

西瓜播放器官网 西瓜播放器 安装 npm install xgplayer 使用案例 vue3为例 <script setup lang"ts"> import Player from xgplayer import { ref, unref, onMounted, watch, onBeforeUnmount, nextTick } from vue import xgplayer/dist/index.min.csscon…...

PHP无法读取.env的配置变量原因

今天帮一个客户在一台服务器配置laravel&#xff0c;在安装好宝塔后&#xff0c;配置了php环境&#xff0c;把laravel项目上传&#xff0c;并且在根目录的.env上配置好数据库等信息后&#xff0c;发现无法正常使用 通过排查发现.env的变量无法正常获取&#xff0c;排查了好久后…...

Android 15(V)新功能适配,雕琢移动细节之美

Android 15&#xff0c;内部代号为Vanilla Ice Cream&#xff0c;是Android移动操作系统的最新主要版本&#xff0c;于2024年2月16日在开发者预览版1中发布。Android 15源代码于 2024年9月4日发布。Android 15稳定版于2024年10月15日发布。 以下是针对 Android 15&#xff08;…...

Qt自定义类型在信号槽中的使用

引言 示例自定义数据类型信号槽效果检查代码注册自定义类型信号槽使用QVariant传递参数总结附加绑定信号槽,传递的参数如果是自定义类型的变量,槽函数不会响应。为什么呢?是因为自定义类型没有被写入元对象系统,对于Qt来说,不认识这个数据类型,Qt是以事件来驱动的,信号槽…...

自适应卡尔曼滤波(包括EKF、UKF、CKF等)的创新思路——该调什么、不该调什么

在调节自适应卡尔曼滤波时&#xff0c;需要注意的参数和矩阵都对滤波器的性能有直接影响。本文给出详细的说明&#xff0c;包括相关公式和 MATLAB 代码示例 文章目录 需要调节的参数1. **过程噪声协方差矩阵 Q Q Q**&#xff1a;2. **测量噪声协方差矩阵 R R R**&#xff1a;…...

Ape-DTS:开源 DTS 工具,助力自建 MySQL、PostgreSQL 迁移上云

Ape-DTS 是一款高效、轻量级且功能强大的开源工具&#xff0c;专注于解决数据迁移、同步、校验、订阅与加工的需求。无论是将自建的 MySQL/PostgreSQL 数据库迁移到云端&#xff0c;还是在不同数据库间进行数据迁移&#xff0c;Ape-DTS 都能为您提供便捷且可靠的解决方案。它特…...

SpringBoot中使用MyBatis-Plus详细介绍

目录 一、MyBatis-Plus的使用步骤 1.引入MybatisPlus的起步依赖 2.定义Mapper&#xff08;也叫dao&#xff09;层的接口 3.MyBatis-Plus中常用注解 4. 使用MyBatis-Plus时要做如下配置 5.条件构造器 Wrapper 一、MyBatis-Plus的使用步骤 1.引入MybatisPlus的起步依赖 My…...

Buuctf Web题解

写在前面&#xff0c; 本人小白一枚&#xff0c;记录一下web做题过程&#xff0c;大部分为个人理解可能有些地方写的不够明确还请见谅。当然由于刚入手web题&#xff0c;所以有些题会没有思路&#xff0c;这时会参考其他大佬的题解过程。本文会一直更新&#xff0c;由于是第一次…...

Linux 支持多个spi-nor flash

1. 需求 通常在嵌入式开发过程中可能会遇到需要再同一个SPI总线上挂载多个spi nor flash才能满足存储需求。 2. 技术简介 对于spi-nor flash驱动通常不需要驱动开发人员手搓&#xff0c;一般内核会有一套固定的驱动&#xff0c;而且走的是内核的MTD子系统那一套&#xff0c;市…...

APP、小程序对接聚合广告平台,有哪些广告变现策略?

开发者对接聚合广告平台&#xff0c;可以让自身流量价值最大化&#xff0c;获得更多的广告曝光机会&#xff0c;对接单一的广告联盟容易造成广告填充不足&#xff0c;收益不稳定的问题。#APP广告变现# APP开发者根据应用的生命周期、用户特征和产品定位&#xff0c;选择最适合…...

RPC设计--应用层缓冲区,TcpBuffer

为什么需要应用层的buffer 为了方便数据处理&#xff0c;从fd上直接读写然后做包的组装、拆解不够方便方便异步发送&#xff0c;将数据写到应用层buffer后即可返回&#xff0c;让epoll即event_loop去异步发送。提高发送效率&#xff0c;多个小包可合并发送 buffer 设计 可以…...

微服务的问题

1.创建maven项目 然后配置对应的maven地址 2.创建父工程 删掉其中的src文件 在父pom中进行版本依赖和管理 如下图所示 3.在子文件中进行添加依赖 然后刷新maven进行下载...

开源模型应用落地-知识巩固-如何正确搭建生产级AI服务(一)

一、前言 将大语言模型集成至vllm,能够显著实现推理加速,让模型在处理任务时更加高效快捷,极大地提升了响应速度,减少用户等待时间。具体而言,一方面它能大幅提高吞吐量,vLLM 借助 PagedAttention巧妙地对attention中缓存的张量进行高效管理,从而达成比 HuggingFace Tra…...

Uniapp Android SpringBoot3 对接支付宝支付(最新教程附源码)

Uniapp Android SpringBoot3 对接支付宝支付&#xff08;最新教程附源码&#xff09; 1、效果展示2、后端实现2.1 引入支付宝SDK依赖 pom.xml2.2 配置 application.yml2.3 支付宝相关代码2.3.1 AlipayConfig.java2.3.2 ZfbPayConfig.java2.3.3 支付接口2.3.4 支付回调处理接口&…...

SpringSpringBoot常用注解

Spring 和 Spring Boot 是 Java 开发中广泛使用的框架&#xff0c;它们提供了许多注解来简化配置和开发过程。以下是一些 Spring 和 Spring Boot 中常用的注解&#xff1a; Spring 常用注解 ‌Component‌ 用于标注一个类为 Spring 容器的一个组件&#xff0c;Spring 会自动…...

【机器人】振动分析和控制工具之Bode图

Bode 图完整介绍 Bode 图由两个部分组成&#xff1a; 幅值图 (Magnitude Plot)&#xff1a;描述系统对不同频率输入信号的增益大小&#xff08;幅值响应&#xff09;。相位图 (Phase Plot)&#xff1a;描述系统输出信号相对于输入信号的相位差。 Bode 图的横轴是频率&#x…...

基于SpringBoot的“外卖点餐系统”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“外卖点餐系统”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统功能图 用户功能界面 订单管理界面 配送单管理…...

第十七章 使用 MariaDB 数据库管理系统

1. 数据库管理系统 数据库是指按照某些特定结构来存储数据资料的数据仓库。在当今这个大数据技术迅速崛起的年代&#xff0c;互联网上每天都会生成海量的数据信息&#xff0c;数据库技术也从最初只能存储简单的表格数据的单一集中存储模式&#xff0c;发展到了现如今存储海量…...

sql多表联查图文

内连接&#xff08;INNER JOIN&#xff09; 语法&#xff1a; SELECT 列名 FROM 表1 INNER JOIN 表2 ON 表1.列名 表2.列名;示例&#xff1a; SELECT 列名 FROM 表1 LEFT JOIN 表2 ON 表1.列名 表2.列名;左外连接&#xff08;LEFT JOIN&#xff09; 语法 SELECT 列名 FROM…...

网络安全——防火墙

基本概念 防火墙是一个系统&#xff0c;通过过滤传输数据达到防止未经授权的网络传输侵入私有网络&#xff0c;阻止不必要流量的同时允许必要流量进入。防火墙旨在私有和共有网络间建立一道安全屏障&#xff0c;因为网上总有黑客和恶意攻击入侵私有网络来破坏&#xff0c;防火…...

单独测试 pyautogui 的鼠标点击功能,确保它能够在当前环境中正常工作,鼠标自动点击的录制回放功能

感谢您提供的详细日志信息。根据您的反馈&#xff0c;问题可能出在 pyautogui 没有正确获取鼠标焦点或无法在预期的位置执行点击操作。我们将采取以下步骤来进一步诊断和解决这个问题&#xff1a; 1. **确保 pyautogui 正确执行点击操作**&#xff1a; - 我们将添加更多的调…...

图片底部空白缝隙解决法方案(CSS)

当我想实现一个垂直轮播图时&#xff0c;图片底部会出现一个空白缝隙导致切换轮播图片显示不完整。 这里可以用两个方法解决 一、给图片添加(垂直对齐)vertical-align:baseline|middle|top; vertical-align属性的值可以是 &#xff08;1&#xff09;关键字值:baseline|midd…...