Nginx服务

目录

一.Nginx概念

二.Nginx安装

2.1.Nginx编译

2.2.yum安装

三.Nginx使用

四.Nginx与Apache对比

五.Nginx服务调优

六.Nginx的信号使用

七.Nginx的核心配置指令

1)访问状态统计配置

2)基于授权的访问控制

3)基于客户端访问控制

4)基于域名的nginx虚拟主机

5)基于IP的nginx虚拟主机

6)基于端口的nginx虚拟主机


一.Nginx概念

Nginx 功能介绍

  • 静态的web资源服务器html,图片,js,css,txt等静态资源
  • http/https协议的反向代理 7层
  • 结合FastCGI/uWSGI/SCGI等协议反向代理动态资源请求
  • tcp/udp协议的请求转发(反向代理) 4层

基础特性

  • 模块化设计,较好的扩展性
  • 高可靠性
  • 支持热部署:不停机更新配置文件,升级版本,更换日志文件
  • 低内存消耗:10000个keep-alive连接模式下的非活动连接,仅需2.5M内存
  • event-driven,aio,mmap,sendfile

Web 服务相关的功能

  • 虚拟主机(server)
  • 支持 keep-alive 和管道连接(利用一个连接做多次请求)
  • 访问日志(支持基于日志缓冲提高其性能)
  • url rewirte

路径别名

  • 基于IP及用户的访问控制
  • 支持速率限制及并发数限制
  • 重新配置和在线升级而无须中断客户的工作进程

Nginx简介

  • 作用:支持七层(应用层)和四层(传输层)反向代理、可做web服务器。
  • 特性:高可靠性、支持热部署、可扩展性好、高并发高性能、单机部署。
  • 进程:一个主进程master生成多个worker子进程,worker子进程负责处理工作。

I/O模型相关概念

  • Nginx服务使用异步非阻塞模式:请求不需要排队,会反馈任务的完成结果。
  • Apache服务使用同步阻塞模式:请求需要排队,且不会主动返回结果。
  • 同步/异步:关注的是消息通信机制,即调用者在等待一件事情的处理结果时。被调用者是否提供完成。
  • 同步:调用者需要主动询问结果。
  • 异步:调用者不需要主动询问结果,被调用者会主动返回结果。
  • 阻塞:系统同时只能处理1个请求,另外的请求需要排队。
  • 非阻塞:系统同时处理多个请求。

Nginx事件驱动模型

  • select:一个应用程序,代理系统功能处理异步请求,最大连接数是1024个。它仅仅知道了,有I/O事件发生了,却并不知道是哪那几个流(可能有一个,多个,甚至全   部),我们只能无差别轮询所有流,找出能读出数据,或者写入数据的流,对他们进行操作。所以 select具有O(n)的无差别轮询复杂度,同时处理的流越多,无差别轮询时间就越长。
  • poll:select加强版取消了1024最大连接数。poll本质上和select没有区别,它将用户传入的数组拷贝到内核空间,然后查询每个fd对应的设备状态, 但是它没有最大连接数的限制,原因是它是基于链表来存储的。
  • epoll:poll的加强版。epoll可以理解为event poll,不同于忙轮询和无差别轮询,epoll会把哪个流发生了怎样的I/O事件通知我们。所以我们说epoll实际上是事件驱动(每个事件关联上fd)的,此时我们对这些流的操作都是有意义的。

Nginx模块与作用

  • main模块:全局配置模块,所有模块都要执行遵守。配置运行nginx服务器的用户(组)、worker_process数(进程)、nginx进程PID存放路径、错误日志存放路径、配置文件的引入等
  • stream服务模块:实现反向代理功能,包括TCP协议代理
  • 邮件服务模块:主要用于支持 Nginx 的邮件服务。对 POP3 协议、 IMAP 协议和 SMTP协议的支持
  • 第三方模块:二次开发,为了扩展 Nginx 服务器应用,完成开发者自定义功能。Json 支持、 Lua 支持等。
  • events模块:影响nginx服务器与用户的网络连接。

       events {                                              #events模块设置

       woker_connections 65536;                #设置单个工作进程最大并发连接数

       use epoll;                                           #事件驱动类型选择为epoll

       accept_mutex on;                              #同一时刻一个请求轮流由work进程除了,即轮询

       multi_accept on;                                #每个工作进程同时接受多个网络连接   }

  • http模块:跟web服务相关,主要用于扩展标准的 HTTP 功能,让 Nginx 能处理一些特殊的服务,包含几个子模块。自定义服务日志、允许sendfile方式传输文件、连接超时时间、单连接请求数上限、Flash 多媒体传输 、解析 GeoIP 请求、 网络传输压缩 、 安全协议 SSL 支持等
  • location模块:uri网址定位
  • server模块:服务模块。配置80端口监听、虚拟主机、DNS域名解析等
  • auth_basic模块:对网页设置用户名密码
  • gzip模块:压缩
  • proxy模块:设置后端IP地址、端口号及http和加密的https
  • ssl模块:https加密

Nginx三大作用:反向代理、负载均衡、动静分离

    反向代理:在服务端 配置,客户端 访问服务器A ,服务器A 为代理服务器 ,将客户服务再转发到服务器B

           作用:缓存,将服务器的响应缓存在自己的内存中,减少服务器压力;

                      负载均衡,将用户请求分配给多个服务器;

                      访问控制

    正向代理:在客户端 配置,配置完了再去访问具体服务,即代理服务器 代理了客户端 ,再去和目标服务器 进行交互

           作用:提高访问速度

                      隐藏客户端真实IP地址

    负载均衡:分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务

Nginx七层负载均衡调度算法(六种)

    1、轮询(默认调度算法)

    特点:每个请求按时间顺序逐一分配到不同的后端服务器处理。
    适用业务场景:后端服务器硬件性能配置完全一致,业务无特殊要求时使用。

    upstream backendserver {
    server 192.168.0.14:80 max_fails=2 fail_timeout=10s;
    server 192.168.0.15:80 max_fails=2 fail_timeout=10s;
    }
    2、加权轮询

    特点:指定轮询几率,weight值(权重)和访问比例成正比,用户请求按权重比例分配。
    适用业务场景:用于后端服务器硬件性处理能力不平均的情形。

    upstream backendserver {
    server 192.168.0.14:80 weight=5 max_fails=2 fail_timeout=10s;
    server 192.168.0.15:80 weight=10 max_fails=2 fail_timeout=10s;
    }
    3、ip_hash(IP哈希)

    特点:每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session会话保持问题。
    适用业务场景:适用于需要账号登录的系统,会话连接保持的业务。

    upstream backendserver {
    ip_hash;
    server 192.168.0.14:80 max_fails=2 fail_timeout=10s;
    server 192.168.0.15:80 max_fails=2 fail_timeout=10s;
    }
    4、最少连接数 least_conn

    特点:按nginx反向代理与后端服务器之间的连接数,连接数最少的优先分配。

    适用业务场景:适用于客户端与后端服务器需要保持长连接的业务。

    upstream backendserver {
    least_conn; server 192.168.0.14:80 max_fails=2 fail_timeout=10s;
    server 192.168.0.15:80 max_fails=2 fail_timeout=10s;
    }

    5、加权最少连接数。响应时间 fair(需编译安装第三方模块 ngx_http_upstream_fair_module)

    特点:按后端服务器的响应时间来分配请求,响应时间短的优先分配。
    适用业务场景:对访问响应速度有一定要求的业务。

    upstream backendserver {
    fair;
    server 192.168.0.14:80 max_fails=2 fail_timeout=10s;
    server 192.168.0.15:80 max_fails=2 fail_timeout=10s;
    }

    6、url_hash(URL分配 )(需编译安装第三方模块 ngx_http_upstream_hash_module)

    特点:按访问url的hash结果来分配请求,使同一个url访问到同一个后端服务器。

    适用业务场景:适用于后端服务器为缓存服务器时比较有效。

    upstream backendserver {
    server 192.168.0.14:80 max_fails=2 fail_timeout=10s;
    server 192.168.0.15:80 max_fails=2 fail_timeout=10s;
    hash $request_uri;
    }

动静分离:采用代理的方式,在server{}段中加入带正则匹配的location来指定匹配项针对PHP的动静分离:静态页面交给Nginx处理,动态页面交给PHP-FPM模块或Apache处理。

    在Nginx的配置中,是通过location配置段配合正则匹配实现静态与动态页面的不同处理方式,通过使用Nginx提高网站的响应速度,优化用户体验

Nginx和Apache的差异

Apache:同步多进程模型:一个连接对应一个进程(高稳定)

                1.rewrite更强大(rewrite主要功能是实现统一资源定位符URL的跳转)

                2.模块多,基本想到的都可以找到

                3.少bug,更加稳定(nginx相对较多)

                4.PHP支持比较简单(nginx需要配合其他后端用)

                5.处理动态请求更有优势(nginx更适合静态与反向)

Nginx:异步非阻塞模型:多个连接(万级别)对应一个进程(高性能)

                1.轻量级,采用C编写,占用更少的内存与资源

                2.抗并发/高并发,以epoll and kqueue 作为开发模型,负载能力高,高并发下能够保持                     低资源低消耗高性能(apache在PHP处理慢或前端压力很大时,容易出现进程数飙升                     从而拒绝服务)

                3.处理静态文件好,静态处理性能比apache高三倍以上

                4.设计高度模块化,编写模块相对简单

                5.配置简洁,正则配置更简单,且更改完可以使用 -t 测试(apache配置复杂,重启时发                     现出错,会很崩溃)

                6.作为负载均衡服务器,支持七层负载均衡,可以有效防止ddos攻击

                7.本身是一个反向代理服务器,也可以作为邮件代理服务器使用

                8.支持热部署,支持在线升级

二.Nginx安装

2.1.Nginx编译

nginx安装官网:nginx: download

1)关闭防火墙,将安装nginx所需软件包传到/opt目录下

systemctl stop firewalld
systemctl disable firewalld
setenforce 0

wget http://nginx.org/download/nginx-1.20.2.tar.gz  -P /opt  #wget下载,-P指定下载到/opt目录

2)安装扩展包,官方源默认没有Nginx的yum源,使用yum部署Nginx需要先安装epel-release扩展包

yum install epel-release  -y    #安装epel-release扩展源

3)依赖包、扩展源安装完后直接安装Nginx。yum安装的nginx配置文件位置在:/etc/nginx.conf。默认根目录在:/usr/share/nginx/html。默认日志文件在:/var/log/nginx/路径下。

yum install nginx -y                #安装nginx服务

4)创建建运行用户、组(Nginx 服务程序默认以 nobody 身份运行,建议为其创建专门的用户账号,以便更准确地控制其访问权限)

useradd -M -s /sbin/nologin nginx    #新建nginx用户方便管理

5)安装包下载完成后安装编译需要的依赖环境和工具,然后进入对应的目录进行解压编译

yum -y install gcc pcre-devel openssl-devel zlib-devel      #安装编译安装需要的依赖包和工具

cd /opt     #进入指定安装包下载的目录 /opt下

tar xf nginx-1.20.2.tar.gz     #将nginx包解压到当前文件夹

cd nginx-1.20.2        #进入解压后nginx包中

mkdir /apps/nginx  -p

./configure     #执行当前目录下的configure脚本检测编译安装环境和工具
--prefix=/apps/nginx \   #执行脚本时指定路径为 /apps/nginx文件夹中,若没有此文件夹需要先创建再进行编译指定
--user=nginx \   #指定用户为nginx用户
--group=nginx \  #指定组为nginx组
--with-http_ssl_module \  #with都是编译时安装的指定模块
--with-http_v2_module \
--with-http_realip_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-pcre \
--with-stream \
--with-stream_ssl_module \
--with-stream_realip_module

方便一键复制:
./configure --prefix=/apps/nginx \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_stub_status_module \
--with-http_gzip_static_module \
--with-pcre \
--with-stream \
--with-stream_ssl_module \
--with-stream_realip_module


make     #执行完成检测编译安装环境和工具后将nginx安装包翻译为二进制
make install      #翻译完成后将包写入磁盘中

chown -R nginx.nginx /apps/nginx  #递归设置属主属组

6)创建软连接后直接 nginx启动

ln -s /apps/nginx/sbin/nginx /usr/sbin/

创建Nginx 自启动文件:

vim /usr/lib/systemd/system/nginx.service
 
[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target
[Service]
Type=forking
PIDFile=/apps/nginx/logs/nginx.pid
ExecStart=/apps/nginx/sbin/nginx -c /apps/nginx/conf/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
[Install]
WantedBy=multi-user.target

7)重新加载配置、设置开机自启并开启服务

systemctl daemon-reload          #重新加载配置
systemctl enable --now nginx     #开机自启并立即启动
systemctl status nginx.service   #查看服务状态(验证)

8)写进磁盘完成后进入部署的文件夹使用绝对路径启动nginx服务,然后查看是否有nginx进程,查看到进程就代表Nginx编译完成

/apps/nginx/sbin/nginx                 #使用绝对路径启动nginx
ps aux |grep nginx                       #查看是否有nginx进程

2.2.yum安装

Centos7 需要安装epel源
 
cd /etc/yum.repos.d
vim epel.repo
[epel]
name=epel
baseurl=https://mirrors.aliyun.com/epel/$releasever/x86_64
gpgcheck=0
 
yum install -y epel-release
 
yum install nginx -y

三.Nginx使用

1)基础使用

  • nginx -V 查看安装了那些模块
  • nginx -v 查看版本号
  • nginx -s 发送信号 后面可以跟stop、reload、quit、reopen
  • nginx -t 检查著配置文件语法
  • nginx -g 修改执行用户ps aux |grep nginx中查看。需要注销配置文件中的user nginx中。nginx -g "daemon off"前台运行,默认后台运行容器中需要使用。
  • nginx -c 指定配置文件,一般用于.service文件中

注意:以上命令若非yum安装使用时要使用绝对路径调用nginx命令,或将编译安装路径中的sbin文件夹中的nginx程序拷贝到/usr/sbin路径下。

信号  

解释
nginx -v  显示版本
nginx -V显示编译详细情况、模块等信息
nginx -t检查语法格式
nginx -T打印当前配置
nginx -s发送信号
nginx -s stop优雅退出,不影响业务的状态下退出
nginx -s reload重新加载配置文件
nginx -s  USR1分割日志
nginx -s  USR2优雅升级
nginx -g 'user lisi;'以李四身份运行,默认是以nginx身份
nginx -g 'daemon off;'前台运行命令

2)nginx信号

  • quit信号 -----SIGTERM,直接停止,不等服务执行完,nginx -s quit或kill -TERM执行。
  • stop信号-----SIGQUIT,优雅的退出,等所有服务执行完再退出,nginx -s stop 或kill -QUIT执行。
  • reopen信号---SIGUSER1 分隔日志。
  • 创建新的nginx日志时需要发送USER1信号给nginx主进程才可以生效。kill -USER1 nginx主进程pid号。
  • SIGUSER2信号,优雅的升级,不影响正在使用的用户,kill -USER2执行。
  • reload信号----SIGHUP 重新加载配置文件,nginx -s  reload或kill -HUP执行。

注意:以上命令若非yum安装使用时要使用绝对路径调用nginx命令,或将编译安装路径中的sbin文件夹中的nginx程序拷贝到/usr/sbin路径下。

四.Nginx与Apache对比

  • Nginx使用异步非阻塞工作模式,Apache使用同步阻塞模式。
  • Nginx处理静态资源更好,Apache处理动态资源更好。
  • Nginx是轻量级web服务器,耗费资源比Apache少。
  • Nginx抗并发性更好,Apache更稳定。
  • Apache对接PHP简单,Nginx对接需要借助其他后端工具。

五.Nginx服务调优

  • 根据cpu数量配置master有多少个worker子进程。

       配置文件全局中修改:work_processes auto(表示根据cpu数量决定个数)。

  • 设置长链接超时时间。

        keepalive_timeout 50。

  • 调整nginx进程优先级。

        worker_priority -20  (范围-20到19,越小优先级越高)

  • 调整nginx可打开文件数量。

        worker_rlimit_nofile 65536;

        需要配合修改内核参数vim /sercurity/limits.conf文件中加入下面参数重启机器即可。

        *soft nofile 数量

        *hard nofile 数量

  • 调整每个worker进程可打开文件数量,注意需要配合nginx总共可以打开文件数量限制。

         worker_connections  数量;

  • 隐藏nginx版本号在http模块中添加以下参数。

         server_tockens off

六.Nginx的信号使用

nginx 命令支持向其发送信号,实现不同功能

nginx -h      #查询nginx信号使用规则

七.Nginx的核心配置指令

1)访问状态统计配置

①查看已安装的 Nginx 是否包含http_stub_status模块

cd /apps/nginx/sbin/ 
nginx -V                              #显示编译详细情况、模块等信息

②修改 nginx.conf 配置文件,指定访问位置并添加 stub_status 配置(修改之前进行备份)

cd /apps/nginx/conf
cp nginx.conf nginx.conf.bak           #备份
vim nginx.conf
 
    server {
        listen       80;
        server_name  www.clj.com;
 
        charset utf-8;
 
        #access_log  logs/host.access.log  main;
 
        location / {
            root   html;
            index  index.html index.htm;
        }
        ##添加 stub_status 配置
        location /status {				##访问位置为/status
            stub_status on;				##打开状态统计功能
            access_log off;				##关闭此位置的日志记录
        }
 

③重启服务后进行访问测试

systemctl restart nginx.service

Active connections: 2
server accepts handled requests
 2  2  3
上面三个数字(2  2  3)分别对应accepts,handled,requests三个值
Reading: 0 Writing: 1 Waiting: 1

Active connections:
#当前处于活动状态的客户端连接数,包括连接等待空闲连接数=reading+writing+waiting
accepts:
#统计总值,Nginx自启动后已经接受的客户端请求的总数。
handled:
#统计总值,Nginx自启动后已经处理完成的客户端请求总数,通常等于accepts,除非有因worker_connections限制等被拒绝的连接
requests:
#统计总值,Nginx自启动后客户端发来的总的请求数。
Reading:
#当前状态,正在读取客户端请求报文首部的连接的连接数,数值越大,说明排队现象严重,性能不足
Writing:
#当前状态,正在向客户端发送响应报文过程中的连接数,数值越大,说明访问量很大
Waiting:
#当前状态,正在等待客户端发出请求的空闲连接数,开启 keep-alive的情况下,这个值等于active – (reading+writing)

2)基于授权的访问控制

①生成用户密码认证文件

yum install -y httpd-tools        #安装工具
 

htpasswd -c /apps/nginx/passwd.db zhangrui     #生成用户密码认证文件(注意路径)
 

chown nginx /apps/nginx/passwd.db
chmod 400 /apps/nginx/passwd.db
#修改属性和赋予执行权限

②修改主配置文件相应的目录,添加认证配置

vim /apps/nginx/conf/nginx.conf(注意你的安装路径)
 
 location / {
            root   html;
            index  index.html index.htm;
            #添加认证配置
            auth_basic "secret";                    #设置密码提示框文字信息
            auth_basic_user_file /apps/nginx/passwd.db;
        }

③检查错误,重启服务,访问测试

nginx -t    #检查语法错误
systemctl restart nginx.service     #重启服务
curl 192.168.47.102    #访问测试

3)基于客户端访问控制

访问控制规则如下:
deny IP/IP段:拒绝某个IP或IP段的客户端访问。
allow IP/IP段:允许某个IP或IP段的客户端访问。
规则从上往下执行,如果匹配到则停止,不会再往下继续匹配。

①在主配置文件中添加控制规则,重启服务,被拒绝的客户端访问测试 ,其他客户端访问测试 

vim /apps/nginx/conf/nginx.conf(注意你的安装路径)
 
        location / {
            root   html;
            index  index.html index.htm;
            auth_basic "secret";
            auth_basic_user_file /apps/nginx/passwd.db;
            
            # 添加控制规则
            deny 192.168.47.101;					#拒绝访问的客户端IP
            allow all;							    #允许其他所有客户端访问
        }

重启服务:

systemctl restart nginx.service

被拒绝的客户端访问测试

客户端192.168.47.101访问  curl 192.168.47.102

其他客户端访问测试 :

192.168.47.103访问 curl 92.168.47.102

4)基于域名的nginx虚拟主机

①为虚拟主机提供域名和IP的映射

echo "192.168.47.102 www.zr.com www.lw.com" >> /etc/hosts

②为虚拟主机准备网页文档

mkdir -p /var/www/html/zr/
mkdir -p /var/www/html/lw/
echo "<h1>www.zr.com</h1>" > /var/www/html/zr/index.html
echo "<h1>www.lw.com</h1>" > /var/www/html/lw/index.html

③还原nginx主配置文件

之前做过访问控制,所以直接将备份配置进行还原

cd /apps/nginx/conf(按照你自己安装的路径来)
cp nginx.conf.bak nginx.conf      #还原主配置文件

④修改主配置文件

vim  /apps/nginx/conf/nginx.conf
 
    server {
        listen       80;
        server_name  www.lw.com;                        #设置域名            
        charset utf-8;                                              #设置网页字符集
        access_log  logs/lw.com.access.log;         #设置日志名
        location / {
            root   /var/www/html/lw;                         #设置www.bxb.com的工作目录
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
    server {
        listen       80;            
        server_name  www.zr.com;                       #设置域名
        charset utf-8;                                              #设置网页字符集
        access_log  logs/zr.com.access.log;         #设置日志名
        location / {
            root   /var/www/html/zr;                          #设置www.bxb.com的工作目录
            index  index.html index.htm;
        }

⑤重启nginx后进行访问测试

systemctl restart nginx.service
curl www.lw.com
curl www.zr.com

5)基于IP的nginx虚拟主机

①添加虚拟网卡,修改主配置文件

ifconfig ens33:0 192.168.47.111/24
 
vim /apps/nginx/conf/nginx.conf
 
    server {
        listen       192.168.47.110:80;                #修改监听的为ip
        server_name  www.lw.com;
        charset utf-8;
        access_log  logs/lw.com.access.log;
        location / {
            root   /var/www/html/lw;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
    server {
        listen       192.168.47.111:80;                #修改监听的为ip
        server_name  www.zr.com;
        charset utf-8;
        access_log  logs/zr.com.access.log;
        location / {
            root   /var/www/html/zr;
            index  index.html index.htm;
        }

②检查配置文件,重启服务

nginx -t
systemctl restart nginx.service

③客户端上访问测试

curl 192.168.47.110:80
curl 192.168.47.111:80

6)基于端口的nginx虚拟主机

①修改主配置文件

vim apps/nginx/conf/nginx.conf
 
    server {
        listen       192.168.47.110:666;				#修改监听的为ip的666端口
        server_name  www.lw.com;
        charset utf-8;
        access_log  logs/lw.com.access.log;
        location / {
            root   /var/www/html/lw;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
    server {
        listen       192.168.47.111:888;			    #修改监听的为ip的888端口
        server_name  zr.com;
        charset utf-8;
        access_log  logs/zr.com.access.log;
        location / {
            root   /var/www/html/zr;
            index  index.html index.htm;
        }

②检查配置文件,重启服务

[root@xzq conf]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@xzq conf]# systemctl restart nginx.service

③客户端上访问测试

curl 192.168.47.110:666
curl 192.168.47.111:888

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值