文章目录

    • 1、项目架构图
      • 1.1 架构组件
    • 2、实际实施
        • 2.1 安装docker
        • 2.2 编写dockerfile文件
          • 2.2.1 Prometheus
          • 2.2.2 node_exporter
          • 2.2.3 nginx+vts模块
          • 2.2.4 nginx_exporeter 服务发现文件
          • 2.2.5 maridb dockerfile文件
          • 2.2.6 镜像总数
        • 2.3 具体操作
          • 2.3.1 Prometheus组件
          • 2.3.2 nginx组件
          • 2.3.3 mariadb组件
          • 2.3.4 部署安装grafana
      • 3、监控展示
      • 4、总结
        • 4.1、项目核心意义
        • 4.2 、项目应用场景

1、项目架构图

请添加图片描述

1.1 架构组件

  • MySQL 数据库 (3306端口)+ MySQL Exporter(9104 端口)
  • Nginx (80)+ Nginx VTS Exporter(9913 端口)
  • Prometheus (9090 端口)+node_exporter(9100)
  • Grafana(3000 端口)

2、实际实施

2.1 安装docker
1:安装依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2 #yum-utils 提供了 yum-config-manager
#device mapper 存储驱动程序需要 device-mapper-persistent-data 和 lvm2
#Device Mapper 是 Linux2.6 内核中支持逻辑卷管理的通用设备映射机制,
它为实现用于存储资源管理的块设备驱动提供了一个高度模块化的内核架构。2:设置阿里云镜像源
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 3:安装 Docker-CE
yum install -y docker-cesystemctl stop firewalld.servicesetenforce 0vim /etc/selinux/config
SELINUX=disabledsystemctl start docker.service
systemctl enable docker.service 
------------------镜像加速--------------------------------
tee /etc/docker/daemon.json <<-'EOF'
{"registry-mirrors": ["https://xxxxxxxxx.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload
systemctl restart docker
---------------------网络优化----------------------------------------
vim /etc/sysctl.conf
net.ipv4.ip_forward=1sysctl -p
service network restart
systemctl restart docker
---------------------------------------------------------------docker version    #docker版本信息
Client: Docker Engine - CommunityVersion:           26.1.4API version:       1.45Go version:        go1.21.11Git commit:        5650f9bBuilt:             Wed Jun  5 11:32:04 2024OS/Arch:           linux/amd64Context:           defaultServer: Docker Engine - CommunityEngine:Version:          26.1.4API version:      1.45 (minimum version 1.24)Go version:       go1.21.11Git commit:       de5c9cfBuilt:            Wed Jun  5 11:31:02 2024OS/Arch:          linux/amd64Experimental:     falsecontainerd:Version:          1.6.33GitCommit:        d2d58213f83a351ca8f528a95fbd145f5654e957runc:Version:          1.1.12GitCommit:        v1.1.12-0-g51d5e94docker-init:Version:          0.19.0GitCommit:        de40ad0
[root@localhost docker]# 
2.2 编写dockerfile文件

我们一共需要编写5个dockerfile文件

2.2.1 Prometheus
FROM alpine:latest# 设置工作目录
WORKDIR /opt
COPY prometheus-2.35.0.linux-amd64.tar.gz /opt# 下载并解压Prometheus
RUN tar xf prometheus-2.35.0.linux-amd64.tar.gz && \mv prometheus-2.35.0.linux-amd64 /usr/local/prometheus && \rm prometheus-2.35.0.linux-amd64.tar.gz# 创建Prometheus数据目录
RUN mkdir -p /usr/local/prometheus/data# 配置Prometheus服务
COPY prometheus.service /etc/systemd/system/prometheus.service# 暴露Prometheus默认端口
EXPOSE 9090# 设置启动命令
CMD ["/usr/local/prometheus/prometheus", \"--config.file=/usr/local/prometheus/prometheus.yml", \"--storage.tsdb.path=/usr/local/prometheus/data/", \"--storage.tsdb.retention=15d", \"--web.enable-lifecycle"]
2.2.2 node_exporter
FROM alpine:latest# 创建用户和目录
RUN adduser -D -H -s /sbin/nologin node_exporter# 设置工作目录
WORKDIR /optCOPY node_exporter-1.3.1.linux-amd64.tar.gz /opt# 下载Node Exporter
RUN tar xf node_exporter-1.3.1.linux-amd64.tar.gz && \mv node_exporter-1.3.1.linux-amd64/node_exporter /usr/local/bin/ && \rm -rf node_exporter-1.3.1.linux-amd64.tar.gz node_exporter-1.3.1.linux-amd64# 暴露端口
EXPOSE 9100# 以非root用户运行Node Exporter
USER node_exporter
CMD ["node_exporter"]
2.2.3 nginx+vts模块
FROM alpine:latest# 替换 Alpine 镜像源为国内镜像,加快下载速度
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/' /etc/apk/repositories# 安装编译依赖
RUN apk add --no-cache gcc make libc-dev openssl-dev pcre-dev zlib-dev# 添加源码包
ADD nginx-1.18.0.tar.gz /opt
ADD nginx-module-vts-0.1.18.tar.gz /opt# 查看/opt目录内容,确认解压后的目录名
RUN ls -la /opt# 编译并安装 Nginx(使用通配符匹配模块目录)
RUN mkdir -p /usr/local/nginx-module-vts \&& mv /opt/nginx-module-vts-*/* /usr/local/nginx-module-vts/ \&& cd /opt/nginx-1.18.0 \&& ./configure --prefix=/usr/local/nginx \--add-module=/usr/local/nginx-module-vts \--with-http_stub_status_module \&& make \&& make install \&& ln -s /usr/local/nginx/sbin/nginx /usr/local/bin/nginx \&& adduser -D -H nginx \&& chown -R nginx:nginx /usr/local/nginx/# 安装 bash(如果需要)
RUN apk add --no-cache bash# 暴露端口并设置启动命令
EXPOSE 80EXPOSE 8080CMD ["nginx", "-g", "daemon off;"]
2.2.4 nginx_exporeter 服务发现文件
FROM alpine:latest# 设置工作目录
WORKDIR /optCOPY nginx-vts-exporter-0.10.3.linux-amd64.tar.gz /opt# 下载并解压nginx-vts-exporter
RUN tar -zxvf nginx-vts-exporter-0.10.3.linux-amd64.tar.gz \&& mv nginx-vts-exporter-0.10.3.linux-amd64/nginx-vts-exporter /usr/local/bin/ \&& rm -rf nginx-vts-exporter-0.10.3.linux-amd64.tar.gz nginx-vts-exporter-0.10.3.linux-amd64# 创建systemd服务文件目录
RUN mkdir -p /usr/lib/systemd/system# 添加nginx-exporter服务配置
COPY nginx-exporter.service /usr/lib/systemd/system/# 暴露默认端口
EXPOSE 9913# 启动nginx-exporter服务
CMD ["nginx-vts-exporter", "-nginx.scrape_uri=http://localhost:8080/status/format/json"]
2.2.5 maridb dockerfile文件
FROM mariadb:ltsRUN apt-get update && \apt-get install -y --no-install-recommends curl && \rm -rf /var/lib/apt/lists/*ADD mysqld_exporter-0.14.0.linux-amd64.tar.gz /opt
RUN cp /opt/mysqld_exporter-0.14.0.linux-amd64/mysqld_exporter /usr/local/bin/COPY my.cnf /root/.my.cnfEXPOSE 3306 9104
CMD ["sh", "-c", "mysqld & mysqld_exporter --config.my-cnf=/root/.my.cnf"]
2.2.6 镜像总数

请添加图片描述

【注】:tomcat不需要

2.3 具体操作
2.3.1 Prometheus组件
#创建数据卷
docker volume create promdocker run -itd --name prometheus1 -p 9090:9090 -v prom:/usr/local/prometheus custom-prometheus:2.35.0
docker run -itd --name prometheus-ex -p 9100:9100  node-exporter:latestcd volumes/prom/_data/
vim prometheus.yml #添加以下内容- job_name: nodesmetrics_path: "/metrics"static_configs:- targets:- 192.168.107.186:9100labels:service: master_sit- job_name: "mysql"metrics_path: "/metrics"static_configs:- targets: ["192.168.107.186:9104"]- job_name: nginxmetrics_path: "/metrics"static_configs:- targets:- 192.168.107.186:9913
2.3.2 nginx组件
docker volume create nginxdocker run -itd --name nginx01 -p80:80 -p8080:8080 -v nginx:/usr/local/nginx/conf nginx:1.18.0docker run -itd --name nginx-ex -p9913:9913 nginx-export:0.10.3 #http模块
vhost_traffic_status_zone;
vhost_traffic_status_filter_by_host on;#server模块server {vhost_traffic_status off;listen 8080;allow 127.0.0.1;# allow 192.168.110.128;location /nginx-status {stub_status on;access_log off;}location /status {vhost_traffic_status_display;vhost_traffic_status_display_format html;}}#重启容器
2.3.3 mariadb组件
#启动容器
docker run -itd --name mariadb -p3306:3306 -p9104:9104 mariadb:v1 [root@localhost docker]# docker ps -a
CONTAINER ID   IMAGE                      COMMAND                   CREATED         STATUS                      PORTS                                                                                  NAMES
d9908976de61   mariadb:v1                 "docker-entrypoint.s…"   7 seconds ago   Up 6 seconds                0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 0.0.0.0:9104->9104/tcp, :::9104->9104/tcp   mariadb
15976ff7f1b9   node-expoter:latest        "node_exporter"           3 hours ago     Exited (2) 37 minutes ago                                                                                          prom-ex
bf0686de6ae5   custom-prometheus:2.35.0   "/usr/local/promethe…"   3 hours ago     Exited (0) 37 minutes ago [root@localhost docker]# docker exec -it  --privileged=true mariadb /bin/bash
root@d9908976de61:/# service mariadb start* Starting MariaDB database server mariadbd  ...【注意】:此时可能会出现启动失败的情况
2025-07-16 14:51:04 0 [Note] InnoDB: File './ibtmp1' size is now 12.000MiB.
2025-07-16 14:51:04 0 [Note] InnoDB: log sequence number 37792; transaction id 4
2025-07-16 14:51:04 0 [Note] InnoDB: Loading buffer pool(s) from /var/lib/mysql/ib_buffer_pool
2025-07-16 14:51:04 0 [Note] Plugin 'FEEDBACK' is disabled.
2025-07-16 14:51:04 0 [Note] Plugin 'wsrep-provider' is disabled.
2025-07-16 14:51:04 0 [ERROR] Could not open mysql.plugin table: "Table 'mysql.plugin' doesn't exist". Some plugins may be not loaded
2025-07-16 14:51:04 0 [Note] InnoDB: Buffer pool(s) load completed at 250716 14:51:04
2025-07-16 14:51:04 0 [ERROR] Can't open and lock privilege tables: Table 'mysql.servers' doesn't exist
2025-07-16 14:51:10 0 [Note] Server socket created on IP: '0.0.0.0'.
2025-07-16 14:51:10 0 [Note] Server socket created on IP: '::'.
2025-07-16 14:51:10 0 [ERROR] Fatal error: Can't open and lock privilege tables: Table 'mysql.db' doesn't exist
2025-07-16 14:51:10 0 [ERROR] Aborting
250716 14:51:10 mysqld_safe mysqld from pid file /run/mysqld/mysqld.pid ended#如果启动失败,则输入此条命令
root@d9908976de61:/# mariadb-install-db --user=mysql --basedir=/usr --datadir=/var/lib/mysql#初始情况,默认为没有密码,可以直接进入
root@d9908976de61:/# mariadb -uroot -p
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 33
Server version: 11.8.2-MariaDB-ubu2404 mariadb.org binary distributionCopyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.MariaDB [(none)]> 
2.3.4 部署安装grafana
yum install -y grafana-7.4.0-1.x86_64.rpm
systemctl start grafana-server#查看端口状态
[root@localhost _data]# ss -natp | grep 3000
LISTEN     0      128         :::3000                    :::*                   users:(("grafana-server",pid=39012,fd=11))
[root@localhost _data]# 

3、监控展示

nginx页面展示

请添加图片描述

nginx-vts模块展示

请添加图片描述

nginx-exporter 组件

请添加图片描述

mysql-exporter组件

请添加图片描述

Prometheus监控组件

请添加图片描述

grafana可视化界面

请添加图片描述

4、总结

这个基于 Docker 的 “Prometheus + Grafana 监控 MySQL 与 Nginx” 项目,核心意义在于通过标准化、轻量化的方式,实现对关键服务的可观测性,为系统稳定运行、问题排查和性能优化提供数据支撑。其设计(Docker 容器化、多组件联动、可视化展示)既解决了传统监控的部署复杂、环境依赖等问题,又能满足不同场景下的监控需求。

4.1、项目核心意义
  1. 实现 “可观测性”,降低系统风险
    对于 MySQL(数据存储核心)和 Nginx(流量入口),一旦出现性能瓶颈(如 MySQL 连接数过高、Nginx 响应延迟)或故障(如服务宕机),可能直接影响业务可用性。
    该项目通过 Prometheus 采集关键指标(如 MySQL 的 QPS、Nginx 的请求量),并通过 Grafana 可视化,让运维 / 开发人员能实时感知系统状态,避免 “故障发生后才被动发现” 的问题。
  2. 标准化部署,降低落地门槛
    传统监控工具(如 Prometheus、Grafana)的部署需要手动配置依赖、调整参数,且不同环境(开发 / 测试 / 生产)可能出现配置不一致的问题。
    项目通过 Docker 和 docker-compose 将所有组件(MySQL、Nginx、Exporter、Prometheus、Grafana)打包为容器,实现 “一键启动”,避免环境差异导致的部署问题,同时便于在不同场景中复用。
4.2 、项目应用场景
  1. 中小型企业 / 团队的服务监控(核心场景)
  • 痛点:缺乏专职运维团队,需要 “简单、低成本” 的监控方案,覆盖核心服务(MySQL 数据库、Nginx 反向代理)。

  • 适配性
    项目通过 Docker 容器化,无需复杂的服务器配置,只需一台服务器即可部署全套监控;且监控目标(MySQL、Nginx)本身也可容器化,适合中小型团队的 “轻量化部署” 需求。

  • 具体作用:

    实时监控 Nginx 是否有异常请求(如 4xx/5xx 错误激增,可能是攻击或接口故障);

    监控 MySQL 的连接数、锁等待时间(避免因连接耗尽导致应用无法访问数据库)。

  1. 开发 / 测试环境的 “预监控”
  • 痛点:开发或测试环境中,服务性能问题(如代码导致的 MySQL 频繁慢查询)若未提前发现,可能直接带入生产环境。

  • 适配性
    项目可快速在开发 / 测试环境部署(容器化部署耗时短),提前监控服务在 “模拟流量” 下的表现(如通过 Nginx 模拟用户请求,观察 MySQL 是否扛住压力)。

  • 具体作用:

    开发阶段:通过监控发现代码中的性能问题(如接口调用导致 Nginx 响应延迟);

    测试阶段:验证新功能上线后对 MySQL/Nginx 的影响(如是否新增了慢查询)。

  1. 容器化环境的监控(契合 Docker 生态)
  • 痛点:如果 MySQL、Nginx 本身已通过 Docker 部署(如微服务架构中的容器化服务),传统基于 “物理机 / 虚拟机” 的监控工具可能无法适配(如无法识别容器内的服务指标)。

  • 适配性
    项目本身基于 Docker 构建,Exporter(如 mysql-exporter、nginx-vts-exporter)可直接与容器内的 MySQL/Nginx 通信,采集容器内的指标,完美适配容器化环境

  • 具体作用:

    监控容器内 MySQL 的资源占用(如 CPU、内存使用率),避免容器资源不足导致服务崩溃;

    跟踪 Nginx 容器的流量(如不同容器实例的请求分配是否均衡)。

  1. 临时监控需求(如活动 / 促销期间)
  • 痛点:电商促销、活动推广等场景中,流量可能突然激增,需要临时监控系统稳定性。

  • 适配性:项目通过 docker-compose 可快速启动(无需长期部署),活动结束后可直接停止容器,满足 “临时、按需” 的监控需求

  • 具体作用:

    实时监控 Nginx 的请求量和错误率,避免流量过载导致用户无法访问;

    监控 MySQL 的读写压力,防止订单提交等核心操作因数据库卡顿失败

这个项目的核心价值是 “用轻量化、标准化的方式,让监控从‘复杂且高门槛’变为‘简单可落地’”,无论是中小型企业的日常运维、容器化环境的服务监控,还是临时活动的稳定性保障,都能通过它快速搭建起一套可用的监控体系,最终实现 “提前发现问题、减少故障影响、优化系统性能” 的目标。

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java List 集合详解:从基础到实战,掌握 Java 列表操作全貌

作为一名 Java 开发工程师&#xff0c;你一定在项目中频繁使用过 List 集合。它是 Java 集合框架中最常用、最灵活的数据结构之一。无论是从数据库查询出的数据&#xff0c;还是前端传递的参数列表&#xff0c;List 都是处理这些数据的首选结构。本文将带你全面掌握&#xff1a…

SGMD辛几何模态分解 直接替换Excel运行包含频谱图相关系数图 Matlab语言!

SGMD辛几何模态分解 直接替换Excel运行包含频谱图相关系数图 Matlab语言算法近几年刚提出&#xff0c;知网还没几个人用&#xff0c;你先用&#xff0c;你就是创新&#xff01;算法新颖小众&#xff0c;用的人很少&#xff0c;包含分解图、频谱图、相关系数图&#xff0c;效果如…

Oracle数据泵详解——让数据迁移像“点外卖”一样简单​

​今天我想和大家聊一个数据库领域的“万能搬运工”——Oracle数据泵&#xff08;Data Pump&#xff09;​。相信很多人都有过这样的经历&#xff1a;业务要上线新系统&#xff0c;得把旧库的数据搬到新环境&#xff1b;或者领导突然要一份3年前的历史数据&#xff0c;可不能影…

Leetcode 03 java

爬楼梯算法现在只看明白动态规划&#xff0c;也没有很难哟&#xff01;&#xff01;题目70. 爬楼梯假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f;java题解class Solution {public int climbStairs(…

怎么删除 wps 的右键菜单

打开 WPS 点击 WPS Office 选项卡&#xff0c;点击右侧全局配置》配置和修复工具点击高级功能定制下的都可以关闭和隐藏点击确定就可以了。

C++:list

一&#xff0c;list的介绍1&#xff0c;list初步&#xff08;1&#xff09;list是 C 标准模板库 (STL) 中的一个双向链表容器。它允许在常数时间内进行任意位置的插入和删除操作&#xff0c;但不支持随机访问。&#xff08;2&#xff09;list容器的底层数据结构为带头双向循环链…

深入理解Collections.addAll方法

文章目录深入理解Collections.addAll方法概述方法定义基本用法1. 向List添加元素2. 向Set添加元素3. 添加数组元素与传统add方法的比较使用传统add方法使用Collections.addAll性能考虑注意事项实际应用场景与Collection.addAll的区别最佳实践总结深入理解Collections.addAll方法…

CISP-PTE 练习题(完整一套)

目录 1、SQL注入 2、文件上传 3、文件包含 4、代码审计 5、命令执行 6、端口扫描 7、sql 写 webshell 8、3389 远程桌面利用 1、SQL注入 sqllabs-less-24 二次注入 2、文件上传 没有对文件后缀进行检测&#xff0c;但是对文件类型有检测&#xff0c;需要使用图片头绕…

Vue3入门-计算属性+监听器

&#x1f3e0;个人主页&#xff1a;Yui_ &#x1f351;操作环境&#xff1a;vscode\node.js &#x1f680;所属专栏&#xff1a;Vue3 文章目录1. 计算属性1.1 computed函数1.2 计算属性VS普通函数1.3 计算属性的完整写法2. 监听器3.总结1. 计算属性 计算属性&#xff08;compu…

Linux Swap区深度解析:为何禁用?何时需要?

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言一、Swap区&#xff1a;Linux的"内存救生圈"二、为什么要禁用Swap&#xff1f;性能的隐形杀手三、何时应该使用Swap&#xff1f;不可或缺的场景四、如…

用TensorFlow进行逻辑回归(三)

逻辑回归Logistic regression这个脚本展示如何用TensorFlow求解逻辑回归。 ()ysigmoid(Axb)我们使用低出生重量数据,特别地:y 0 or 1 low birth weightx demographic and medical history dataimport matplotlib.pyplot as pltimport numpy as npimport tensorflow as tfimp…

mingw 编译 assimp v6.0.2 解决编译报错

mingw 编译 assimp v6.0.2 理论上看这个就能满足&#xff1a;在Windows下使用CMakeMinGW64编译Assimp库 环境变量问题 i386 architecture of input file CMakeFiles\assimp.dir/objects.a(assimp.rc.obj)’ is incompatible with i386:x86-64 output collect2.exe: error: ld r…

Windows 11清理C盘方法大全:磁盘清理/禁用休眠/系统还原点/优化大师使用教程

Windows 11清理C盘方法1. 使用磁盘清理工具步骤&#xff1a;按 Win S 搜索“磁盘清理”&#xff0c;打开工具。选择C盘&#xff0c;点击“确定”。勾选需要清理的文件类型&#xff08;如临时文件、系统错误内存转储等&#xff09;&#xff0c;点击“确定”。确认删除操作&…

Rabbitmq Direct Exchange(直连交换机)多个消费者,配置相同的key ,队列,可以保证只有一个消费者消费吗

思考可以保证消费不被重复消费&#xff0c;因为通过轮询一个消息只会投递给一个消费者。但是不是一个消费者消费&#xff0c;而是多个轮询消费在 RabbitMQ 中&#xff0c;如果多个消费者&#xff08;Consumers&#xff09;同时订阅 同一个队列&#xff08;Queue&#xff09;&am…

设计模式是什么呢?

1.掌握设计模式的层次第一层&#xff1a;刚刚学编程不久&#xff0c;听说过什么是设计模式。第二层&#xff1a;有很长时间的编程经验&#xff0c;自己写过很多代码&#xff0c;其中用到了设计模式&#xff0c;但是自己不知道。第三层&#xff1a;学习过设计模式&#xff0c;发…

ThreadLocal使用详解-从源码层面分析

从demo入手看效果 代码Demostatic ThreadLocal tl1 new ThreadLocal();static ThreadLocal tl2 new ThreadLocal();static ThreadLocal tl3 new ThreadLocal();public static void main(String[] args) {tl1.set("123");tl2.set("456");tl3.set("4…

CPO:对比偏好优化—突破大型语言模型在机器翻译中的性能边界

温馨提示&#xff1a; 本篇文章已同步至"AI专题精讲" CPO&#xff1a;对比偏好优化—突破大型语言模型在机器翻译中的性能边界 摘要 中等规模的大型语言模型&#xff08;LLMs&#xff09;&#xff0c;如参数量为 7B 或 13B 的模型&#xff0c;在机器翻译&#xff0…

执行shell 脚本 如何将日志全部输出到文件

在执行 Shell 脚本时&#xff0c;如果需要将 所有输出&#xff08;包括标准输出 stdout 和错误输出 stderr&#xff09; 重定向到日志文件&#xff0c;可以使用以下方法&#xff1a;方法 1&#xff1a;直接重定向&#xff08;推荐&#xff09; /appdata/mysql_backup_dump.sh &…

Postman接口测试实现UI自动化测试

Selenium底层原理 3天精通Postman接口测试&#xff0c;全套项目实战教程&#xff01;&#xff01;运行代码&#xff0c;启动浏览器后&#xff0c;webdriver会将浏览器绑定到特定的端口&#xff0c;作为webdriver的remote server&#xff08;远程服务端&#xff09;&#xff0c;…

CSS动画与变换全解析:从原理到性能优化的深度指南

引言&#xff1a;现代Web动画的技术革命 在当今的Web体验中&#xff0c;流畅的动画效果已成为用户交互的核心要素。根据Google的研究&#xff0c;60fps的动画可以使用户参与度提升53%&#xff0c;而卡顿的界面会导致跳出率增加40%。本文将深入剖析CSS动画&#xff08;animation…