七层负载均衡-nginx

一、nginx安装

nginx实现负载均衡集群,本质上就是反向代理加负载均衡。

正向代理与反向代理的区别
1.代理服务器如果配置在客户端即为正向代理,如果配置在服务端即为反向代理,和机器个数没有关系

2.正向代理代替客户端去发送请求,反向代理代替服务端接受请求

3.正是因为正向代理代替客户端发送请求,正向代理服务器和客户端对外表现为一个客户端,所以正向代理隐藏了真实的客户端;反向代理代替服务端接受请求,反向代理服务器和真实服务器对外表现为一个服务端,所以反向代理服务器隐藏真实的服务端

综上,本质上代理服务器还是那个代理服务器,如果替客户端干活就是正向代理,如果替服务端干活就是反向代理;

服务器不仅可以作为服务端,也可以作为客户端;如果该服务器向某些客户端提供资源,此时就是服务端,同时如果需要向别的服务器请求资源,此时就是客户端。

在这里插入图片描述LVS是四层负载,也就是基于传输层信息进行调度(传输层协议TCP/UDP)七层负载中比较出名就是haproxy与nginx,也就是基于应用层信息就行调度(应用层协议:HTTP等)。

七层可以做重定向,比如下图访问淘宝地址www.taobao.com,可以看到http状态码为301表示重定向,重定向后的地址为 https://www.taobao.com/,端口为443端口,但用户通过浏览器上过去的都是标准的80端口,也就是做了重定向。现在电商都是做的整站加密。

在这里插入图片描述

1.下载nginx的源码包

  本实验使用nginx源码安装(也可以下载编译好的rpm),rpm包是已经配置好参数进行编译的,源码包则可以按自己需求配置再进行编译,也就是个人定制。
  下载相应版本源码包到本地宿主机,通过ftp协议下载到server1上进行解压;configure是GNU组织的make,类似于goodjob的check。

Nginx官网

#宿主机下载所需版本的源码安装包,推荐下载稳定版的
[root@wlb Downloads]# pwd
/home/westos/Downloads
[root@wlb Downloads]# wget http://nginx.org/download/nginx-1.20.2.tar.gz

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

部署节点虚拟机通过ftp协议从宿主机下载安装包并解压

#下载
[root@server5 ~]# lftp  -u westos,westos sftp://172.25.254.73
lftp westos@172.25.254.73:~> cd /home/westos/Downloads/
lftp westos@172.25.254.73:~/Downloads> ls
drwxr-xr-x    3 westos   westos        191 Jul 20 21:35 .
drwx------   22 westos   westos       4096 Jul 20 09:48 ..
-rw-rw-r--    1 westos   westos   77101976 May  4 16:26 Firefox-latest-x86_64.tar.bz2
-rw-rw-r--    1 westos   westos   77259395 Jul 20 09:31 firefox-102.0.1.tar.bz2
-rw-rw-r--    1 westos   westos   13626774 Mar  5 23:00 helm-v3.8.0-linux-amd64.tar.gz
-rw-rw-r--    1 westos   westos    1721604 Mar 27 21:45 moosefs-3-0-users-manual.pdf
-rw-r--r--    1 root     root      1062124 Nov 16  2021 nginx-1.20.2.tar.gz
drwx------    3 westos   westos         24 Jan  3  2022 qq-files
lftp westos@172.25.254.73:~/Downloads> get nginx-1.20.2.tar.gz 
1062124 bytes transferred
lftp westos@172.25.254.73:~/Downloads> exit
[root@server5 ~]# ls
nginx-1.20.2.tar.gz
[root@server5 ~]# tar zxf nginx-1.20.2.tar.gz 
[root@server5 ~]# ls
nginx-1.20.2  nginx-1.20.2.tar.gz

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

2.安装

在这里插入图片描述–without表示默认情况下编译是自带的,需要使用该命令把它去除。
–with表示默认情况下编译是不带的,需要使用该命令加上去。

1)源码编译第一步,./configure ,检验操作系统的依赖性

[root@server5 nginx-1.20.2]# ./configure --with-http_ssl_module --with-http_stub_status_module  --prefix=/usr/local/nginx
此命令是安装一些模块,此命令必须在nginx源码目录下执行

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

提示没有下载c语言编辑器,安装c语言编辑器,解决依赖性
[root@server5 nginx-1.20.2]# yum install -y gcc
安装后继续执行
[root@server5 nginx-1.20.2]# [root@server5 nginx-1.20.2]# ./configure --with-http_ssl_module --with-http_stub_status_module  --prefix=/usr/local/nginx

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

执行命令继续检测
[root@server5 nginx-1.20.2]# ./configure --with-http_ssl_module --with-http_stub_status_module  --prefix=/usr/local/nginx

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

2)源码编译第二步编译,make,把c语言源码编译成可执行的二进制程序

make指令,是在安装有GNU Make的计算机上的可执行指令。该指令是读入一个名为 ’Makefile’的文件,然后执行这个文件中指定的指令。
在这里插入图片描述

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

3)源码编译第三步,make install

[root@server5 nginx-1.20.2]# make install
该动作必须在源码的第一级解压路径,也就Makefile文件的同级目录下,其实就是把编译好的二进制程序和配置文件复制过去

在这里插入图片描述在这里插入图片描述在这里插入图片描述创建软连接

[root@server5 conf]# ln -s /usr/local/nginx/sbin/nginx /usr/local/bin/
[root@server5 conf]# which nginx
[root@server5 conf]# ll /usr/local/bin/nginx
创建软链接到/usr/local/sbin/,在该目录下,命令相当于在环境变量中,这样在开启nginx服务的时候就不需要进到目录下开启,方便开启全局nginx。软连接的方式可以

在这里插入图片描述检测语法,并启动

[root@server5 conf]# nginx -t #检测语法
[root@server5 conf]# nginx	#启动nginx
[root@server5 conf]# ps ax

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

[root@server5 conf]# nginx -s stop #关闭nginx
[root@server5 conf]# nginx -s reload #重启nginx

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

二、nginx七层负载配置

后端服务器开启apache服务,进行测试

[root@server2 ~]# systemctl start httpd
[root@server3 ~]# systemctl start httpd

在这里插入图片描述在这里插入图片描述nginx主配置文件添加负载均衡器和反向代理

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

在这里插入图片描述

[root@westos_student73 westos]# vim /etc/hosts

172.25.254.15 server1 reg.westos.org www.westos.org bbs.westos.org www2.westos.org

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述关闭后端服务器server2进行测试
访问测试必须是访问域名,如果使用访问IP将默认访问第一个虚拟主机Nginx

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

三、nginx的一些配置

1.backup:备份;

当其他后端服务器停止工作时,代替工作
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

2.配置权重

在这里插入图片描述测试:客户端测试,按权重比例分配负载。

在这里插入图片描述

3.选择负载均衡算法:IP Hash

IP Hash算法:根据客户端ip进行负载均衡,相同客户端IP访问时,会访问到同一客户端。一对一,一个sever对一个IP。

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述客户端测试:同一客户端访问同一后端服务器
在生产环境中需要的是整体的均衡,并不需要不断地切换后台服务器,在实际中实现整体流量的均衡就行。当下的应用服务器很多要与客户端建立session连接,这就需要session保持机制,不能随便进行调度,因为如果后台服务器之间没有session共享机制时,可能会出现一种情况。当通过浏览器访问莫网页,通过认证后,又被调度到其他服务器就会出现需要重新认证的情况。

该算法仍然有负载均衡,当客户端匹配的后台服务器挂掉时,会进行负载均衡调度到其他服务器,当该
服务器恢复后,还会匹配到原服务器。

在这里插入图片描述

4.手动下线指定服务器节点,down

当后端服务器RS需要下线维护时,可以手动指定下线

在这里插入图片描述在这里插入图片描述服务端测试:
在这里插入图片描述因为实验的一些原因,test5虚拟机仍为nginx服务器,另建立test6虚拟机为sever6后端服务器,IP为172.25.254.16;以及虚拟机test7为server7后台服务器,IP为172.25.254.17;
在这里插入图片描述

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

修改nginx主配置如下

在这里插入图片描述RS服务端下载apache,并设置发布页内容

[root@server6 ~]# yum install httpd -y
[root@server6 ~]# systemctl start httpd
[root@server6 ~]# echo server6 > /var/www/html/index.html
[root@server6 ~]# curl localhost


[root@server6 ~]# yum install httpd -y
[root@server6 ~]# systemctl start httpd
[root@server6 ~]# echo server7 > /var/www/html/index.html
[root@server6 ~]# curl localhost

在这里插入图片描述

在这里插入图片描述nginx手动下线server7后端服务器进行测试
在这里插入图片描述客户端测试
在这里插入图片描述

四、nginx添加第三方模块stick,扩充调度算法

sticky模块与Ip_hash都是与负载均衡算法相关,效果相似同一客户端请求访问时会被调度到同一后端服务器,差别是:

1.ip hash,根据客户端的IP,将请求分配到不同的服务器上
2.sticky,根据服务器给客户端浏览器发送的cookie,客户端再次请求时会带上此cookie,nginx会把有此cookie的请求转发到颁发cookie的服务器上

注意:在一个局域网内有多台主机,这些主机有不同的内网IP,但是当他们发起请求时,却只有一个外网IP,该IP是电信运营商分配在这些内网主机连接的路由器的,如果使用 ip_hash 方式,则Nginx会将请求分配到不同上游服务器,如果使用 sticky 模块,则会把请求分配到颁发cookie的服务器上,实现:内网nat用户的均衡。这是iphash无法做到的。

Sticky是基于cookie的一种负载均衡解决方案,通过分发和识别cookie,使来自同一个客户端的请求落在同一台服务器上,默认cookie标识名为route :
sticky工作机制

1.客户端首次发起访问请求,nginx接收后,发现请求头没有cookie,则以轮询方式将请求分发给后端服务器。
2.后端服务器处理完请求,将响应数据返回给nginx。
3.此时nginx生成带route的cookie,返回给客户端。route的值与后端服务器对应,可能是明文,也可能是md5、sha1等Hash值
4.客户端接收请求,并保存带route的cookie。
5.当客户端下一次发送请求时,会带上route,nginx根据接收到的cookie中的route值,转发给对应的后端服务器

现在很多网站走的都是cdn,都是有缓存的:
在这里插入图片描述
CDN是一种分布式集群,只要作用就是缓存,目的有两点:1.加速客户端的访问(就是个cache,CDN可以通过nginx做二次开发,因为nginx支持缓存和反向代理)2.降低后端real server的负载。

工作流程:
client---->dns---->CDN(cache)缓存中没有时可以向邻居找,邻居也没有时会去源站寻找 ----->server---->CDN(cache)做缓存---->client

所以从上面的机制可以看出,server端拿到的IP并不是客户端IP而是CDN的IP。也就是说nginx服务器端server5的反向代理机制,对于后端服务器来说时透明的,后端服务器无法得知客户端地址。
在这里插入图片描述

cession在服务器端,cookie在浏览器中保存的。所以可以通过浏览器的cookie来实现类似IP_hash负载均衡。但是社区版nginx不支持该算法,需要nginxplus才可以。如果想要使用该算法,需要对当前nginx模块进行扩展。

1.下载扩展包

扩展包名字:nginx-goodies-nginx-sticky-module-ng-08a395c66e42.zip
由于nginx是静态编译,所以每次增加新功能时都需要重新编译,而且要加载之前的所有参数。

下载扩展包,安装解压工具并解压
在这里插入图片描述在这里插入图片描述清除原编译二进制程序
在这里插入图片描述

2.重新编译并添加新的模块

[root@server5 nginx-1.20.2]# ./configure --with-http_ssl_module --with-http_stub_status_module --prefix=/usr/local/nginx --add-module=/root/nginx-goodies-nginx-sticky-module-ng-08a395c66e42
由于nginx是静态编译,所以每次增加新功能时都需要重新编译,而且要加载之前的所有参数,不加的话就会丢失。

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

3.进行优化

编译时关闭gcc的debug模式

[root@server5 nginx-1.20.2]# vim auto/cc/gcc
可以关闭gcc的debug模式,这样编译出的二进制程序会更小


# debug
#CFLAGS="$CFLAGS -g"

在这里插入图片描述关闭版本显示

[root@server5 nginx-1.20.2]# vim src/core/nginx.h
nginx核心源代码

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

4.编译make

切记不要进行make install安装,因为软件已经安装过,现在直是去更新,执行make install 会进行覆盖安装

在这里插入图片描述

5.覆盖原二进制程序

[root@server5 nginx-1.20.2]# cd objs/
[root@server5 objs]# ls
[root@server5 objs]# du -h nginx
[root@server5 objs]# cp nginx /usr/local/nginx/sbin/
cp: overwrite ‘/usr/local/nginx/sbin/nginx’? y
[root@server5 objs]# cd /usr/local/nginx/sbin/
[root@server5 sbin]# ls
nginx
[root@server5 sbin]# du -h nginx 
936K	nginx

覆盖结束后,更新完成
在这里插入图片描述

6.修改配置文件进行验证

[root@server5 sbin]# cd /usr/local/nginx/conf/
[root@server5 conf]# ls
fastcgi.conf          fastcgi_params.default  mime.types          nginx.conf.default   uwsgi_params
fastcgi.conf.default  koi-utf                 mime.types.default  scgi_params          uwsgi_params.default
fastcgi_params        koi-win                 nginx.conf          scgi_params.default  win-utf
[root@server5 conf]# vim nginx.conf
[root@server5 conf]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@server5 conf]# nginx  #启动nginx

在这里插入图片描述

在这里插入图片描述

7.浏览器域名访问进行验证

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

8.当浏览器使用域名访问出现解析错误时


解决方法一: 先清除浏览器缓存,防止之前的地址解析缓存干扰

解决方法二: 通过浏览器访问IP进行验证
\

通过IP进行访问时,默认访问Nginx的第一个虚拟主机localhost,此时可以通过proxy_pass将服务传递给

负载组westos,Nginx配置如下。

在这里插入图片描述

当浏览器使用IP访问Nginx服务端时,默认访问第一个虚拟服务器localhost,再通过location匹配和

proxy_pass,将服务传递给负载组westos,效果如下图。

在这里插入图片描述在这里插入图片描述
在这里插入图片描述
上面实验中apache服务器就是real server,属于web层,接入层之后就是到达lamp架构了,接入层有高可用和负载均衡集群。

五、nginx的一些常规配置

RS其实就是web层,也就到达了lamp架构,也就是接入层之后就是lamp架构,接入层有高可用和负载均衡集群,电商公司一般都会使用lamp架构。nginx的反向代理只是其中功能之一,更多的时候是作为web服务器使用。

1.修改nginx使用用户

[root@server5 ~]# ps aux
[root@server5 ~]# useradd nginx
[root@server5 ~]# id  nginx

[root@server5 conf]# vim nginx.conf
[root@server5 conf]# nginx -t 
[root@server5 conf]# nginx -s reload

在这里插入图片描述

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

2.设置脚本实现nginx开机自启动

Systemd下服务脚本说明
命令行和脚本作用是一样的,服务脚本主要是为了开机自启,操作时是命令行多一些。

[root@server5 /]# cd /usr/lib/systemd/system
[root@server5 system]# vim nginx.service
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target

[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target

[root@server5 system]# systemctl daemon-reload
[root@server5 system]# nginx -s stop  #命令行打开的时候,无法关闭,所以先用命令行关闭
[root@server5 system]# systemctl start nginx
[root@server5 system]# ps aux

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

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

六、nginx并发优化

1.设置nginx的work进程数

推荐按cpu数目设定,和cpu核心数相同即可
nginx的master进程和worker进程,以及worker绑定cpu内核的原因

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

在这里插入图片描述nginx官方推荐的就是一个work对应一个cpu核心,而且最好是进行捆绑。
设定为自动的情况下有可能会导致不均匀的情况,所以手动设定,并进行捆绑。

cpu是按照cpu的时间分片进行负载的,因为cpu太快了,所以cpu调动线程是安装平均的时间分片进行负载的,当前时间分片是1线程的话,下一个时间分片就会是2分片,因为cpu的轮询太快了,所以直观上是多任务的,但实际上是轮询的。这种cpu资源是共享的,比如开了两个worker,这两个worker会共享两个cpu核心的时间分片,也就是同一个worker当前是由核心1处理的,下一时刻就会是核心2处理,这就是多核心的功能。并行就是操作系统只要有空闲资源就可以调用,默认机制是以最快的调度效率完成用户任务工作。这样就会导致一个问题,因为实际工作当中,cpu的工作机制是每个cpu核心会管控离自己最近的内存,比如硬件上插两个cpu,每个cpu会管控一片内存,也就是缓存不同,具体可以查看操作系统原理或计算机架构。如果不进行绑定,会导致cpu因上下文切换而造成损耗,绑定后,效率更高也就是命中率更高
cpu上下文切换
nginx的master进程和worker进程,以及worker绑定cpu内核的原因

worker_processes  2;
worker_cpu_affinity 01 10;

当有四核心时的写法
worker_processes  4;
worker_cpu_affinity 0001 0010 0100 1000;

在这里插入图片描述

2.使用linux内核的epoll的I/O复用模型,默认就是,用这个模型可以高效处理异步事件

Linux五种IO模型
在这里插入图片描述

3.修改每个work的并发线连接数

nginx出来就是为了解决c10k的问题,c10k是指并发过万的问题,所以1024太小了
修改每个work可以同时处理的并发连接数为65535
并发连接数-SBC(Simultaneous Browser Connections),并发连接数是指客户端向服务器发起请求,并建立TCP连接。每秒钟服务器连接的总TCP数量,就是并发连接数。

worker_connections  65535;

在这里插入图片描述因为操作系统的限制,上述设定并不生效
每建立一个网络连接,就会消耗Linux内核的一个文件描述服务。在应用层面设置并发连接数,需要看操作系统是否允许,操作系统允许还需要看内核是否允许,内核的权重最高,内核一般没问题,因为内核里的值是根据操作系统的内存设定
在这里插入图片描述
内核限制最高,接着是操作系统的限制,最后才是app应用层。
在这里插入图片描述
可以看到内核没有问题,所以向需要对操作系统进行修改,操作系统是通过热插拔模块控制的,热插拔模块调用了limits模块。
热插拔模块

[root@server5 conf]# vim /etc/security/limits.conf 
nginx   -       nofile  65535
改了即生效

在这里插入图片描述

注意:worker_processes //工作进程数
worker_connections //单个工作进程并发连接数

nginx作为http服务器时:
max_clients = worker_processes * worker_connections

nginx作为反向代理服务器时:
max_clients = worker_processes * worker_connections / 2
因为nginx作为反向代理时需要与sever和客户端相连,同时消耗两个连接数。

3.开启文件高效传输模式

开启文件高效传输模式sendfile on,同时设置tcp_nopush 和tcp_nodelay 为on,可以防止网路和磁盘IO阻塞。这也是Nginx比Apache快的原因,避免应用层和内核层面的交互,也就是用户空间和内核空间的交互,因为数据传输都需要在内核空间和用户空间进行切换。
高级I/O函数之sendfile函数
在这里插入图片描述

Nginx比apache快的原因:
  Nginx比Apache快的原因1
  Nginx比Apache快的原因2

sendfile on;
tcp_nopush on; 
tcp_nodelay on;

4.nginx的loaction优先级匹配

location 匹配规则
location匹配优先级

location = /uri		=表示精准匹配,只有完全匹配上才生效
location  /uri		不带任何修饰符,也表示前缀匹配,但是在正则匹配之后
location  /			通用匹配,任何未匹配到其他location的请求都会匹配到
location  ^~ /uri	开头对URL路径进行前缀匹配,并且在正则之前,一旦匹配到最长匹配,则不再查找其他匹配
location ~	pattern	表示区分大小写的的正则匹配
location ~* pattern 表示不区分大小写的正则匹配,如果有多个location匹配,则选择匹配最长的的那个	

在这里插入图片描述

七、nginx的平滑升级

阿里的Tengine的内存热生效并没有分发出来,所谓热生效是指修改完配置文件后,不需要reload将配置文件加载到内存中。之所以需要内存热生效,是因为reload需要成本,reload就是把配置文件加载到内存中,消耗的时间很短,但还是有损耗,特别是当服务器的数量很多的时候。
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

1.下载新版nginx,并解压,并关闭编译的debug,不隐藏版本信息

不隐藏版本信息是为了看到效果
在这里插入图片描述
下载源安装包并解压

[root@server5 ~]# wget http://nginx.org/download/nginx-1.21.5.tar.gz
[root@server5 ~]# tar zxf nginx-1.21.5.tar.gz

在这里插入图片描述
修改配置,禁掉gcc在编译时的dubug,减小编译后产生的二进制可执行文件的大小
切记不禁用版本号,否则无法看出是否进行升级和回退

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2.在解压目录下执行编译

只做make,不做make install

[root@server5 ~]# cd nginx-1.21.5
[root@server5 nginx-1.21.5]# ./configure --with-http_ssl_module --with-http_stub_status_module --prefix=/usr/local/nginx --add-module=/root/nginx-goodies-nginx-sticky-module-ng-08a395c66e42

[root@server5 nginx-1.21.5]# make

在这里插入图片描述

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

3.备份原程序,拷贝新程序

alias命令用于设置指令的别名

cp –i 若目标文件已存在,则会询问是否覆盖。语法格式 cp -i 源文件 目标文件

在这里插入图片描述

4.获取当前nginx主进程pid

在这里插入图片描述

5.唤醒新版本的二进制程序进程

[root@server5 sbin]# kill -USR2 3593

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

6.关闭原worker进程但保留主进程:为了回退

老版本的进程自动回收,新版本会自动接替。

[root@server5 sbin]# kill -WINCH 3593

平滑升级完成,正果过程服务没有关闭
在这里插入图片描述

7.版本回退

当升级完成之后,发现版本有问题时,可以回退。

还原老版本nginx程序
[root@server5 sbin]# cd /usr/local/nginx/sbin
[root@server5 sbin]# \cp -f nginx.old nginx

唤醒原进程
[root@server5 sbin]# kill -HUP 3593

回收新版本的worker进程
[root@server5 sbin]#  kill -WINCH 13249

关闭新版本主进程: kill -QUIT 13249

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

多于少的区别

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

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

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

打赏作者

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

抵扣说明:

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

余额充值