Nginx从入门到精通(超级详细)

文章目录

  • 一、什么是Nginx
    • 1、正向代理
    • 2、反向代理
    • 3、负载均衡
    • 4、动静分离
  • 二、centos7环境安装Nginx
    • 1、安装依赖
    • 2、下载安装包
    • 3、安装
    • 4、启动
    • 5、停止
  • 三、Nginx核心基础知识
    • 1、nginx核心目录
    • 2、常用命令
    • 3、默认配置文件讲解
    • 4、Nginx虚拟主机-搭建前端静态服务器
    • 5、使用nignx搭建图片-文件服务器
      • (1)root和alias的区别
  • 四、挖掘accessLog日志
    • 1、nginx访问日志的用处
    • 2、Nginx统计站点访问量、高频url统计
    • 3、自定义日志格式,统计接口响应耗时
  • 五、nginx负载均衡
    • 1、常见负载均衡策略
      • (1)节点轮询(默认)
      • (2)weight 权重配置
      • (3)ip_hash(固定分发)
    • 2、节点状态配置
  • 六、Nginx探测后端节点可用性

一、什么是Nginx

  • Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好。使用C语言开发。
  • Nginx专为性能优化而开发,性能是其重要的考量,实现上非常注重效率,能经受高负载的考验,能支持高达50000个并发连接数

1、正向代理

正向代理:代理的是客户端,隐藏的客户端。例如:VPN

  • 客户端和目标服务器之间的服务器,客户端向代理发送一个请求指定目标服务器,然后代理向目标服务器请求并获得内容,并返回给客户端,平时说的代理服务器一般是正向代理服务器
  • 核心:用户知道自己访问的目标服务器
  • 场景:跳板机、访问原来无法访问的网站, 比如国外的一些站点
    在这里插入图片描述

2、反向代理

反向代理:代理的是服务端,隐藏的是服务端。例如:Nginx

  • 客户端和目标服务器之间的服务器,客户端向代理发送一个请求,然后代理向目标服务器请求并获得内容,并返回给客户端。反向代理隐藏了真实的服务器
  • 核心:客户端不知道要访问的目标服务器是哪台服务器,代理会根据一定的策略选择一个真实的服务器进行请求
  • 场景:访问淘宝,知道访问的域名是taobao.com, 但是后面提供数据的具体是什么域名或ip我们是不知道的
    在这里插入图片描述

3、负载均衡

单个服务器解决不了,我们增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们所说的负载均衡。

4、动静分离

为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速度,降低原来单个服务器的压力

二、centos7环境安装Nginx

1、安装依赖

nginx是使用C语言开发的,在安装Nginx前需要安装一些依赖。这些依赖可以给nginx增加很多应用。
这些依赖可以一个个分开安装,也可以一个命令全部搞定。如下:

$ sudo yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel

2、下载安装包

从官网上下载安装包,上传到服务器。或者结果通过wget命令下载到服务器。
我把它下载到了linux的 /usr/local/src/server目录下

$ sudo wget http://nginx.org/download/nginx-1.18.0.tar.gz

然后解压

$ sudo tar -zxvf nginx-1.18.0.tar.gz

3、安装

进入解压目录,检测、编译、安装

$ cd nginx-1.18.0
$ ./configure  # 检测
$ make         # 编译
$ make install # 安装

此次安装使用的是默认的配置安装。
默认安装路径:/usr/local/nginx

4、启动

进入sbin目录,启动

$ ./nginx

查看nginx进程

$ ps -ef | grep "nginx"

或者通过80端口就可以访问了。

5、停止

$ ./nginx -s stop

三、Nginx核心基础知识

1、nginx核心目录

conf  #所有配置文件目录nginx.conf    #默认的主要的配置文件nginx.conf.default  #默认模板html  # 这是编译安装时Nginx的默认站点目录50x.html #错误页面index.html #默认首页logs  # nginx默认的日志路径,包括错误日志及访问日志error.log  #错误日志nginx.pid  #nginx启动后的进程idaccess.log #nginx访问日志sbin  #nginx命令的目录nginx  #启动命令

2、常用命令

$ ./nginx  #默认配置文件启动
$ ./nginx -s reload #重启,加载默认配置文件
$ ./nginx -c /usr/local/nginx/conf/nginx.conf #启动指定某个配置文件
$ ./nginx -s stop #停止
#关闭进程,nginx有master process 和worker process,关闭master即可
$ ps -ef | grep "nginx"  # 查看进程
$ kill -9 PID # 杀死进程

3、默认配置文件讲解

# 每个配置项由配置指令和指令参数 2 个部分构成
#user  nobody;  # 指定Nginx Worker进程运行以及用户组
worker_processes  1;   # #error_log  logs/error.log;  # 错误日志的存放路径  和错误日志
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;#pid        logs/nginx.pid;   # 进程PID存放路径# 事件模块指令,用来指定NginxIO模型,Nginx支持的有select、poll、kqueue、epoll 等。不同的是epoll用在Linux平台上,而kqueue用在BSD系统中,对于Linux系统,epoll工作模式是首选
events { use epoll;# 定义Nginx每个进程的最大连接数, 作为服务器来说: worker_connections * worker_processes,# 作为反向代理来说,最大并发数量应该是worker_connections * worker_processes/2。因为反向代理服务器,每个  并发会建立与客户端的连接和与后端服务的连接,会占用两个连接worker_connections  1024; 
}http {include       mime.types;default_type  application/octet-stream;# 自定义服务日志#log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '#                  '$status $body_bytes_sent "$http_referer" '#                  '"$http_user_agent" "$http_x_forwarded_for"';#access_log  logs/access.log  main;# 是否开启高效传输模式 on开启 off关闭sendfile        on;#减少网络报文段的数量#tcp_nopush     on;#keepalive_timeout  0;# 客户端连接保持活动的超时时间,超过这个时间之后,服务器会关闭该连接keepalive_timeout  65;#gzip  on;# 虚拟主机的配置server {listen       80; # 虚拟主机的服务端口server_name  localhost; #用来指定IP地址或域名,多个域名之间用空格分开#charset koi8-r;#access_log  logs/host.access.log  main;#URL地址匹配location / {root   html;  # 服务默认启动目录index  index.html index.htm; #默认访问文件,按照顺序找}#error_page  404              /404.html;   #错误状态码的显示页面# redirect server error pages to the static page /50x.html#error_page   500 502 503 504  /50x.html;location = /50x.html {root   html;}# proxy the PHP scripts to Apache listening on 127.0.0.1:80##location ~ \.php$ {#    proxy_pass   http://127.0.0.1;#}# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000##location ~ \.php$ {#    root           html;#    fastcgi_pass   127.0.0.1:9000;#    fastcgi_index  index.php;#    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;#    include        fastcgi_params;#}# deny access to .htaccess files, if Apache's document root# concurs with nginx's one#location ~ /\.ht {#    deny  all;#}}# another virtual host using mix of IP-, name-, and port-based configuration##server {#    listen       8000;#    listen       somename:8080;#    server_name  somename  alias  another.alias;#    location / {#        root   html;#        index  index.html index.htm;#    }#}# HTTPS server##server {#    listen       443 ssl;#    server_name  localhost;#    ssl_certificate      cert.pem;#    ssl_certificate_key  cert.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#    }#}
}

4、Nginx虚拟主机-搭建前端静态服务器

什么是虚拟主机?

  • 指在一台物理主机服务器上划分出多个磁盘空间,每个磁盘空间都是一个虚拟主机,每台虚拟主机都可以对外提供Web服务,并且互不干扰,就类似虚拟机
  • 利用虚拟主机把多个不同域名的网站部署在同一台服务器上,节省了服务器硬件成本和相关的维护费用
    虚拟主机的配置如下:
server {listen       80;server_name  aabbcc.com;location / {# aabbcc.com会访问服务器的路径 aabbcc.com:80/t9101.htmlroot   /usr/local/src/nginx/html;index  youyou.html;}
}
server {listen       80;server_name  aabbccdd.com;location / {# aabbccdd.com会访问nginx的root   html;index  youyou.html index.htm;}
}

这里需要在本机配置host域名:aabbcc.com和aabbccdd.com
我们开发的前端项目(例如:vue)就可以部署到这里。

5、使用nignx搭建图片-文件服务器

现在的项目中,是很少在javaweb项目中存放图片和文件。
公司一般会提供图片服务器(fastdfs)或者云厂商的CDN(阿里云的oss存储)

(1)root和alias的区别

Nginx指定文件路径有两种方式root和alias,这两者的用法区别在于对URI的处理方法不同。
区别:

  • alias是一个目录别名的定义,root则是最上层目录的定义。
  • 还有一个重要的区别是alias后面必须要用“/”结束,否则会找不到文件的。而root则可有可无
# alias
location /i/{alias /usr/local/nginx/html/admin/;
}
#若按照上述配置的话,则访问/i/目录里面的文件时,nginx会自动去/usr/local/nginx/html/admin目录找文件。# root 
location /i/ {root /usr/local/nginx/html/admin;
}
#若按照这种配置的话,则访问/i/目录下的文件时,nginx会去/usr/local/nginx/html/admin/i下找文件。

图片服务器配置:

server {listen       80;server_name  aabbccdd.com;location /app/img {alias /usr/local/software/img/;}
}

图片的访问地址如下:http://aabbccdd.com:80/app/img/a.jpg
同一个请求地址,会有如下两种访问地址:
alias : /usr/local/software/img/a.jpg
root : /usr/local/software/img/app/img/a.jpg

四、挖掘accessLog日志

1、nginx访问日志的用处

access.log日志用处

  • 统计站点访问ip来源、某个时间段的访问频率
  • 查看访问最频的页面、Http响应状态码、接口性能
  • 接口秒级访问量、分钟访问量、小时和天访问量

默认配置:

#log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
#                  '$status $body_bytes_sent "$http_referer" '
#                  '"$http_user_agent" "$http_x_forwarded_for"';

案例:

122.70.148.18 - - [04/Aug/2020:14:46:48 +0800] "GET /user/api/v1/product/order/query_state?product_id=1&token=xdclasseyJhbGciOJE HTTP/1.1" 200 48 "https://youyou.com/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36"

解析:

$remote_addr 对应的是真实日志里的122.70.148.18,即客户端的IP。$remote_user 对应的是第二个中杠“-”,没有远程用户,所以用“-”填充。[$time_local]对应的是[04/Aug/2020:14:46:48 +0800]。“$request”对应的是"GET /user/api/v1/product/order/query_state?product_id=1&token=xdclasseyJhbGciOJE HTTP/1.1"。$status对应的是200状态码,200表示正常访问。$body_bytes_sent对应的是48字节,即响应body的大小。“$http_referer” 来源,防盗链接。对应的是”https://youyou.com/“,若是直接打开域名浏览的时,referer就会没有值,为”-“。“$http_user_agent” 对应的是”Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:56.0) Gecko/20100101 Firefox/56.0”。“$http_x_forwarded_for” 对应的是”-“或者空。

日志变量参考:https://www.cnblogs.com/wjoyxt/p/6178731.html

2、Nginx统计站点访问量、高频url统计

查看访问最频繁的前100个IP

awk '{print $1}' access_temp.log | sort -n |uniq -c | sort -rn | head -n 100

统计访问最多的url 前20名

cat access_temp.log |awk '{print $7}'| sort|uniq -c| sort -rn| head -20 | more

命令基础

awk 是文本处理工具,默认按照空格切分,$N 是第切割后第N个,从1开始
sort命令用于将文本文件内容加以排序,-n 按照数值排,-r 按照倒序来排案例的sort -n 是按照第一列的数值大小进行排序,从小到大,倒序就是 sort -rn
uniq 去除重复出现的行列, -c 在每列旁边显示该行重复出现的次数。

3、自定义日志格式,统计接口响应耗时

日志格式增加$request_time

从接受用户请求的第一个字节到发送完响应数据的时间,即包括接收请求数据时间、程序响应时间、输出响应数据时间
$upstream_response_time:指从Nginx向后端建立连接开始到接受完数据然后关闭连接为止的时间
$request_time一般会比upstream_response_time大,因为用户网络较差,或者传递数据较大时,前者会耗时大很多

配置自定义日志格式

log_format  main  '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for" $request_time';
server {listen       80;server_name  aabbcc.com;location / {root   /usr/local/nginx/html;index  xdclass.html;}#charset koi8-r;#access_log  logs/host.access.log  main;
}

统计耗时接口, 列出传输时间超过 2 秒的接口,显示前5条

cat time_temp.log|awk '($NF > 2){print $7}'|sort -n|uniq -c|sort -nr|head -5
备注:$NF 表示最后一列, awk '{print $NF}'

五、nginx负载均衡

负载均衡介绍

  • 负载均衡(Load Balance)
    • 分布式系统中一个非常重要的概念,当访问的服务具有多个实例时,需要根据某种“均衡”的策略决定请求发往哪个节点,这就是所谓的负载均衡,
    • 原理是将数据流量分摊到多个服务器执行,减轻每台服务器的压力,从而提高了数据的吞吐量
  • 负载均衡的种类
    • 通过硬件来进行解决,常见的硬件有NetScaler、F5、Radware和Array等商用的负载均衡器,但比较昂贵的
    • 通过软件来进行解决,常见的软件有LVS、Nginx等,它们是基于Linux系统并且开源的负载均衡策略
    • 目前性能和成本来看,Nginx是目前多数公司选择使用的

配置案例

upstream lbs {server 192.168.0.106:8080;server 192.168.0.106:8081;
}
server {listen 80;server_name aabbcc.com;location /api/ {proxy_pass http://lbs;proxy_redirect default;}
}

http://aabbcc.com:80/api/test/hello

访问流程如下:

浏览器输入:http://aabbcc.com:80/api/v1/getUser
匹配 域名      server_name     aabbcc.com
匹配 端口      listen          80
匹配 资源路径  location        api
默认轮询转发 服务列表 lbs
最终访问的地址:http://192.168.0.106:8080/api/v1/getUser 或者http://192.168.0.106:8081/api/v1/getUser

1、常见负载均衡策略

(1)节点轮询(默认)

  • 简介:每个请求按顺序分配到不同的后端服务器
  • 场景:会造成可靠性低和负载分配不均衡,适合静态文件服务器

(2)weight 权重配置

  • 简介:weight和访问比率成正比,数字越大,分配得到的流量越高
  • 场景:服务器性能差异大的情况使用
upstream lbs {server 192.168.159.133:8080 weight=5;server 192.168.159.133:8081 weight=10; 
}

(3)ip_hash(固定分发)

  • 简介:根据请求按访问ip的hash结果分配,这样每个用户就可以固定访问一个后端服务器
  • 场景:服务器业务分区、业务缓存、Session需要单点的情况
upstream lbs {ip_hash;server 192.168.159.133:8080;server 192.168.159.133:8081;
}

2、节点状态配置

upstream还可以为每个节点设置状态值

  • down 表示当前的server暂时不参与负载
server 192.168.159.133:8080 down; 
  • backup 其它所有的非backup机器down的时候,会请求backup机器,这台机器压力会最轻,配置也会相对低
server 192.168.159.133:8080 backup; 

六、Nginx探测后端节点可用性

  • max_fails 允许请求失败的次数,默认为1.当超过最大次数时就不会请求
  • fail_timeout : max_fails次失败后,暂停的时间,默认:fail_timeout为10s
  • 参数解释
    • max_fails=N 设定Nginx与后端节点通信的尝试失败的次数。
    • 在fail_timeout参数定义的时间内,如果失败的次数达到此值,Nginx就这个节点不可用。
    • 在下一个fail_timeout时间段到来前,服务器不会再被尝试。
    • 失败的尝试次数默认是1,如果设为0就会停止统计尝试次数,认为服务器是一直可用的。
  • 具体什么是nginx认为的失败呢
    • 可以通过指令proxy_next_upstream来配置什么是失败的尝试。
    • 注意默认配置时,http_404状态不被认为是失败的尝试。
upstream lbs {server 192.168.0.106:8080 max_fails=2 fail_timeout=60s;server 192.168.0.106:8081 max_fails=2 fail_timeout=60s;
}server {location /api/ {proxy_pass http://lbs;proxy_next_upstream error timeout http_500 http_503 http_404;}
}

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

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

相关文章

【设计模式】Head First 设计模式——桥模式 C++实现

设计模式最大的作用就是在变化和稳定中间寻找隔离点,然后分离它们,从而管理变化。将变化像小兔子一样关到笼子里,让它在笼子里随便跳,而不至于跳出来把你整个房间给污染掉。 设计思想 桥模式。将抽象部分(业务功能)与实现部分(平…

13.108.Spark 优化、Spark优化与hive的区别、SparkSQL启动参数调优、四川任务优化实践:执行效率提升50%以上

13.108.Spark 优化 1.1.25.Spark优化与hive的区别 1.1.26.SparkSQL启动参数调优 1.1.27.四川任务优化实践:执行效率提升50%以上 13.108.Spark 优化: 1.1.25.Spark优化与hive的区别 先理解spark与mapreduce的本质区别,算子之间(…

机器学习和数据挖掘02-Gaussian Naive Bayes

概念 贝叶斯定理: 贝叶斯定理是概率中的基本定理,描述了如何根据更多证据或信息更新假设的概率。在分类的上下文中,它用于计算给定特征集的类别的后验概率。 特征独立性假设: 高斯朴素贝叶斯中的“朴素”假设是,给定…

《Python魔法大冒险》004第一个魔法程序

在图书馆的一个安静的角落,魔法师和小鱼坐在一张巨大的桌子前。桌子上摆放着那台神秘的笔记本电脑。 魔法师: 小鱼,你已经学会了如何安装魔法解释器和代码编辑器。是时候开始编写你的第一个Python魔法程序了! 小鱼:(兴奋地两眼放光)我准备好了! 魔法师: 不用担心,…

OPPO手机便签数据搬家到华为mate60Pro手机怎么操作

今年8月底,华为上线了本年度的旗舰手机——华为mate60Pro。有不少网友都在抢购这台手机,不过在拿到新手机之后,还有一件重要的事情要做,这就是把旧手机中比较重要的数据,例如图片、短信、通讯录、联系人、便签等数据搬…

【STM32】IIC的初步使用

IIC简介 物理层 连接多个devices 它是一个支持设备的总线。“总线”指多个设备共用的信号线。在一个 I2C 通讯总线中,可连接多个 I2C 通讯设备,支持多个通讯主机及多个通讯从机。 两根线 一个 I2C 总线只使用两条总线线路,一条双向串行数…

说说Omega架构

分析&回答 Omega架构我们暂且称之为混合数仓。 什么是ECS设计模式 在谈我们的解法的时候,必须要先提ECS的设计模式。 简单的说,Entity、Component、System分别代表了三类模型。 实体(Entity):实体是一个普通的对象。通常&#xff0c…

pandas数据分析之数据绘图

一图胜千言,将信息可视化(绘图)是数据分析中最重要的工作之一。它除了让人们对数据更加直观以外,还可以帮助我们找出异常值、必要的数据转换、得出有关模型的想法等等。pandas 在数据分析、数据可视化方面有着较为广泛的应用。本文…

python中super()用法

super关键字的用法 一、概述二、作用三、语法四、使用示例1.通过super() 来调用父类的__init__ 构造方法:2.通过supper() 来调用与子类同名的父类方法2.1 单继承2.2 多继承 一、概述 super() 是python 中调用父类(超类)的一种方法&#xff0…

iPhone 隔空投送使用指南:详细教程

本文介绍了如何在iPhone上使用隔空投送,包括如何在iOS 11到iOS 14的iPhone上启用它、发送文件以及接受或拒绝AirDrop发送给你的文件。对于iOS 7以上的旧款iPhone,提供了另一种方法。 如何打开隔空投送 你可以通过以下两种方式之一启动隔空投送功能:在“设置”应用程序或控…

C#安装“Windows 窗体应用(.NET Framework)”

目录 背景: 第一步: 第二步: 第三步: 总结: 背景: 如下图所示:在Visual Studio Installer创建新项目的时候,想要添加windows窗体应用程序,发现里面并没有找到Windows窗体应用(.NET Framework)模板,快捷搜索也没有发现&#…

解决小程序中textarea ios端样式不兼容的方法

问题描述 ,今天在调试小程序的时候有个需求需要textarea与标题对其,微信开发工具和安卓系统都没有问题 但是ios系统textarea存在内边距。出现不兼容的情况 解决方法:我们看官网的textarea的属性 textarea | uni-app官网 disable-default-p…

路径规划 | 图解Lazy Theta*算法(附ROS C++/Python/Matlab仿真)

目录 0 专栏介绍1 Theta*算法局限性2 Lazy Theta*算法原理3 Theta* VS. Lazy Theta*4 仿真实现4.1 ROS C实现4.2 Python实现4.3 Matlab实现 0 专栏介绍 🔥附C/Python/Matlab全套代码🔥课程设计、毕业设计、创新竞赛必备!详细介绍全局规划(图…

计算机竞赛 基于深度学习的人脸专注度检测计算系统 - opencv python cnn

文章目录 1 前言2 相关技术2.1CNN简介2.2 人脸识别算法2.3专注检测原理2.4 OpenCV 3 功能介绍3.1人脸录入功能3.2 人脸识别3.3 人脸专注度检测3.4 识别记录 4 最后 1 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 基于深度学习的人脸专注度…

苹果Mac系统如何优化流畅的运行?提高运行速度

Mac系统的稳定性和流畅性一直备受大家称赞,这也是大多数人选择Mac的原因,尽管如此,我们仍不时地对Mac进行优化、调整,以使其比以前更快、更流畅地运行。以下是小编分享给各位的Mac优化方法,记得保存哦~ 一、释放被过度…

Java 中数据结构HashSet的用法

Java HashSet HashSet 基于 HashMap 来实现的,是一个不允许有重复元素的集合。 HashSet 允许有 null 值。 HashSet 是无序的,即不会记录插入的顺序。 HashSet 不是线程安全的, 如果多个线程尝试同时修改 HashSet,则最终结果是…

React原理 - React Reconciliation-上

目录 扩展学习资料 React Reconciliation Stack Reconciler【15版本、栈协调】 Stack Reconciler-事务性 事务性带来的弊端: 扩展学习资料 名称 链接 备注 官方文档 Reconciliation – React 英文 stack reconciler Implementation Notes – React 英文…

spark支持深度学习批量推理

背景 在数据量较大的业务场景中,spark在数据处理、传统机器学习训练、 深度学习相关业务,能取得较明显的效率提升。 本篇围绕spark大数据背景下的推理,介绍一些优雅的使用方式。 spark适用场景 大数据量自定义方法处理、类sql处理传统机器…

环保环卫行业案例 | 燕千云助力高能环境搭建数智化IT服务管理体系及平台

当前环境卫生问题在全球已引起前所未有的关注,而促进健康又成为环境与发展所关注的核心问题。随着数字化时代的到来,环保环卫行业呈现出多个发展趋势,随着业务系统规模的不断扩大,信息系统的运维问题也日益突出,需要得…

『Swift社区赠书第 1 期』- 『循序渐进 Vue.js 3.x 前端开发实战』

文章目录 关于作者内容介绍评论区抽三位小伙伴送书活动时间:截止到 2023-08-24 20:00:00 获奖名单 ps. 文末送书,送书为 Swift社区 额外福利 《循序渐进 Vue.js 3.x 前端开发实战》本书包含 42 集视频教学,完整源代码 PPT 课件。 Vue.js 3…