【运维知识进阶篇】集群架构-Nginx基础(安装+启动+配置+多业务实现+日志管理)

news2024/11/23 7:30:57

本篇文章介绍下Nginx有关内容,Nginx是一个开源且高性能、可靠的Http Web服务、代理服务。

开源:直接获取源代码,高性能:支持海量并发,可靠:服务稳定

Web服务有很多,选择Nginx是因为他的轻量化,功能模块少(源代码仅保留http与核心模块代码,其余不够核心代码的作为插件来安装)代码模块化,对于开发人员友好。 


Nginx与Apache区别

1、Nginx采用Epool网络模型,I/O异步非阻塞,效率高,Apache采用Select模型

2、Nginx处理静态文件好,静态处理性能比Apache高三倍以上

静态文件:图片 视频 js css文件 (放到存储服务器NFS)

动态数据:文字 个人信息 家庭住址 (放到数据库)

3、Nginx可以在不间断服务的情况下进行版本升级,社区活跃、各种高性能模块出品迅速,所以我们需要用稳定版本。

4、Apache的rewrite比nginx强大,在rewrite频繁的情况下,用Apache,Apache成熟稳定,bug比较少,Apache对PHP配置比较简单,Nginx需要配合其他后端使用。

Nginx安装方式

1、yum安装

2、编译安装,通过编译源代码安装

yum安装,包含安装包的有两个仓库。

一个是epel仓库                #版本较低,配置不宜读

二是通过官网的仓库安装 #可以选择版本较新,配置易读

Nginx安装流程

第一步:安装官网yum源,去官网(nginx news)

 

[nginx-stable]                     #仓库名称
name=nginx stable repo             #名称
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/    #官网连接地址
gpgcheck=1                         #检查nginx的完整性,通过MD5校验方式         
enabled=1                          #是否开启此仓库,1为开启,0为关闭,适用于临时关闭
gpgkey=https://nginx.org/keys/nginx_signing.key  #MD5存放链接
module_hotfixes=true               

 第二步:安装

[root@NFS ~]# yum -y install nginx
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirrors.aliyun.com
 * extras: mirrors.aliyun.com
 * updates: mirrors.aliyun.com
base                  | 3.6 kB     00:00     
epel                  | 4.7 kB     00:00     
extras                | 2.9 kB     00:00     
nginx-stable          | 2.9 kB     00:00     
updates               | 2.9 kB     00:00     
nginx-stable/7/x86_64/p |  81 kB   00:01     
Resolving Dependencies
--> Running transaction check
---> Package nginx.x86_64 1:1.22.1-1.el7.ngx will be installed
--> Processing Dependency: libpcre2-8.so.0()(64bit) for package: 1:nginx-1.22.1-1.el7.ngx.x86_64
--> Running transaction check
---> Package pcre2.x86_64 0:10.23-2.el7 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

=============================================
 Package
       Arch   Version     Repository    Size
=============================================
Installing:
 nginx x86_64 1:1.22.1-1.el7.ngx
                          nginx-stable 797 k     #在这里看是在nginx-stable仓库下载的
Installing for dependencies:
 pcre2 x86_64 10.23-2.el7 base         201 k

Transaction Summary
=============================================
Install  1 Package (+1 Dependent package)

Total download size: 998 k
Installed size: 3.3 M
Downloading packages:
warning: /var/cache/yum/x86_64/7/nginx-stable/packages/nginx-1.22.1-1.el7.ngx.x86_64.rpm: Header V4 RSA/SHA256 Signature, key ID 7bd9bf62: NOKEY
Public key for nginx-1.22.1-1.el7.ngx.x86_64.rpm is not installed
(1/2): nginx-1.22.1-1.e | 797 kB   00:06     
(2/2): pcre2-10.23-2.el | 201 kB   00:06     
---------------------------------------------
Total           155 kB/s | 998 kB  00:06     
Retrieving key from https://nginx.org/keys/nginx_signing.key
Importing GPG key 0x7BD9BF62:
 Userid     : "nginx signing key <signing-key@nginx.com>"
 Fingerprint: 573b fd6b 3d8f bc64 1079 a6ab abf5 bd82 7bd9 bf62
 From       : https://nginx.org/keys/nginx_signing.key
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : pcre2-10.23-2.el7.x86_6   1/2 
  Installing : 1:nginx-1.22.1-1.el7.ng   2/2 
----------------------------------------------------------------------

Thanks for using nginx!

Please find the official documentation for nginx here:
* https://nginx.org/en/docs/

Please subscribe to nginx-announce mailing list to get
the most important news about nginx:
* https://nginx.org/en/support.html

Commercial subscriptions for nginx are available on:
* https://nginx.com/products/

----------------------------------------------------------------------
  Verifying  : pcre2-10.23-2.el7.x86_6   1/2 
  Verifying  : 1:nginx-1.22.1-1.el7.ng   2/2 

Installed:
  nginx.x86_64 1:1.22.1-1.el7.ngx    #查看安装版本,也可以通过nginx -v查看         

Dependency Installed:
  pcre2.x86_64 0:10.23-2.el7                 

Complete!
[root@NFS ~]# 
[root@NFS ~]# nginx -v       #查看版本号,不是-v,-V就是--version
nginx version: nginx/1.22.1
[root@NFS ~]# 

第三步:配置Nginx

第四步:设置开机自启动

[root@NFS ~]# systemctl start nginx
[root@NFS ~]# systemctl enable nginx
Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service.
[root@NFS ~]# 

第五步:检查Nginx是否运行

1、查看nginx状态

[root@NFS ~]# systemctl status nginx
● nginx.service - nginx - high performance web server
   Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
   Active: active (running) since Fri 2023-03-31 10:27:29 CST; 1min 40s ago
     Docs: http://nginx.org/en/docs/
 Main PID: 3271 (nginx)
   CGroup: /system.slice/nginx.service
           ├─3271 nginx: master process /u...
           └─3272 nginx: worker process

Mar 31 10:27:29 NFS systemd[1]: Starting n...
Mar 31 10:27:29 NFS systemd[1]: Can't open...
Mar 31 10:27:29 NFS systemd[1]: Started ng...
Hint: Some lines were ellipsized, use -l to show in full.
[root@NFS ~]# 

2、netstat -tunlp        #查看端口,不解析列出

[root@NFS ~]# netstat -tunlp|grep '80'     #查看端口并过滤80
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      3271/nginx: master  
[root@NFS ~]# id nginx           #安装nginx,自动创建了虚拟用户
uid=997(nginx) gid=995(nginx) groups=995(nginx)
[root@NFS ~]# 

#去网站上传东西,用户必须是nginx虚拟用户

通过官网下载的Nginx,访问就是这个状态,如果想用域名访问,可以Windows修改hosts

Nginx启动方式(两种选择一种方式使用,不能混合使用)

1、使用systemctl方式管理Nginx

systemctl start nginx     #开启

systemctl stop nginx     #停止

systemctl restart nginx  #重启

systemctl reload nginx  #加载

systemctl status nginx   #状态

systemctl enable nginx  #开机自启动

systemctl disable nginx  #禁止开机自启动

2、使用绝对路径方式管理Nginx

/usr/sbin/nginx                                              #启动Nginx

/usr/sbin/nginx -s stop                                  #停止Nginx

/usr/sbin/nginx -s relload                              #重新加载配置,不停机维护

/usr/sbin/nginx -s stop && /usr/sbin/nginx    #重启Nginx

Nginx配置文件

1、主配置文件

/etc/nginx/nginx.conf                             #Nginx主配置文件

[root@NFS ~]# cat /etc/nginx/nginx.conf 
#这里是核心区块
user  nginx;                                #虚拟用户,可以自定义
worker_processes  auto;                     #work子进程的数量,cpu核心数有几个,这个地方就是几个,之前版本数量都是1

error_log  /var/log/nginx/error.log notice; #错误日志存放的路径
pid        /var/run/nginx.pid;              #运行后的PID号的路径,用于停止启动时候杀死进程

#这里是事件模块
events {
    worker_connections  1024;                #每个进程最大的并发连接数,最高数量是65535,每个核心的并发数,等于总nginx的并发数,这个最大连接数量,还与文件描述符有关(打开文件最大数量)        
}


http {
    include       /etc/nginx/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  /var/log/nginx/access.log  main; #默认main格式

    sendfile        on;       #文件的高效传输
    #tcp_nopush     on;    

    keepalive_timeout  65;    #长链接超时时间,65秒没有新的请求

    #gzip  on;                #是否开启压缩

    include /etc/nginx/conf.d/*.conf;    意思是*.conf里的配置内容在http模块下面
}
[root@NFS ~]# 

#虽然*.conf的路径是在/etc/nginx/conf.d目录下,但是实际路径是/etc/nginx,也就是说直接把配置写进去或者引用是一个道理。

配置两种写法:
1、cat /etc/nginx/conf.d/default.conf
2、

/etc/nginx/conf.d/default.conf                #默认网站配置文件

server{

        listen 80;                        #监听的端口 IP地址

        server_name www.game.com;         #域名 localhost表示本机

        location / {                      #用户访问域名默认返回的内容,因为访问默认 
                                          #www.game.com默认是有/,所以这里有根

        root /code;                      #指定用户去/code目录下找代码

        index index.html;                #默认给用户返回index.html 或者index.htm

        }

}

可以一个配置文件写多个配置内容,也可以多个配置文件写多个配置内容
测试完配置文件是否正确:nginx -t
可以vim +7 nginx.conf,直接跳转到第七行
测试完后重启nginx生效:systemctl restart nginx
配置代码目录:没有目录报404,有目录没有文件报403
使用curl,默认会返回配置的文件内容,但是浏览器访问,默认是访问www.game.com/index.html

2、代理配置文件

3、编码相关配置文件

4、管理相关配置文件

5、日志相关配置文件 

Nginx多业务实现方式

1、使用不同端口号表示不同的业务

[root@NFS 4]# vim /etc/nginx/conf.d/default.conf 
server {
        listen 80;
        server_name www.game.com;#小霸王游戏
        location /{
                root /code/1;
                index index.html index.htm;
        }
}
server {
        listen 81;
        server_name www.game.com;#植物大战僵尸
        location /{
                root /code/2;
                index index.html index.htm;
        }
}
[root@NFS 4]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@NFS 4]# systemctl restart nginx
[root@NFS 4]#

修改windows的本地hosts解析

 windows浏览器分别访问www.game.com和www.game.com:81

2、使用不同的IP地址(多个网卡 不同的IP)

可以一个端口多个IP,解决端口不够用的问题

修改IP,写在listen前面,listen 10.0.0.88:80,

写在server_name那里,就算是域名匹配了,也能正常访问,但是不算IP地址匹配了。

3、可以使用不同的域名

[root@Web02 ~]# cat /etc/nginx/conf.d/server1.conf
server {
    listen       80;
    server_name  test1.koten.com;
    root /code/server1;
    index index.html;
    ...
}
[root@Web01 ~]# cat /etc/nginx/conf.d/server2.conf
server {
    ...
    listen       80;
    server_name  test2.koten.com;
    root /code/server2;
    index index.html;
}

Nginx日志管理

Nginx的日志记录模式非常灵活,每个级别的配置都有各自的独立的访问日志,日志格式通过log_format命令定义。

1、定义语法格式

# 配置语法: 包括: error.log access.log
Syntax: log_format name [escape=default|json] string ...;
Default: log_format combined "...";
Context: http

2、Nginx默认日志语法

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

3、Nginx日志格式允许包含的内置变量

$remote_addr        # 记录客户端IP地址
$remote_user        # 记录客户端用户名
$time_local         # 记录通用的本地时间
$time_iso8601       # 记录ISO8601标准格式下的本地时间
$request            # 记录请求的方法以及请求的http协议
$status             # 记录请求状态码(用于定位错误信息)
$body_bytes_sent    # 发送给客户端的资源字节数,不包括响应头的大小
$bytes_sent         # 发送给客户端的总字节数
$msec               # 日志写入时间。单位为秒,精度是毫秒。
$http_referer       # 记录从哪个页面链接访问过来的
$http_user_agent    # 记录客户端浏览器相关信息
$http_x_forwarded_for #记录客户端IP地址
$request_length     # 请求的长度(包括请求行, 请求头和请求正文)。
$request_time       # 请求花费的时间,单位为秒,精度毫秒
# 注:如果Nginx位于负载均衡器,nginx反向代理之后, web服务器无法直接获取到客 户端真实的IP地址。
# $remote_addr获取的是反向代理的IP地址。 反向代理服务器在转发请求的http头信息中,
# 增加X-Forwarded-For信息,用来记录客户端IP地址和客户端请求的服务器地址。

4、access_log日志配置语法

Syntax: access_log path [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];
access_log off;
Default: access_log logs/access.log combined;
Context: http, server, location, if in location, limit_except

5、Nginx Access日志配置

server {
    listen 80;
    server_name code.koten.com;

    #将当前的server网站的访问日志记录至对应的目录,使用main格式
    access_log /var/log/nginx/code.oldboy.com.log main;
    location / {
        root /code;
    }

    #当有人请求改favicon.ico时,不记录日志
    location /favicon.ico {
        access_log off;
        return 200;
    }
}

6、Nginx日志切割

使用logrotate切割日志

[root@nginx conf.d]# cat /etc/logrotate.d/nginx
/var/log/nginx/*.log {
        daily                   # 每天切割日志
        missingok               # 日志丢失忽略
        rotate 52               # 日志保留52天
        compress                # 日志文件压缩
        delaycompress           # 延迟压缩日志
        notifempty              # 不切割空文件
        create 640 nginx adm    # 日志文件权限
        sharedscripts
        postrotate      # 切割日志执行的命令
                if [ -f /var/run/nginx.pid ]; then
                        kill -USR1 `cat /var/run/nginx.pid`
                fi
        endscript
}

日志切割后的效果

[root@Web01 ~]# ll /var/log/nginx/
total 4044
-rw-r----- 1 www adm  54438 Oct 12 03:28 access.log-20181012.gz
-rw-r----- 1 www adm  28657 Oct 13 03:48 access.log-20181013.gz
-rw-r----- 1 www adm  10135 Oct 12 03:28 error.log-20181130.gz
-rw-r----- 1 www adm   7452 Oct 13 03:48 error.log-20181201.gz

 goaccess日志监控

第一步: 安装

[root@web01 ~]# yum -y install goaccess

第二步: 配置
[root@web01 ~]# vim /etc/goaccess/goaccess.conf
time-format %H:%M:%S
date-format %d/%b/%Y
\# NCSA Combined Log Format
log-format %h %^[%d:%t %^] "%r" %s %b "%R" "%u"


第三步: 通过命令行测试
[root@web01 ~]# goaccess -f /var/log/nginx/access.log

第四步: 希望把页面存储下来使用浏览器进行访问
vim go.koten.com
server {
        listen 80;
        server_name go.koten.com;

        location / {
        root /code/log;
        index index.html;
        }
}
{root@web01 ~]# mkdir /code/log
[root@web01 ~]# nohup goaccess -f /var/log/nginx/access.log -o /code/log/index.html -p /etc/goaccess/goaccess.conf --real-time-html &

我是koten,10年运维经验,持续分享运维干货,感谢大家的阅读和关注!

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

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

相关文章

【软件测试】测试开发的一生之敌-BUG

文章目录 1.前言2.如何描述/创建一个BUG3.BUG的级别4.BUG的生命周期5.跟开发产生争执怎么办 1.前言 BUG相比大家都知道,程序运行出错或者与预期不符就是BUG.现在我们来用测试人员的角度来看待BUG. 2.如何描述/创建一个BUG 测试人员要测试开发人员的代码,找出开发人员可能忽略…

敏态开发在大兴机场数字化转型中的实践

一、最大事业是育人 大兴机场是一个年轻的企业&#xff0c;作为一个企业来讲&#xff0c;最宝贵的就是人才。我们在2017年开始社招大学生&#xff0c;到目前为止&#xff0c;公司有一半都是30岁左右的年轻人&#xff0c;并且每年都会招几十个。年轻人特别想做事&#xff0c;而…

C++之内存管理及函数模版

C中的内存管理机制和C语言是一样的&#xff0c;但在具体内存管理函数上&#xff0c;C语言的malloc已经无法满足C面向对象销毁的需求&#xff0c;于是祖师爷在C中新增了一系列内存管理函数&#xff0c;即 new 和 delete 著名段子&#xff1a;如果你还没没有对象&#xff0c;那就…

( 位运算 ) 342. 4的幂 ——【Leetcode每日一题】

❓342. 4的幂 难度&#xff1a;简单 给定一个整数&#xff0c;写一个函数来判断它是否是 4 的幂次方。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 整数 n 是 4 的幂次方需满足&#xff1a;存在整数 x 使得 n 4 x n 4^x n4x。 示例 1&…

src学习记录(二)

学习目标&#xff1a; Apache Shiro ThinkPHP struts2 Apache Log4j Fastjson Weblogic 学习内容&#xff1a; 1.Apache Shiro 字段内容指纹信息请求包中&#xff0c;在Cookie信息中给 rememberMe变量赋任意值&#xff0c;收到返回包的Set-Cookie 值存在 rememberMedeleteMe …

类和对象【C++】【下篇】

目录 一、初始化列表 二、隐式类型转换 三、静态成员 四、友元 1、友元函数 2、友元类 五、内部类 六、匿名对象 一、初始化列表 下面是日期类的一个构造函数&#xff0c;调用该构造函数后&#xff0c;对象中已经有了一个初始值&#xff0c;但并不能将它称为对对象成员变…

实时操作系统内存管理-TLSF算法

内存管理-TLSF算法 前言TLSF算法&#xff1a;为什么内存又叫内存“块”&#xff1a;O(1)查找空闲块&#xff1a;确定fl&#xff1a;确定sl&#xff1a;提级申请&#xff1a;分割块&#xff1a; 空闲块如何串成链表&#xff1f;减少外部碎片&#xff1a;查找上下块&#xff1a; …

Java补充之MySQL入门必备知识

文章和代码已经归档至【Github仓库&#xff1a;https://github.com/timerring/java-tutorial 】或者公众号【AIShareLab】回复 java 也可获取。 文章目录 零基础学MySQL解决之道文件、数据库MySQL 数据库的安装和配置使用命令行窗口连接MYSQL 数据库操作示意图 数据库三层结构数…

使用Intellij IDEA创建新项目时,maven路径总是默认的,一创建maven就卡死

目录 使用Intellij IDEA创建新项目时&#xff0c;maven路径总是默认的 弄了老半天&#xff0c;终于把这个破玩意给弄好了&#xff0c;真的没有意思&#xff0c;真的很恶心 我经历了两个过程&#xff0c;一个是 使用Intellij IDEA创建新项目时&#xff0c;maven路径总是默认的…

用免费蜜罐工具配置Modbus工控蜜罐

导语&#xff1a;本文将用DecoyMini免费蜜罐工具来配置自定义的ModbusTCP工控仿真模板&#xff0c;并介绍部署后的Modbus蜜罐的使用效果。 DecoyMini是一个免费的蜜罐工具&#xff0c;其特色是仿真能力采用与软件松耦合的仿真模板来进行管理。通过一键式导入云端仿真模板库里的…

【Linux】多线程 --- 线程同步与互斥+生产消费模型

人生总是那么痛苦吗&#xff1f;还是只有小时候是这样&#xff1f; —总是如此 文章目录 一、线程互斥1.多线程共享资源访问的不安全问题2.提出解决方案&#xff1a;加锁&#xff08;局部和静态锁的两种初始化/销毁方案&#xff09;2.1 对于锁的初步理解和实现2.2 局部和全局锁…

计算机中丢失msvcr120.dll怎么办,电脑找不到msvcr120.dll怎么办

电脑提示msvcr120.dll丢失是一个常见的问题&#xff0c;这个问题通常会在你尝试打开某些程序或游戏时出现。这个问题的原因是因为你的电脑缺少了一个名为msvcr120.dll的文件&#xff0c;这个文件是微软Visual C Redistrle for Visualv 2013的一部分。如果你遇到了这个问题&…

算法设计 || 第5题:田忌赛马-杭州电子科技大学(贪心算法)

目录 &#xff08;一&#xff09;杭电原题 &#xff08;二&#xff09;Please speak Chinese: &#xff08;三&#xff09;手写草稿理解思路核心算法 第一款代码&#xff1a; 第二款代码&#xff1a; &#xff08;一&#xff09;杭电原题 Tian Ji -- The Horse Racing Pro…

【分治法】

目录 知识框架No.1 分治法基本思想No.2 合并排序No.3 快速排序一、基本思想三、效率分析四、快速排序不稳定例子 No.4 二叉树遍历及其相关特性一、基本概念二、中序遍历三、前序遍历四、二叉树的高度计算(高度不是深度) 知识框架 No.1 分治法基本思想 将规模为N的问题分解为k…

Spring MVC:常用参数(注解)的使用和参数绑定的验证

Spring MVC&#xff1a;常用参数&#xff08;注解&#xff09;的使用和参数绑定的验证 一、学习资源二、基础源码三、实验结果3.1 Spring MVC常用参数Controller和RequestMappingRequestMappingRequestParamPathVariableCookie ValueRequestHeader 3.2 Spring MVC参数绑定3.2.1…

一路对标顶级产品,奇遇XR为何仍不见起色?

临近6月&#xff0c;再度遇冷的XR行业&#xff0c;又让很多人充满期待。外界普遍认为&#xff0c;基于苹果酝酿多年的MR头显产品&#xff0c;将于6月举行的WWDC 2023全球开发者大会正式亮相&#xff0c;XR行业或将迎来“iPhone时刻”。 在一派期待中&#xff0c;一家国内XR企业…

代码审计之PHP基础铺垫

目录 1、标记 2、注释 3、输出语句 4、关键字 5、常量的定义与使用 6、预定义常量 7、变量的赋值&#xff08;传参赋值与引用赋值&#xff09; 8、可变变量 9、双引号和单引号的区别 10、heredoc结构和nowdoc结构 11、其他符号 1、标记 <?php 和 ?> 是PHP标…

第十一届蓝桥杯青少组省赛Python中/高级组编程题真题,包含答案解析

第十一届蓝桥杯青少组省赛Python中/高级组编程题真题 编程实现 第一题&#xff1a; 输入一个字符串&#xff0c;如果该字符串以er、Iy或者ing后缀结尾的&#xff0c;则删除该字符串后缀&#xff0c;并输出删除后的字符串&#xff0c;否者将原字符串输出。 输入描述 输入一个…

零知识证明:应用和具体用例

零知识证明&#xff08;Zero-Knowledge Proofs&#xff0c;ZKPs&#xff09;是应用密码学中令人兴奋的突破&#xff0c;将在各个行业中解锁新的用例&#xff0c;从 Web3 到供应链再到物联网。通过在不揭示信息的情况下验证其真实性&#xff0c;ZKPs 可以增强数字系统的隐私、安…

【Unity-UGUI控件全面解析】| Slider 滑动条组件详解

🎬【Unity-UGUI控件全面解析】| Slider 滑动条组件详解一、组件介绍二、组件属性面板三、代码操作组件四、组件常用方法示例4.1 充当 进度条控制灯光亮度4.2 模拟 血条 使用💯总结🎬 博客主页:https://xiaoy.blog.csdn.net 🎥 本文由 呆呆敲代码的小Y 原创,首发于 CS…