Nginx笔记(安装+使用)

Nginx开源版安装、启动

版本区别

Nginx开源版

Nginx plus 商业版

openresty

Tengine

安装

将.tar.gz放到linux系统下, 使用tar -zxvf减压

进入减压目录>>>命令安装指令:安装到usr/local/nginx路径下

./configure --prefix=/usr/local/nginx

make && make install

出现以下报错安装依赖包

  • checking for os
    + Linux3.10.0-693.e17.x86_64 x86_64
    checking for c compiler ... not found
    
    /configure: error: C compiler cc is not found
    

    安装gccyum install -y gcc

  • /configure: error: the HTp rewrite module requires the PCRE library.
    You can either disable the module by using --without-http_rewrite_moduleoption, or install the PCRE 1ibrary into the system, or build the PCRE library
    staticaly from the source with nginx by using --with-pcre=<path> option.
    

    安装perl库yum install -y pcre pcre-devel

  • /configure: error: the HTTP gzip module requires the zlib library.
    You can either disable the module by using --without-http_gzip_moduleoption, or install the zlib library into the system, or build the zliblibrary
    statically from the source with nginx by using --with-zlib=<path> option.
    

    安装zlib库yum install -y zlib zlib-devel

启动

进入安装好的目录/usr/local/nginx/sbin

./nginx 启动
./nginx -s stop 快速停止
./nginx -s quit 优雅关闭, 在退出前完成已接受的连接请求
./nginx -s reload 重新加载配置

安装成系统服务

创建服务脚本

vim /usr/lib/systemd/system/nginx.service

服务脚本内容

脚本内容出现的路径为安装到的指定路径下,如有不同请手动修改

[Unit]
Description=nginx - web server
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
ExecQuit=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=true

[Install]
WantedBy=multi-user.target

服务命令说明

systemctl daemon-reload			重新加载系统服务
systemctl start nginx.service	启动服务
systemctl stop nginx.service	停止服务
systemctl status nginx.service	查看服务状态
systemctl reload nginx.service	重新启动(重新加载配置文件)
systemctl enable nginx.service	开机启动

目录结构

  • conf
    用来存放配置文件相关的目录
  • html
    用来存放静态文件的默认目录
  • logs
    日志文件目录
  • sbin
    nginx的主程序
  • 后缀为_temp都是nginx启动后新建的目录

基本运行原理

请添加图片描述

Nginx基础配置

请添加图片描述
nginx.conf为主配置文件

最小配置文件

初始化配置文件nginx.conf

#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;

events {
    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;
    
    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        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;
    #    }
    #}
}

将注释全部去掉后的文件

worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;

    server {
        listen       80;
        server_name  localhost;

        location / {
            root   html;
            #访问80端口,找到nginx目录下的html目录下的index.html
            index  index.html index.htm;	 
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}
文件配置说明
  • worker_processes : 工作的进程个数, 默认为1 , 表示开启一个子进程

  • events : 事件驱动模块

    • worker_connections : 每个worker进程可以接受的连接数
  • http

    • include : 引用另外的配置文件, 空格后面跟配置文件名

      mime.types文件为请求头说明的访问文件格式

    • default_type: mime.types文件中没有的格式,默认为default_type的格式

    • sendfile : 文件零拷贝 默认 on (使用linux的 sendfile(socket, file, len) 高效网络传输)

    • keepalive_timeout : 保持连接的超时时间

    • server : 可以理解为一个虚拟主机(vhost)

      • listen : 监听的端口号
      • server_name : 主机名/域名
      • location : URI
        • root : 相对路径/usr/local/nginx/下的某个目录
        • index : 默认主页文件
      • error_page : 报错代码后跳转的路径

sendfile未启动
请添加图片描述
sendfile启动
请添加图片描述

虚拟主机

原本一台服务器只能对应一个站点,通过虚拟主机技术可以虚拟化成多个站点同时对外提供服务
nginx.conf中一个server可以理解为一个虚拟主机
多个serverlisten存在相同端口会报错

server {
	listen       80;    					端口号
	server_name  localhost;					主机名/域名
	
	location / {
    	 root   html;
     	 # 访问80端口,找到nginx目录下的html目录下的index.html
    	 index  index.html index.htm;	 
  	}
}

nginx.conf配置文件中server下的server_name域名解析规则

  • server_name匹配规则
    server_name匹配分先后顺序,写在前面的匹配上就不会继续往下匹配了。
  • 完整匹配
    可以在同一server_name中匹配多个域名
    server_name vod.mmban.com www1.mmban.com;
  • 通配符匹配
    server_name *.mmban.com;
  • 通配符结束匹配
    server_name vod.*;
  • 正则匹配
    server_name ~^[0-9]+\.mmban\.com$;

正向代理、反向代理模型

反向代理

以代理服务器来接受连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器,而且整个过程对于客户端而言是透明的。

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

正向代理

一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后由代理向原始服务器转交请求并将获得的内容返回给客户端。

在这里插入图片描述

传统互联网项目

在这里插入图片描述

负载均衡

负载均衡也是Nginx常用的一个功能。简单而言就是当有2台或以上服务器时,根据规则随机的将请求分发到指定的服务器上处理,负载均衡配置一般都需要同时配置反向代理,通过反向代理跳转到负载均衡。

简单示例(关键字: proxy_pass)

修改nginx.conf配置文件中http>server>location部分(不支持https)

server {
	listen       80;    					端口号
	server_name  localhost;					主机名/域名
	
	location / {
		proxy_pass http://www.baidu.com;
		# 当使用proxy_pass负载均衡时, 以下内容不生效, 直接注释掉
    	# root   html;
    	# index  index.html index.htm;	 
  	}
}

简单负载均衡(关键字: upstream)—轮询示例

修改nginx.conf配置文件>>http>upstreamserver同级

upstream 自定义名称 {
	server 192.168.137.139:80;
	server 192.168.137.133:80;
}

server {
	listen       80;
	server_name  localhost;
	
	location / {
		proxy_pass http://自定义名称;
	}
}

负载均衡策略

  • weight :权重
  • down : 当前server暂不参与负载均衡(下线)
  • backup : 预留的备份服务器; 其它所有的非backup机器down或者忙的时候,请求backup机器。
  • max_fails : 请求失败次数限制
  • fail_timeout : 经过max_fails后服务暂停时间
  • max_conns : 限制最大的连接数

简单示例

upstrem 自定义名称{
  server 192.168.137.137:80 weight=1;
  server 192.168.137.137:8080 down;
  server 192.168.137.137:8081 backup;
  server 192.168.137.137:8082 max_fails=1 fail_timeout=10s max_conns=1024;
  server unix:/tmp/backend3;
} 

负载均衡调度算法

  • 轮询:默认算法按时间顺序逐一分配到不同的后端服务器;
  • 加权轮询:Weight值越大,分配到访问几率越高;
  • ip_hash:为每一个请求访问的IP的hash结果分配,可以将来自一个IP的固定访问一个后端服务器;
  • url_hash:需要安装模块安装访问的URL的hash结果来分配,这样每个URL定向到同一个后端服务器
  • least_conn:按照某台机器最少连接数的进行分配访问;
  • hash关键数值: hash 自定义 KEY

轮询

权重

upstream 自定义名称{
  server 192.168.137.137:8081 weight=1;
  server 193.168.137.137:8080 weight=9; 
} 

ip_hash

ip_hash 会话粘连, 用户访问的时候请求可能分发到不同服务器,当我们的程序不是无状态的时候(采用了session保存数据),这时候就有一个很大的很问题了,比如把登录信息保存到了session中,那么跳转到另外一台服务器的时候就需要重新登录了,所以很多时候我们需要一个客户只访问一个服务器,那么就需要用iphash了,iphash的每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。

# 会话粘连可以理解为用户持续访问一个后端机器
upstream 自定义名称 {
  ip_hash;
  server 192.168.137.137:8080;
  server 192.168.137.137:8081;
} 

least_conn

将请求分配到连接数最少的服务上

upstream 自定义名称 {
  least_conn;
  server 192.168.137.137:8080;
  server 192.168.137.137:8081;
} 

fail

fair(需要使用第三方软件)按后端服务器的响应时间来分配请求,响应时间短的优先分配。

upstream 自定义名称 {
  fair;
  server 192.168.137.137:8080;
  server 192.168.137.137:8081;
} 

url_hash

url_hash(需要使用第三方软件):按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。

upstream 自定义名称 {
  hash $request_uri;
  hash_method crc32;
  server 192.168.137.137:8080;
  server 192.168.137.137:8081;
} 

动静分离

动静分离是让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来,动静资源做好了拆分以后,我们就可以根据静态资源的特点将其做缓存操作,这就是网站静态化处理的核心思路

在这里插入图片描述

简单示例

nginx所在服务器ip为192.168.137.139
137nginx配置文件修改如下(将137反向代理到139上, 将css/js/img静态文件静态化到139服务器中)

server {
  listen       80;
  server_name  localhost;
	
  location / {
		proxy_pass http://192.168.137.137:8080;
	}

  # 所有静态请求都由nginx处理,存放目录为nginx中的html
  location ~*(css|js|css) {
      root   html;
      index  index.html;
  }
  
  error_page   500 502 503 504  /50x.html;
  location = /50x.html {
      root   500.html;
  }
} 

location匹配顺序

  • 多个正则location直接按书写顺序匹配,成功后就不会继续往后面匹配
  • 普通(非正则)location会一直往下,直到找到匹配度最高的(最大前缀匹配)
  • 当普通location与正则location同时存在,如果正则匹配成功,则不会再执行普通匹配
  • 所有类型location存在时,“=”匹配 > “^~“匹配 > 正则匹配 > 普通(最大前缀匹配)

URLRewrite

rewrite是URL重写的关键指令, 根据regex(正则表达式)部分类容, 重定向到replacement, 结尾是flag标记

rewrite <regex>	<replacement> [flag];
关键字	正则		替代内容		  flag标记

关键字: 		其中关键rewrite不能改变
正则: 		perl兼容正则表达式语句进行规则匹配
替代内容: 	将正则匹配的内容替换成replacement
flag标记:	rewrite支持的flag标记

rewrite参数的标签位置: server, location, if

flag标记说明:
last		#本条规则匹配完成后, 继续向下匹配新的location URI规则
break		#本条规则匹配完成即终止, 不再匹配后面的任何规则
redirect	#返回302临时重定向, 浏览器地址栏会显示跳转后的URL地址
permanent 	#返回301永久重定向, 浏览器地址栏会显示跳转后的URL地址

示例

实际url为: http://192.168.137.137/index.html?pageNum=111
浏览器url栏显示为: http://192.168.137.137/111.html

server {
  listen       80;
  server_name  localhost;
	
  location / {
  		rewrite	^/([0-9]+).html$	/index.html?pageNum=$1	break;
		proxy_pass http://192.168.137.137:8080;
  }

  # 所有静态请求都由nginx处理,存放目录为nginx中的html
  location ~*(css|js|css) {
      root   html;
      index  index.html;
  }
  
  error_page   500 502 503 504  /50x.html;
  location = /50x.html {
      root   e:wwwroot;
  }
} 

负载均衡示例

server {
  listen       80;
  server_name  localhost;
  
  upstream test {
  	server 192.168.137.139:80;
	server 192.168.137.133:80;
  }
  
  location / {
  		rewrite	^/([0-9]+).html$	/index.html?pageNum=$1	break;
		proxy_pass http://test;
  }

  # 所有静态请求都由nginx处理,存放目录为nginx中的html
  location ~*(css|js|css) {
       root   html;
      index  index.html;
  }
  
  error_page   500 502 503 504  /50x.html;
  location = /50x.html {
      root   e:wwwroot;
  }
} 

防盗链

说明

当浏览器访问静态资源时, 会二次向服务器发送请求, 这时请求头会带上referer
如果服务器设置了防盗链配置, Referer中域名与服务器防盗链设置的域名不同时, 无法访问

在这里插入图片描述

配置

valid_referers none | blocked | server_names | strings ...;
  • none: 检测Referer头域不存在的情况
  • blocked: 检测Referer头域的值被防火墙或者代理服务器删除或伪装的情况. 这种情况该头域的值不以"http://"或"https://"开头.
  • server_names: 设置一个或多个URL, 检测Referer头域的值是否是这些URL中的某一个

示例

server {
  listen       80;
  server_name  localhost;
  
  upstream test {
  	server 192.168.137.139:80;
	server 192.168.137.133:80;
  }
  
  location / {
  		rewrite	^/([0-9]+).html$	/index.html?pageNum=$1	break;
		proxy_pass http://test;
  }

  # 所有静态请求都由nginx处理,存放目录为nginx中的html
  location ~*(css|js|css) {
  	  # 防盗链设置
  	  valid_referers none 域名;
  	  # 检测是否包含上述域名, 不包含上述域名, 返回403
  	  if($invalid_referer){
		return 403;
	  }
	  
      root   html;
      index  index.html;
  }
  
  error_page   500 502 503 504  /50x.html;
  location = /50x.html {
      root   e:wwwroot;
  }
} 

高可用

将nginx所在服务器安装keepalived, 为服务器创建vip(虚拟ip), 当主服务dwon掉后, 虚拟ip就会移动到备用服务器, 这样可以保证同一个ip可以在不同服务器之间切换

在这里插入图片描述

安装Keepalived(此处为yum安装)

yum install -y keepalived

# 如果遇以下报错 安装openssl-devel依赖
configure: error:
!!! OpenSSL is not properly installed on your system. !!!
!!! Can not include OpenSSL headers files. !!!

# 安装openssl-devel依赖
yum install -y openssl-devel

配置

使用yum安装后, 配置文件所在路径为/etc/keepalived/keepalived.conf

完整的配置文件

! Configuration File for keepalived

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
   vrrp_skip_check_adv_addr
   vrrp_strict
   vrrp_garp_interval 0
   vrrp_gna_interval 0
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.200.16
        192.168.200.17
        192.168.200.18
    }
}

virtual_server 192.168.200.100 443 {
    delay_loop 6
    lb_algo rr
    lb_kind NAT
    persistence_timeout 50
    protocol TCP

    real_server 192.168.201.100 443 {
        weight 1
        SSL_GET {
            url {
              path /
              digest ff20ad2481f97b1754ef3e12ecd3a9cc
            }
            url {
              path /mrtg/
              digest 9b3a0c85a887a256d6939da88aabd8cd
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

virtual_server 10.10.10.2 1358 {
    delay_loop 6
    lb_algo rr 
    lb_kind NAT
    persistence_timeout 50
    protocol TCP

    sorry_server 192.168.200.200 1358

    real_server 192.168.200.2 1358 {
        weight 1
        HTTP_GET {
            url { 
              path /testurl/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url { 
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url { 
              path /testurl3/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

    real_server 192.168.200.3 1358 {
        weight 1
        HTTP_GET {
            url { 
              path /testurl/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334c
            }
            url { 
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334c
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

virtual_server 10.10.10.3 1358 {
    delay_loop 3
    lb_algo rr 
    lb_kind NAT
    persistence_timeout 50
    protocol TCP

    real_server 192.168.200.4 1358 {
        weight 1
        HTTP_GET {
            url { 
              path /testurl/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url { 
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url { 
              path /testurl3/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }

    real_server 192.168.200.5 1358 {
        weight 1
        HTTP_GET {
            url { 
              path /testurl/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url { 
              path /testurl2/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            url { 
              path /testurl3/test.jsp
              digest 640205b7b0fc66c1ea91c463fac6334d
            }
            connect_timeout 3
            nb_get_retry 3
            delay_before_retry 3
        }
    }
}

主服务器最小配置文件

! Configuration File for keepalived

global_defs {
   # 配置id
   router_id lb137
}

# keepalived内网通信协议
vrrp_instance test {
    # 配置主机(备用机)
    state MASTER
    # 配置所在网卡名称
    interface ens33
    
    virtual_router_id 51
    # 优先级, 主备竞选时, 哪个高哪个为主
    priority 100
    # 间隔检测时间
    advert_int 1
    # 设置分组 
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    # 虚拟ip地址, 可配置多个
    virtual_ipaddress {
        192.168.137,200
      # 192.168.137.201
    }
}

备服务器最小配置文件

! Configuration File for keepalived

global_defs {
   # 配置id
   router_id lb139
}

# keepalived内网通信协议
vrrp_instance test {
    # 配置主机(备用机)
	    state BACKUP
    # 配置所在网卡名称
    interface ens33
    
    virtual_router_id 51
    # 优先级, 主备竞选时, 哪个高哪个为主
    priority 50
    # 间隔检测时间
    advert_int 1
    # 设置分组 
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    # 虚拟ip地址, 可配置多个
    virtual_ipaddress {
        192.168.137.200
      # 192.168.137.201
    }
}

!!!需要注意

  • vrrp_instance
  • virtual_router_id
  • authentication
    • auth_type
    • auth_pass

对应的内容需一致, 方能组成一组

启动、停止、重启、查看状态命令

systemctl start keepalived		# 启动
systemctl stop keepalived		# 停止
systemctl restart keepalived	# 重启
systemctl status keepalived		# 查看状态
systemctl reload keepalived		# 刷新配置

使用脚本检测nginx是否down, 同时让keepalived关闭

后续补充

Https证书配置

对称加密

在这里插入图片描述

openssl

SSL协议库、应用程序以及密码算法库

证书申请

参考视频

证书安装

nginx.conf配置文件

server {
	listen 443 ssl;
	server_name 域名/主机名;

	ssl_certificate	上传到服务器中的.crt/.pem文件路径;
	# ssl_certificate	/root/xxx/xxx.pem;  	文件绝对路径
	# ssl_certificate	 xxx.pem; 				文件相对路径 相对于 /usr/local/nginx/conf/
	ssl_certificate_key 上传到服务器中的.key文件路径;
	# ssl_certificate_key /root/xxx/xxx.key;	文件绝对路径
	# ssl_certificate_key  xxx.key				文件相对路径 相对于 /usr/local/nginx/conf/
	
}

http协议跳转https

return 301 https://$server_name$request_uri;
在配置文件中位置

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;
	server {
		listen 443 ssl;
		server_name 域名/主机名;
	
		ssl_certificate	上传到服务器中的.crt/.pem文件路径;
		ssl_certificate_key 上传到服务器中的.key文件路径;
	}
    server {
        listen       80;
        server_name  localhost;

        location / {
           return 301 https://$server_name$request_uri;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值