Nginx负载均衡与动静分离

一、Nginx负载均衡:

1.概述:

Nginx是一款http服务器软件,支持高达50000个并发连接数的响应。

(1)拥有强大的处理静态资源的能力。

(2)运行稳定。

(3)CPU,内存等资源消耗低。

2.负载均衡实现原理:

(1)通过反向代理实现

(2)反向代理原理:指以代理服务器来接收客户端的请求,然后将请求转发到内部网络的服务器上。将服务器上得到的结果返回给客户端,此时代理服务器对外表现为一个反向代理服务器。对于客户端来说,反向代理服务器相当于目标服务器,只需将反向代理当作目标服务器一样发送请求即可,且客户端不需要进行任何设置。

  • 正向代理:位于客户端和目标服务器之间的代理服务器,为了从目标服务器获得内容,客户端向代理服务器发送一个请求并指定目标服务器,然后代理服务器向目标服务器转交请求并获得内容,然后返回客户端。

  • 正向代理的作用:

    • 突破访问权限,通过代理服务器,可突破自身IP的访问限制,访问外网等。
    • 提高访问速度,代理服务器会设置硬盘缓冲区,并保存部分响应请求,当其他用户再访问相同信息时,由缓冲区传给用户信息,以提高访问速度。
    • 隐藏客户端真实IP。
  • 反向代理作用:

    • 负载均衡,根据所有真实服务器负载情况,将客户端请求发到不同的真实服务器上。
    • 提高访问速度反向代理服务器可以对于静态内容及短时间内有大量访问请求的动态内容提供缓存服务,提高访问速度。
    • 提供安全保障,反向代理服务器可以作为应用层防火墙,为网站提供对基于Web的攻击行为(例如DoS/DDoS)的防护,更容易排查恶意软件等。还可以为后端服务器统一提供加密和SSL加速(如SSL终端代理),提供HTTP访问认证等。

3.Nginx静态处理优势:

(1)动静分离原理:服务端接收客户端的请求中,既有静态资源,也有动态资源,静态资源由nginx提供服务,动态资源由nginx转发至后端。

(2)静态处理优势:

  • 处理静态页面的效率远高于tomcat的处理能力
  • 若tomcat请求量为1000次,则nginx为6000次
  • tomcat吞吐量为0.6M/s,nginx为3.6M/s
  • nginx处理静态能力是tomcat的6倍

二、实验:

1.部署虚拟机192.168.174.15(两个tomcat已部署完)

(1)关闭防火墙,安全机制:

 systemctl stop firewalld
 systemctl disable firewalld
 setenforce 0

(2)安装环境

1.先安装jdk
2.安装 tomcat
cd /opt
tar zxvf apache-tomcat-9.0.16.tar.gz
mv apache-tomcat-9.0.16 /usr/local/tomcat
cp -a /usr/local/tomcat /usr/local/tomcat1
 
3.部署环境变量
vim /etc/profile.d/tomcat.sh
#tomcat1
export CATALINA_HOME1=/usr/local/tomcat
export CATALINA_BASE1=/usr/local/tomcat
export TOMCAT_HOME1=/usr/local/tomcat
 
#tomcat2
export CATALINA_HOME2=/usr/local/tomcat1
export CATALINA_BASE2=/usr/local/tomcat1
export TOMCAT_HOME2=/usr/local/tomcat1
 
 
source /etc/profile.d/tomcat.sh

(3)修改 tomcat1 中的 server.xml 文件,要求各 tomcat 实例配置不能有重复的端口号:

vim /usr/local/tomcat1/conf/server.xml
<Server port="8006" shutdown="SHUTDOWN">		#22行,修改Server prot,默认为8005 -> 修改为8006
<Connector port="8081" protocol="HTTP/1.1"		#69行,修改Connector port,HTTP/1.1  默认为8080 -> 修改为8081
<Connector port="8010" protocol="AJP/1.3" redirectPort="8443" />	#116行,修改Connector port AJP/1.3,默认为8009 -> 修改为8010
修改各 tomcat和tomcat1 实例中的 startup.sh 和 shutdown.sh 文件,添加 tomcat 环境变量
vim /usr/local/tomcat/bin/startup.sh 
# -----------------------------------------------------------------------------
# Start Script for the CATALINA Server
# -----------------------------------------------------------------------------
##添加以下内容
export CATALINA_BASE=$CATALINA_BASE1
export CATALINA_HOME=$CATALINA_HOME1
export TOMCAT_HOME=$TOMCAT_HOME1
 
 
vim /usr/local/tomcat/bin/shutdown.sh
# -----------------------------------------------------------------------------
# Stop script for the CATALINA Server
# -----------------------------------------------------------------------------
export CATALINA_BASE=$CATALINA_BASE1
export CATALINA_HOME=$CATALINA_HOME1
export TOMCAT_HOME=$TOMCAT_HOME1
 
 
修改tomcat1
vim /usr/local/tomcat1/bin/startup.sh 
# -----------------------------------------------------------------------------
# Start Script for the CATALINA Server
# -----------------------------------------------------------------------------
export CATALINA_BASE=$CATALINA_BASE2
export CATALINA_HOME=$CATALINA_HOME2
export TOMCAT_HOME=$TOMCAT_HOME2
 
 
vim /usr/local/tomcat1/bin/shutdown.sh
# -----------------------------------------------------------------------------
# Stop script for the CATALINA Server
# -----------------------------------------------------------------------------
export CATALINA_BASE=$CATALINA_BASE2
export CATALINA_HOME=$CATALINA_HOME2
export TOMCAT_HOME=$TOMCAT_HOME2

(4)启动各 tomcat 中的 /bin/startup.sh

/usr/local/tomcat/bin/startup.sh 
/usr/local/tomcat1/bin/startup.sh 
etstat -antp | grep java
tcp6       0      0 :::8080                 :::*                    LISTEN      7316/java           
tcp6       0      0 :::8081                 :::*                    LISTEN      7372/java           
tcp6       0      0 127.0.0.1:8005          :::*                    LISTEN      7316/java           
tcp6       0      0 127.0.0.1:8006          :::*                    LISTEN      7372/java           
tcp6       0      0 :::8009                 :::*                    LISTEN      7316/java           
tcp6       0      0 :::8010                 :::*                    LISTEN      7372/java 

(5)Tomcat server 配置

mkdir /usr/local/tomcat/webapps/test
vim /usr/local/tomcat/webapps/test/index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>

<head>
<title>JSP test2 page</title>   #指定为 test2 页面
</head>

<body>
<% out.println("动态页面 2,http://www.test2.com");%>
</body>
</html>
vim /usr/local/tomcat/conf/server.xml
#删除前面的 HOST 配置
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
	<Context docBase="/usr/local/tomcat/tomcat1/webapps/test" path="" reloadable="true" />
</Host>
 
/usr/local/tomcat/bin/shutdown.sh 
/usr/local/tomcat/bin/startup.sh


mkdir /usr/local/tomcat1/webapps/test
 
vim /usr/local/tomcat1/webapps/test/index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP test3 page</title>   #指定为 test3 页面
</head>
<body>
<% out.println("动态页面 3,http://www.test3.com");%>
</body>
</html>
vim /usr/local/tomcat1/conf/server.xml
#删除前面的 HOST 配置
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
	<Context docBase="/usr/local/tomcat/tomcat2/webapps/test" path="" reloadable="true" />
</Host>
 
/usr/local/tomcat1/bin/shutdown.sh 
/usr/local/tomcat1/bin/startup.sh

2. 部署虚拟机192.168.174.17(第三个tomcat已开启)

systemctl stop firewalld
systemctl disable firewalld
setenforce 0
1.关闭防火墙,将安装 Tomcat 所需软件包传到/opt目录下
jdk-8u201-linux-x64.rpm
apache-tomcat-9.0.16.tar.gz
 
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
 
 
2.安装jdk
cd /opt
rpm -qpl jdk-8u201-linux-x64.rpm 
rpm -ivh jdk-8u201-linux-x64.rpm 
java -version
 
 
3.设置JDK环境变量
vim /ect/profile.d/java.sh
export JAVA_HOME=/usr/java/jdk1.8.0_201-amd64
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
 
suorce /etc/profile.d/java.sh
java -version
 /etc/profile
 
 
4.安装启动Tomcat
cd /opt
tar zcvf apache-tomcat-9.0.16.tar.gz
mv apache-tomcat-9.0.16 /usr/local/tomcat
##启动tomcat ##
#后台启动
/usr/lcoal/tomcat/bin/startup.sh 
或
/usr/lcoal/tomcat/bin/catalina.sh strat
	
#前台启动
/usr/local/tomcat/bin/catalina.sh run		
 
netatst -antp | grep 8080

(2)部署192.168.174.17的tomcat server

mkdir /usr/local/tomcat/webapps/test
vim /usr/local/tomcat/webapps/test/index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JSP test1 page</title>   #指定为 test1 页面
</head>
<body>
<% out.println("动态页面 1,http://www.test1.com");%>
</body>
</html>
      
vim /usr/local/tomcat/conf/server.xml
#由于主机名 name 配置都为 localhost,需要删除前面的 HOST 配置
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">
	<Context docBase="/usr/local/tomcat/webapps/test" path="" reloadable="true">
	</Context>
</Host>

3.部署192.168.174.16 七层反向代理(nginx服务已开启)(50)

(1)配置:


1.关闭防火墙,将安装nginx所需软件包传到/opt目录下
systemctl stop firewalld
systemctl disable firewalld
setenforce 0    
2.安装依赖包
#nginx的配置及运行需要pcre、zlib等软件包的支持,因此需要安装这些软件的开发包,以便提供相应的库和头文件。
yum -y install pcre-devel.x86_64 zlib-devel.x86_64 openssl-devel.x86_64 gcc gcc-c++ make
 
3.创建运行用户、组(Nginx 服务程序默认以 nobody 身份运行,建议为其创建专门的用户账号,以便更准确地控制其访问权限)
useradd -M -s /sbin/nologin nginx
 
4.编译安装Nginx
cd /opt
tar zxvf nginx-1.18.0.tar.gz -C /opt/
 
cd nginx-1.18.0/
./configure \
--prefix=/usr/local/nginx \							#指定nginx的安装路径
--user=nginx \										#指定用户名
--group=nginx \										#指定组名
--with-http_stub_status_module						#启用 http_stub_status_module 模块以支持状态统计
操作
 
make -j 2 && make install
 
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
 
 
5.启动nginx
/usr/local/nginx/sbin/nginx  #启动nginx,使用绝对路径或者绝对路径

(2)可以给他加入到system中去管理:


vim /lib/systemd/system/nginx.service
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecrReload=/bin/kill -s HUP $MAINPID
ExecrStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
 
chmod 754 /lib/systemd/system/nginx.service
systemctl start nginx.service

(3)配置图片

#准备静态页面和静态图片
mkdir /usr/local/nginx/html/img
cd /usr/local/nginx/html
vim sehun.html
<html>    
  <body> 
     <h1>this is nginx test web</h1>
     <img src="sehun_1.jpg" />
  </body>    
</html>

vim /usr/local/nginx/conf/nginx.conf
......
http {
......
	#gzip on;
	
	#配置负载均衡的服务器列表,weight参数表示权重,权重越高,被分配到的概率越大
	upstream tomcat_server {
		server 192.168.174.17:8080 weight=1;
		server 192.168.174.15:8080 weight=1;
		server 192.168.174.15:8081 weight=1;
	}
	
	server {
		listen 80;
		server_name www.exo.com;
	
		charset utf-8;
	
		#access_log logs/host.access.log main;
		
		#配置Nginx处理动态页面请求,将 .jsp文件请求转发到Tomcat 服务器处理
		location ~ .*\.jsp$ {
			proxy_pass http://tomcat_server;
#设置后端的Web服务器可以获取远程客户端的真实IP
##设定后端的Web服务器接收到的请求访问的主机名(域名或IP、端口),默认HOST的值为proxy_pass指令设置的主机名。如果反向代理服务器不重写该请求头的话,那么后端真实服务器在处理时会认为所有的请求都来自反向代理服务器,如果后端有防攻击策略的话,那么机器就被封掉了。
			proxy_set_header HOST $host;
##把$remote_addr赋值给X-Real-IP,来获取源IP
			proxy_set_header X-Real-IP $remote_addr;
##在nginx 作为代理服务器时,设置的IP列表,会把经过的机器ip,代理机器ip都记录下来
			proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		}
		
		#配置Nginx处理静态图片请求
		location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|css)$ {
			root /usr/local/nginx/html/img;
			expires 10d;
		}
		
		location / {
			root html;
			index index.html index.htm;
		}
......
	}
......
}

  • 测试静态页面效果,浏览器访问:

在这里插入图片描述

  • 测试负载均衡效果:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

三、总结:

1.动静分离是一种优化 Web 服务器性能的方式,它的基本思路是把动态的请求和静态的请求分别交给不同的服务器处理,从而减轻 Web 服务器的负担,提高网站的访问速度和同时响应用户数量。

2.动静分离的具体实现方式一般是将静态资源(如 HTML、CSS、JavaScript、图片、视频等)部署在 CDN 或独立的静态资源服务器上,而动态资源则部署在应用服务器上。这样做的好处是静态资源可以直接从 CDN 或静态资源服务器上获取,而不需要经过应用服务器的处理,从而提高了访问速度和并发访问能力。而应用服务器则专注于处理动态请求,提供业务逻辑的处理和数据查询等服务。

3.负载均衡是一种提高服务器可用性和性能的方式,它的基本思路是将大量的请求分摊到多个服务器上进行处理,从而降低单个服务器的负担和风险,提高整个系统的稳定性和可用性。

4.负载均衡的具体实现方式一般是将多台服务器组成一个服务器集群,通过负载均衡设备或软件来实现请求的分发,把请求转发到不同的服务器上进行处理。负载均衡设备可以根据服务器的配置、负载、响应时间等指标来动态调度请求,从而保证各个服务器的负载均衡,提高系统的运作效率和资源利用率。

.动静分离的具体实现方式一般是将静态资源(如 HTML、CSS、JavaScript、图片、视频等)部署在 CDN 或独立的静态资源服务器上,而动态资源则部署在应用服务器上。这样做的好处是静态资源可以直接从 CDN 或静态资源服务器上获取,而不需要经过应用服务器的处理,从而提高了访问速度和并发访问能力。而应用服务器则专注于处理动态请求,提供业务逻辑的处理和数据查询等服务。

3.负载均衡是一种提高服务器可用性和性能的方式,它的基本思路是将大量的请求分摊到多个服务器上进行处理,从而降低单个服务器的负担和风险,提高整个系统的稳定性和可用性。

4.负载均衡的具体实现方式一般是将多台服务器组成一个服务器集群,通过负载均衡设备或软件来实现请求的分发,把请求转发到不同的服务器上进行处理。负载均衡设备可以根据服务器的配置、负载、响应时间等指标来动态调度请求,从而保证各个服务器的负载均衡,提高系统的运作效率和资源利用率。

5.动静分离和负载均衡都是常见的 Web 服务器优化技术,它们可以相互结合使用,共同提高服务器的性能和可用性。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Unity3D编辑器开发】Unity3D中初次尝试使用PropertyDrawer属性

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 前段时间一直比较忙&#xff0c;没有时间更新博客&#xff0c;…

2011年全国硕士研究生入学统一考试管理类专业学位联考逻辑试题——纯享题目版

&#x1f3e0;个人主页&#xff1a;fo安方的博客✨ &#x1f482;个人简历&#xff1a;大家好&#xff0c;我是fo安方&#xff0c;考取过HCIE Cloud Computing、CCIE Security、CISP、RHCE、CCNP RS、PEST 3等证书。&#x1f433; &#x1f495;兴趣爱好&#xff1a;b站天天刷&…

tomcat接入skywalking

tomcat接入skywalking 一、说明二、步骤2.1 准备java-agent包2.2 tomcat部署2.2.1 下载2.2.2 tomcat修改catalina.sh文件2.2.3 tomcat修改启动端口2.2.4 启动tomcat 三、验证四、问题排查4.1 tomcat的启动日志 一、说明 服务器中已经运行着skywalking&#xff0c;准备在同一台…

7-WebApis-5

Web APIs - 5 目标&#xff1a; 能够利用JS操作浏览器,具备利用本地存储实现学生就业表的能力 BOM操作综合案例 js组成 JavaScript的组成 ECMAScript: 规定了js基础语法核心知识。比如&#xff1a;变量、分支语句、循环语句、对象等等 Web APIs : DOM 文档对象模型&#xff…

2023全云在线联合微软AIGC专场沙龙:人工智能与企业创新,促进创造力的数字化转型

6月29日&#xff0c;由全云在线平台和微软联合主办的人工智能与企业创新&#xff1a;促进创造力的数字化转型——2023AIGC微软专场沙龙在广州天河区正佳万豪酒店举行。 关于2023AIGC微软专场沙龙 GPT翻开了AGI新的一页&#xff0c;也翻开了各行各业的新篇章。 2022年11月30日…

使用Jmeter读取和使用Redis数据

目录 前言 缓存 Redis服务和客户端安装 Jmeter使用Redis 前言 在使用 JMeter 进行性能测试时&#xff0c;有时需要读取和使用 Redis 数据。Redis 是一个开源的内存数据存储系统&#xff0c;常用于缓存、消息队列和数据存储等场景。 缓存 Web系统通常使用数据库来存储数据…

性能测试讲解超详细Jmeter

目录 什么是性能 性能测试的目的 功能测试和性能测试 基准测试 负载测试 稳定性测试 压力测试 并发测试 总结 性能测试指标 响应时间 并发数 吞吐量 点击数 错误率 资源使用率 总结 性能测试流程 性能测试需求分析 性能测试计划和方案 ​编辑性能测试用例​编辑 性…

【MySQL】MySQL数据库,RDBMS 术语,使用说明和报错解决的详细讲解

作者简介&#xff1a; 辭七七&#xff0c;目前大一&#xff0c;正在学习C/C&#xff0c;Java&#xff0c;Python等 作者主页&#xff1a; 七七的个人主页 文章收录专栏&#xff1a; 七七的闲谈 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1f496;&#x1f…

CommonJS 和 ES6 module

本文主要自己觉得要记录的点记录下来,不耽误大家时间&#xff0c;会持续更新。 Module对象 Module {id: xxx/demo/1.js, //加载文件的绝对路径path: xxx/demo,// 加载文件所在目录的绝对路径exports: [Function (anonymous)],filename: xxx/demo/1.js,加载文件的绝对路径load…

蓝桥杯专题-试题版-【圆的面积】【字符串对比】【字母图形】【核桃的数量】

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 &#x1f449;关于作者 专注于Android/Unity和各种游…

Lesson1-1:OpenCV简介

图像处理 学习目标 了解图像的起源知道数字图像的表示 1 图像的起源 1.1 图像是什么 图像是人类视觉的基础&#xff0c;是自然景物的客观反映&#xff0c;是人类认识世界和人类本身的重要源泉。“图”是物体反射或透射光的分布&#xff0c;“像“是人的视觉系统所接受的图在…

【数据库】MySQL 高级(进阶) SQL 语句

文章目录 前提条件一、常用查询1. SELECT&#xff08;显示查询&#xff09;2. DISTINCT&#xff08;不重复查询&#xff09;3. WHERE&#xff08;有条件查询&#xff09;4. AND/OR&#xff08;且/或&#xff09;5. IN &#xff08;显示已知值的字段&#xff09;6. BETWEEN&…

【探索 Kubernetes|作业管理篇 系列 14】StatefulSet 存储状态

前言 大家好&#xff0c;我是秋意零。 在上一篇中&#xff0c;我们讲解了 StatefulSet 的拓扑状态&#xff1b;我们发现&#xff0c;它的拓扑状态&#xff0c;就是顺序启动/删除、Pod 名称编号命名、将 Pod 名称设为 Hostname 名称、通过 Service 无头服务的 DNS 记录访问。 …

4通道AD采集子卡模块有哪些推荐?

FMC134是一款4通道3.2GSPS&#xff08;2通道6.4GSPS&#xff09;采样率12位AD采集FMC子卡模块&#xff0c;该板卡为FMC标准&#xff0c;符合VITA57.4规范&#xff0c;可以作为一个理想的IO模块耦合至FPGA前端&#xff0c;16通道的JESD204B接口通过FMC连接器连接至FPGA的高速串行…

Excel的一些操作:移动列,添加索引

移动列 在 Excel 中移动列的 5 种方法——分步教程 选中某一列&#xff0c;然后鼠标放在边缘&#xff0c;移动到你想移动到的列 添加索引 例如&#xff0c;我想添加的索引列名为“index”&#xff0c;然后选中想要添加序列的行&#xff0c;点击“填充-->录入123序列”

MySQL的体系架构

文章目录 前言MySQL的Server层MySQL的存储引擎1&#xff09;InnoDB 存储引擎2&#xff09;MyISAM 存储引擎3&#xff09;Memory 存储引擎 前言 在学习一种事务之前&#xff0c;我们需要先了解事物的基本组成结构&#xff0c;清楚了事物的基本组成结构之后&#xff0c;我们才能…

水站桶装水订水小程序

水站桶装水订水小程序正式上线&#xff0c;支持多种商品展示形式&#xff0c;会员卡、积分、分销等功能&#xff0c;有需要的老板可以先看演示&#xff01;​​​​​​​​​​​​​​​​​​​​​

nacos批量信息获取-GitNacosConfig

声明&#xff1a;文中涉及到的技术和工具&#xff0c;仅供学习使用&#xff0c;禁止从事任何非法活动&#xff0c;如因此造成的直接或间接损失&#xff0c;均由使用者自行承担责任。 点点关注不迷路&#xff0c;每周不定时持续分享各种干货。 原文链接&#xff1a;众亦信安&a…

基于SpringBoot+vue的旅游管理系统设计与实现

博主介绍&#xff1a; 大家好&#xff0c;我是一名在Java圈混迹十余年的程序员&#xff0c;精通Java编程语言&#xff0c;同时也熟练掌握微信小程序、Python和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…

Playwright 和 Selenium 的区别是什么?

目录 前言 Playwright 和 Selenium 的区别 前言 Playwright和Selenium都是用于自动化Web应用程序测试的工具&#xff0c;它们都提供了编程接口&#xff0c;用于模拟用户操作和执行自动化测试脚本。然而&#xff0c;Playwright和Selenium在一些方面有所不同。 最近有不少同学…