Nginx配置文件简介与配置实例(负载均衡、动静分离、高可用集群)- 细节狂魔

前言

本专栏文章的内容均来自于B站up主“尚硅谷”的教程视频
博主的博客,你可以理解为是博主在做笔记,方便复习。
希望也可以帮到你们。

在了解 Nginx 配置文件前,我们需要知道它的位置。
指令
1、cd /usr/local/nginx/
2、ls
3、cd conf
4、ls在这里插入图片描述
路径:/usr/local/nginx/conf/nginx.conf


Nginx配置文件组成

我们先通过指令(vi nginx.conf)打开文件。
在这里插入图片描述
在这里插入图片描述
其实我们翻看一下配置文件里面的内容,就会发现其实里面大部分内容都是被注释(#)掉了。
真正有用的只有寥寥数行(分为三部分)。
在这里插入图片描述


Nginx配置文件三个部分

第一部分:全局块

从配置文件开始到 event 块之间内容:
在这里插入图片描述
这块内容主要会设置一些影响 nginx 服务器整体运行的配置指令.。
主要包括 配置运行 nginx 服务器的用户(组),允许生成的 worker process 数(允许分配的线程 数量/资源 ),进程 PID 存放路径日志存放路径和类型以及配置文件的引入等。

比如上面的配置:
    worker_processes 1;
这是 Nginx 服务器并发处理服务的关键配置,worker_processes 值越大,可以支持的并发处理量也就越多,但是会受硬件,软件等设备的制约.


第二部分:events 块

比如上面的配置
在这里插入图片描述
events 块设计的指令主要影响 Nginx 服务器与用户的网络连接,常用的设置包括是否开启对多 work process 下的网络连接进行序列化,是否允许同时接受多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 work process 可以同时支持的最大连接数等。

上述例子表示:
  每个 work process 支持的最大连接数为 1024。
这部分的配置对 nginx 的性能影响较大,在实际中应该灵活配置


第三部分:http 块

这部分是 Nginx 服务器配置中最频繁的部分代理,缓存和日志定义绝大多数功能第三方模块的配置都在这里。
需要注意的是: http 块也可以包括 http 全局块,server 块


http 全局块

http 全局块配置的指令包含文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。
在这里插入图片描述


server 块

这块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全的一样的,该技术的产生是为了节省互联网服务器硬件成本。
  每个http 块可以包括 server 块,而每个 server 块就相当于一个虚拟主机
  而每个 server 块也分为全局 server 块,以及可以同时包含多个 location 块.
在这里插入图片描述
listen    80::表示 Nginx 此时在监听的端口号是 80
server_name:表示主机名称(本地就填localhost即可)


location 块

在这里插入图片描述

表示访问本地地址时,会做一些请求跳转
   这块主要作用是基于 Nginx 服务器接收到的请求字符串(server_name/uri-string),对虚拟主机名称(也可以是 IP 别名)之外的字符串 (例如:前面的 /uri-string) 进行匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。(可以参考下面被注释掉的 location 示例)


Nginx 配置实例

实例1 - 反向代理

预期实现效果

  打开浏览器,在地址栏中输入地址,例如:www.123.com,跳转到 Linux 系统 Tomcat 主页面中。
在这里插入图片描述


具体实现

通过修改本地 host 文件,将 www.123.com 映射到 127.0.0.1 上

.1、准备工作:
  在 Linux 系统上安装 Tomcat(Tomcat默认的端口号:8080)
可参考文章:https://blog.csdn.net/DarkAndGrey/article/details/125224914
需要保证 Tomcat 的启动:进入到 Tomcat 的 bin 目录中,./startup.sh 启动 Tomcat 服务器
在这里插入图片描述
Nginx 安装参考https://blog.csdn.net/DarkAndGrey/article/details/127813793

2、访问过程分析
在这里插入图片描述
这过程中,代理服务器IP【192.168.17.129::80】 是暴露在外的,而 IP【127.0.0.1:8080】外部人员是无法得知,因为完全不知道这个请求真实访问的是哪个地址。
总结:
Windows 浏览器是无法直接访问到 Tomcat 的,需要通过 Nginx 反向代理到 Tomcat 服务器上去。

需要注意的是: www.123.com 这个域名,是需要配置 映射IP地址 的。
如果没有域名,可以Windows 的 host 文件中可以进行配置(人工映射):
  如果我们访问地址不存在,它会去访问网络DNS进行域名解析,然后去访问解析出来的结果(IP地址)。
在这里插入图片描述
用记事本软件打开
在这里插入图片描述
在这里插入图片描述
此时,我们浏览器去访问域名,就可以看到
在这里插入图片描述
但是我们可以看到 Tomcat 的 端口号,目前想通过 80 端口访问(可省略端口号访问),还做不到。
所以我们就需要引入 Nginx,在 Nginx 中进行请求转发的配置(反向代理配置)
在这里插入图片描述
在这里插入图片描述
找到 server 配置,做出如下修改:
在这里插入图片描述
还没完,下面的 location 配置 也需要修改:
在这里插入图片描述
在这里插入图片描述
此时,我们再去访问 192.168.17.129:80 地址时,会被 Nginx 转发到 Tomcat 访问IP。【记得保存配置(wq!)

启动 Nginx
在这里插入图片描述
在这里插入图片描述
此时我们就完成了 Nginx 的反向代理。
需要注意的是 80 和 8080 端口的访问权限都要给,光给80 也是无法访问的
开发端口指令
: firewall-cmd --add-port=8080/tcp --permanent
防火墙重启: firewall-cmd --reload
查看已经开放的端口:firewall-cmd --list-all


实例2 - 反向代理

进行操作之前,现将启动的tomcat关闭服务。
在这里插入图片描述

实现效果

使用 Nginx 反向代理,根据访问的路径
跳转到不同端口的服务中。
例如:

Nginx监听端口为9001
1、访问 http://192.168.17.129:9001/edu/  如果有存在 /edu 路径, 直接跳转到 127.0.0.1:8080
2、访问 http://192.168.17.129:9001/vod/   如果有存在 /vod路径, 直接跳转到 127.0.0.1:8081

准备工作一:准备两个Tomcat 服务器,一个 8080 端口,一个8081 端口

准备两个Tomcat 服务器,一个 8080 端口,一个8081 端口。

先创建两个文件夹, tomcat8080 和 tomcat8081,将tomcat安装包分别存入两个文件夹中
在这里插入图片描述
当我们将压缩包上传成功后,分别进入两个文件夹中输入解压指令:tar -xvf Tomcat的安装包名称(全名

对于 tomcat8080 文件夹中的Tomcat,在其bin目录中直接输入启动指令即可(Tomcat默认端口号就是8080): ./startup.sh  
在这里插入图片描述

而 tomcat8081 文件夹中的Tomcat,需要对其配置文件进行修改端口号
在这里插入图片描述
在这里插入图片描述
首先需要将 用于关闭 Tomcat 的端口号 8005 修改
在这里插入图片描述
这里改成了 8015,只要与其它端口不冲突即可。
在这里插入图片描述
解下来就是修改 连接器端口号 8080
在这里插入图片描述
在这里插入图片描述
下面这个端口也改一下
在这里插入图片描述
在这里插入图片描述
改到这里就差不多了, 输入保存指令: :wq!  回车即可。
在这里插入图片描述
如果你想知道修改是否成功,在输入一下打开文件的指令即可: vi 加上文件全名

然后,就可以将这个Tomcat 启动起来
在这里插入图片描述
此时,两个 Tomcat 就启动成功了。
我们自己可以使用 IP + 端口号 的方式去访问 Tomcat,看看 Tomcat 是否真的启动成功。
在这里插入图片描述
在这里插入图片描述


准备工作二:创建文件夹和测试页面

我们以 Tomcat8080 为例:
  我们的项目都是部署到外网服务器上的,一版都是 Tomcat,或者是 jar 包部署。这里我们用的Tomcat。
  Tomcat 部署项目,项目都是在 webapps 目录中、
  我们就在这里创建文件夹 edu (上传,或者使用工具直接创建文件夹)

访问 http://192.168.17.129:9001/edu/  如果有存在 /edu 路径, 直接跳转到 127.0.0.1:8080

edu 文件中我们需要创建一个 html 静态页面文件。(完成下列操作后,将其放到对应的 edu 文件夹中)
在这里插入图片描述
此时我们去访问这个页面
在这里插入图片描述
Tomcat8081 按照上面流程在操作一遍就行了。记得将 a,html 文件内容改成 8081 方便区别。

访问 http://192.168.17.129:9001/vod/   如果有存在 /vod路径, 直接跳转到 127.0.0.1:8081
在这里插入图片描述


具体实现 - 具体配置

找到 Nginx 配置文件,进行反向代理配置

在这里插入图片描述
在这里插入图片描述
以下面的服务模块为例,再新增一个
在这里插入图片描述
配置文件里面有一个 server模块 是被注释掉了的,我们可以直接拿来用
在这里插入图片描述
在这里插入图片描述
反向代理的配置到这里,就配置好了。
需要注意的是:
对外端口的开放(9001,8080,8081)

保存 配置文件 之后(:wq!),记得重启 Nginx,要不然更改的配置是不会生效的

在这里插入图片描述
指令:
1、cd Nginx的 sbin 目录
2、 ./nginx -s stop 关闭 Nginx 服务
3、./nginx 启动 Nginx 服务


效果验收

在这里插入图片描述
在这里插入图片描述


知识点补充

location 配置说明

该配置作用于 匹配 URL。
语法如下

// 我们刚才使用的是 ~ 符号
location 【= / ~ / ~* / ^~】 uri{
}


1=:用于不含正则表达式的 uri 前,
要求 请求字符串 与 uri 严格 匹配,如果匹配成功,
就停止继续向下搜索并立即处理该请求。

>2~:用于用时 uri 包含正则表达式,并且区分大小写。

>3~*:用于标识 uri 包含正则表达式,并且不区分大小写。

>4^~:用于不含正则表达式的 uri 前,
>要求 Nginx 服务器找到标识 uri 和 请求字符串 匹配度最高的 location 后,
>立即使用此 location 处理请求,
>而不再使用 location 块中的正则 uri 和 请求字符串 做匹配。

Nginx配置实例 - 负载均衡

增加服务器的数量,然后将请求分发到各个服务器上。
将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们所说的负载均衡
在这里插入图片描述


实现效果

1、浏览器地址栏输入 地址(http://192.168.17.129/edu/a,html)时,负载均衡的效果:将请求平均分发给 8080 和 8081 端口


准备工作

沿用上一个实例条件:2个Tomcat服务器,端口不一样(8080 和 8081);
在两个 Tomcat 里面 webapps 目录中,创建两个文件夹 edu(对应8080) 和 vod(对应8081);
另外分别在两个文件夹中创建一个 HTML 文件,页面不需要太复杂, 一个标题标签即可【(8080 = edu)(8081 = vod)】。

我们现在需要做的是关于负载均衡的配置
在这里插入图片描述
配置的格式如下:
在这里插入图片描述
注意! 我们修改 http 模块下的 server的配置
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
到这里 负载均衡的配置 就配置好了。(记得保存【:wq!】,重启(./nginx -s stop   ./nginx))
此时,你可能有疑问:weight 没有用到,那weight总要讲一下意思吧?
在这里插入图片描述
在Nginx中,可以通过配置权重(weight)来实现负载均衡.
配置文件中,upstream后面的集群名称要与proxy_pass后的域名一致!
在upstream中,通过参数weight来设置后端各服务器的权重(weight值越大,该服务器负载就越大)。


验收效果

直接通过ip地址 + 文件路径
在这里插入图片描述
我们发现 edu 原本对应的是 “8080” 页面,此时结果却截然相反!
这是因为这个请求被分配给 8081端口服务
当我们刷新页面时,可以发现这个请求分配给了 8080端口服务.
在这里插入图片描述
这就是负载均衡的效果,将请求的压力分摊给2个服务器。


Nginx分配方式(策略)

1、轮训(默认)

每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,都能自动剔除

举个例子:
现有两个请求,A请求是三分钟之前受到,B请求是一分钟之前收到的。
也就是说 A在前,B在后,Nginx根据q请求先后顺序逐一分配到不同的服务器上。
如果某个服务器挂了,就将该服务器剔除,将该请求继续配下一个服务器上进行处理。


2、weight(权重)

weight 在前面讲过:
  weight 代表 权重,默认值为1。权重越高分配的客户端越多..
在这里插入图片描述
此时,8081 端口 的权重值 是 8080 的一倍,也就意味着 8081 端口的服务器需要承受的请求压力是 8080 的一倍


3、ip_hash (IP 哈希分配)

每个请求按访问IP的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决 session的问题
【你在一个服务器登录了,不代表在另一个服务器上登录了。】
在这里插入图片描述


4、fair (第三方)

后端服务器的响应时间来分配请求,响应时间短的优先分配。
在这里插入图片描述
说白了就是谁性能好,响应速度快,就优先分配给它处理(能者多劳)。


Nginx配置实例 - 动静分离

  Nginx 动静分离 简单来说就是把动态跟静态请求分开不能理解成只是单纯的把动态页面和静态页面物理分离
  严格意义上说应该是态请求跟态请求分开,可以理解成使用 Nginx 处理静态页面, Tomcat 处理动态页面。
在这里插入图片描述

  动静分离从目前实现角度来讲大致分为两种
  1、纯粹把静态文件独立成单独的域名,放在独立的服务器上,也是目前主流推崇的方案。

   以上图为例(第一种实现):Tomat 与 静态资源服务器 其实都是单独部署的
当我们访问静态资源的时候,通过 Nginx 将静态资源请求转发到静态资源服务器上。

后面我们配置实例也是使用的 第一种方法 实现的。

  2、动态和静态混合在一起发布,通过 Nginx 来分开


关于动静分离,我们要明确其目的:提高访问效率


知识点拓展 - location

  location 指定不同的后缀名实现不同的请求转发。通过 expires(到期) 参数设置,可以设置浏览器缓存过期时间减少与服务器之间的请求和流量
  具体 expires 定义:

给一个资源设定一个过期时间,也就是说无需服务端验证,直接通过浏览器自身确认是否过期即可,所以不会产生额外的流量。
假如:
我们将expires参数设置为 “3d”:
  表示 3 天之内访问 同一个 URL,
发送一个请求,比对服务器该文件最后的更新时间没有变化,则不会从服务器抓取,返回状态码 304,如果有修改,则直接从服务器重新下载,返回状态码 200

优点:直接去访问浏览器的缓存,减少交互。】
缺点:不适用资源变更频率高,迭代更新过快的场景】


配置实例 - 准备工作

1、在 Linux 系统中准备静态资源,用于进行访问。

在这里插入图片描述
在 www 文件夹中,放入一个 a.html 静态页面文件(保存之后,直接拖拽进去)。
在这里插入图片描述
至于 image 文件,随便放入一个图片文件即可。
在这里插入图片描述


实现效果

在浏览器地址栏输入:Nginx 的IP+端口(默认80) + 静态资源路径[(/www/a.html)(/image/01.jpg)],能访问到文件。

说白了就是通过 Nginx 去访问静态资源,而不是通过 Tomcat 去访问


具体配置

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
接下来才是配置的重点: location 的配置(下面是 3 个 w,不是4个。)
在这里插入图片描述
到这里我们就完成了配置(保存一下::wq!)。
关闭 Nginx:./nginx -s stop
启动 Nginx:./nginx


最终效果

此时我们就能发现:可以直接访问到静态页面资源。
在这里插入图片描述
在这里插入图片描述
到这里,我们就实现了Nginx访问静态资源。


Nginx配置实例 - 高可用的集群

什么是 Nginx 高可用?

在这里插入图片描述
经过学习的我们都知道:客户端发送的请求到了 Nginx,再经过 Nginx 转发 两个Tomcat 中的一个。

但是在上述的过程中存在着问题
1、Tomcat 服务宕机

在前面讲关于 Nginx 分配策略的时候,我们都知道 Nginx 默认策略 是 轮训(如果后端服务器 down 掉,会自动剔除。)

2、Nginx 宕机

没有软件会一直正常运行,总会有些意外会导致宕机。
Nginx 也是一样。
‘当 Nginx 宕机 之后,客户端的所有请求是不是就都失效了

针对 第种情况,我们就需要引入 高可用
高可用的作用就在于:‘
  当 Nginx 服务宕机之后,请求依旧能够正常被执行
说白了,就是 准备一个备用的 Nginx 服务器,来应对 Nginx 意外宕机的情况。
在这里插入图片描述
主备服务器切换,需要使用到软件KeepAlived,主备服务器都需要安装
KeepAlived 就是类似一个路由,通过内部运行一个脚本,来判断当前的服务器是否正常运行(活着)?
如果正常运行,就让它处理请求;
反之,就切换到备用的Nginx服务器.

需要注意的是:
   这两个Nginx服务器的IP分别是: 129 与 131。
我们需要一个对外展示的虚拟IP地址。

通俗来说:
  虚拟IP地址 就好像是一个 “空壳公司”,实际上是不存在的
但是!我们需要通过它来访问 Nginx 服务器的。
【空壳公司虽然实质存亡,但是却能凭借“公司”的标签来卷钱!】

实际操作:
我们向外部提供一个 IP地址 (192.168.17.50)【这个IP其实是没有服务存在的】。
随后,我们将这个IP绑定主,备 Nginx所在的服务器上。
此时,当客户端通过请求虚拟IP地址,访问Nginx服务器上。
然后,KeepAlived 会检查当前服务器是否正常运行?
如果宕机,后面将由备用服务器来接收处理请求。


配置Nginx高可用条件

1、至少需要两台 Nginx 服务器
2、每个Nginx服务器,都需要安装 KeepAlived 软件
3、需要对外提供一个虚拟IP地址


准备工作

需要两台 Nginx 服务器
1、准备两台服务器

第一服务器的IP地址:192.168.17.129
在这里插入图片描述
第二台服务器IP地址:192.168.17.131
在这里插入图片描述


2、在两台服务器上安装 Nginx

可参考这篇文章Nginx 在 Linux 系统上安装 - 细节狂魔


3、在两台服务器上安装 KeepAlived

使用 yum 命令进行安装:yum install keepalived -y
在这里插入图片描述
在这里插入图片描述
安装完成之后。再输入指令:rpm -q -a keepalived
在这里插入图片描述
看到这个就说明安装成功。

我们来看一下 keepalived 安装的位置:
在这里插入图片描述
等会我们配置 虚拟IP绑定 Nginx 服务器,就是这个文件。


实际操作

修改 KeepAlived 配置文件 - 完成高可用配置(主从配置)

在这里插入图片描述
global_def: 全局定义模块

notification_email:指定keepalived在发生切换时需要发送email到的对象,一行一个

notification_email_from:指定发件人

smtp_server:指定smtp服务器地址(下面是 主 Nginx 服务器IP)

smtp_connect_timeout:指定smtp连接超时时间

router_id: 路由节点ID(唯一的值)

LVS_DEVEL:当前服务器名称
     LVS (Linux Virtual Server Linux 虚拟服务器)
这个我可以在 etcc下面的 hosts 文件【vi /etc/hosts】中看到 服务器名称
在这里插入图片描述
在这里插入图片描述
如果没有,可以自己编辑一个名字,相对应的,配置文件需要同步该名称。

下面这个模块的功能:检查当前Nginx服务器是否宕机切换备用Nginx服务器的配置
vrrp_script:虚拟路由冗余协议脚本
chk_http_port:检查 http请求,端口
script:脚本参数
interval:检测脚本执行的间隔,单位 s (秒)
weight:权重
在这里插入图片描述

关于(script)脚本文件 nginx_check.sh如何去编写。
请看下面:
在这里插入图片描述
这里面最重要的配置就是标明:当前 Nginx 安装位置
这个脚本简单来说:
  检查Nginx服务是否活着(正常运行)

A=ps -c nginx -no-header |wc -1 `
整个命令的组合 ps -c nginx -no-header | wc -l 的作用是输出当前运行的 nginx 进程的数量。
1、ps 命令用于列出当前运行的进程。
2、-c 选项用于指定列的显示格式。
3、nginx 是我们要查找的进程名
4、-no-header 选项用于不显示列标题
5、| 是管道操作符,它用于将前一个命令的输出作为后一个命令的输入
6、wc 命令用于统计文件中的行数、单词数和字节数。
7、-1 选项用于只显示行数。
8、A 是一个变量

在这里插入图片描述
上面的 if 判断的意思是:如果 nginx 执行进程数量为 0,即宕机。
脚本会尝试启动 nginx 服务,并且脚本会在这里停止2s,给予nginx服务启动时间。

紧接着的 if 判断:
就是再次去检查 nginx 服务是否启动
如果还是没能正常运行,就杀死 所有正在运行的 keepalived 进程。

fi 表示结束上一个 if 语句

整个脚本的作用是检查 nginx 服务是否正在运行。如果 nginx 服务停止,脚本将尝试启动它。如果启动失败,脚本将尝试杀死所有 keepalived 进程,这导致 keepalived 维护的虚拟IP地址被另一台机器接管

【我们在本地新建一个这样的文件,写好之后,上传到 对应目录即可。】
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
上面这个模块是关于 对外展示的虚拟IP 的配置
state:表示当前 Nginx的主备状态
master >> 服务器,backup >> 用服务器】
【两个nginx服务器一个主,一个备,主要区别就在于这一个配置】

interface:需要与虚拟地址IP绑定的网卡名称

下面我们就来看看如何查询服务器网卡名称
我在 129服务器中,输入指令:ifconfig
在这里插入图片描述

virtual_router_id:路由节点ID【主,备机的值应一致

priority:服务器优先级
【备用的服务器优先级写小点】

advert_int:间隔查询,单位为 s(秒)。【默认1秒 VRRP心跳包的发送周期】

authentication:认证模块

auth_type:认证方式(PASS 表示 密码认证方式)

auth_pass:认证密码(密码只识别前8位)

virtual_ipaddress:配置虚拟IP地址


将两台服务器上的 nginx 和 KeepAlived 启动起来

关于 KeepAlive 的配置,上面已经讲的很清楚了。
主,备的配置区别,我都使用【】括起来了。
下面我们就来启动 nginx 和 KeepAlived 服务。

129 ,131 服务器,启动nginx: ./nginx
如果是已经启动过了的,就重启一下:./nginx -s stop 加上 ./nginx,一共2个指令
在这里插入图片描述
129,131服务器 启动 KeepAlievd: systemctl start keepaliived.service
在这里插入图片描述
我们可以通过查看 KeepAlived 进程,来判断是否启动成功!
指令: ps -ef | grep 查询进程名称
在这里插入图片描述


效果验收

我们现在通过访问虚拟IP,看看是否能够访问到nginx服务?
在这里插入图片描述
此时,我们现在至少能够确定 虚拟IP地址 的绑定是没有问题的。
我们可以通过输入指令:ip a 来验证我们的结论。
以129服务器为例:途中第二个圈住部分说明了 虚拟ip地址已经绑定了 129 服务了。
在这里插入图片描述

接下来我就将服务器(129)的 nginx,keepalived 服务关闭,再次去访问虚拟IP地址,看看是否还能访问到nginx服务。
关闭 keepalived 服务:systemctl stop keepalived.service
在这里插入图片描述
关闭nginx服务:./nginx -s stop
在这里插入图片描述
如果你们想要确定是否成功关闭,
可以输入查看进程指令:ps -ef | grep (nginx / keepalived)

当我们去刷线浏览器页面时,可以访问nginx服务器仍然是可以访问的!
此时,我们访问 备用 nginx 服务(131 服务器)。
在这里插入图片描述
在这里插入图片描述

  • 20
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dark And Grey

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值