linux lnmp | memcache给php/nginx缓存 | tomcat+memcace实现session共享交叉存储

本文介绍了LNMP(Linux+Nginx+MySQL+PHP)架构及其优缺点,详细阐述了工作流程、CGI与FastCGI的区别以及php-FPM的作用。内容包括如何搭建LNMP环境,为PHP添加Memcache缓存以提升访问速度,以及在Tomcat中结合Memcache实现session共享。同时,讨论了在高并发下的优化策略,如使用Nginx缓存和跨服务器session共享。
摘要由CSDN通过智能技术生成

LNMP

LNMP代表的就是:Linux系统下Nginx+MySQL+PHP这种网站服务器架构。
Linux是一类Unix计算机操作系统的统称,是目前最流行的免费操作系统。Nginx是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP代理服务器。
Mysql是一个小型关系型数据库管理系统。
PHP是一种在服务器端执行的嵌入HTML文档的脚本语言。

LNMP优点和缺点

LNMP方式的优点:占用VPS资源较少,Nginx配置起来也比较简单,利用fast-cgi的方式动态解析PHP脚本。基于 LAMP 架构设计具有成本低廉、部署灵活、快速开发、安全稳定等特点,是 Web 网络应用和环境的优秀组合
LNMP方式的缺点:php-fpm组件的负载能力有限,在访问量巨大的时候,php-fpm进程容易僵死,容易发生502 bad gateway错误

LNMP工作流程

在LNMP组合工作时,首先是用户通过浏览器输入域名请求Nginx Web服务,如果请求是静态资源,则由Nginx解析返回给用户;如果是动态请求(.php结尾),那么Nginx就会把它通过FastCGI接口(生产常用方法)发送给PHP引擎服务(FastCGI进程php-fpm)进行解析,PHP-FPM不做处理,然后PHP-FPM调用PHP解析器进程,PHP解析器解析php脚本信息。PHP解析器进程可以启动多个,进行并发执行,如果这个动态请求要读取数据库数据,那么PHP就会继续向后请求MySQL数据库,以读取需要的数据,php-fpm 处理完请求,返回给nginx ,并最终通过Nginx服务把获取的数据返回给用户,这就是LNMP环境的基本请求顺序流程。这个请求流程是企业使用LNMP环境的常用流程。

CGI

CGI的全称为“通用网关接口”(Common Gateway Interface),为HTTP服务器与其他机器上的程序服务通信交流的一种工具,CGI程序须运行在网络服务器上,CGI可以用任何一种语言编写,只要这种语言具有标准输入、输出和环境变量。
每一次web请求都会有启动和退出过程,也就是最为人诟病的fork-and-execute模式,这样一在大规模并发下,就死翘翘了。

FastCGI

FastCGI是一个可伸缩的,高速地在HTTP服务器和动态脚本语言间通信的接口。
FastCGI像是一个常驻(long-live)型的CGI,它可以一直执行着,只要激活后,不会每次都要花费时间去fork一次。
它还支持分布式的运算, 即 FastCGI 程序可以在网站服务器以外的主机上执行,并且接受来自其它网站服务器来的请求。

特点:

FastCGI接口方式采用C/S结构,可以将HTTP服务器和脚本解析服务器分开,同时在脚本解析服务器上启动一个或者多个脚本解析守护进程。当HTTP服务器每次遇到动态程序时,可以将其直接交付给FastCGI进程来执行,然后将得到的结果返回给浏览器。这种方式可以让HTTP服务器专一地处理静态请求,或者将动态脚本服务器的结果返回给客户端,这在很大程度上提高了整个应用系统的性能。

php-FPM

php-fpm是 FastCGI 的实现,并提供了进程管理的功能。
进程包含 master 进程和 worker 进程两种进程。

搭建LNMP

1.编译安装mysql-5.7

tar zxf mysql-boost-5.7.17.tar.gz

cd mysql-5.7.17/    
yum install -y gcc gcc-c++ make ncurses-devel bison openssl-devel zlib-devel cmake-2.8.12.2-4.el6.x86_64.rpm
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/lnmp/mysql -DMYSQL_DATADIR=/usr/local/lnmp/mysql/data -DMYSQL_UNIX_ADDR=/usr/local/lnmp/mysql/data/mysql.sock -DWITH_MYISAM_STORAGE_ENGINE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DEXTRA_CHARSETS=all -DWITH_BOOST=boost/boost_1_59_0

若编译报错:

rm -rf CMakeCache.txt

解决问题后再编译

若成功

make
make install
[root@server1 support-files]# cp my-default.cnf /etc/my.cnf 

vim /etc/my.cnf

在这里插入图片描述

在这里插入图片描述

chown -R mysql.mysql /usr/local/lnmp/mysql/*

vim ~/.bash_profile

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

chown root.root . -R

chown mysql data/ -R data是mysql服务写的目录,只要这个目录的组是mysql就够了

在启动mysql后
在这里插入图片描述

Securing the MySQL server deployment.

Enter password for user root: 
Error: Access denied for user 'root'@'localhost' (using password: YES)
[root@server1 support-files]# mysql_secure_installation 

Securing the MySQL server deployment.

Enter password for user root: 

The existing password for the user account root has expired. Please set a new password.

New password: 

Re-enter new password: 

VALIDATE PASSWORD PLUGIN can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD plugin?

Press y|Y for Yes, any other key for No: No 
Using existing password for root.
Change the password for root ? ((Press y|Y for Yes, any other key for No) : y

New password: 

Re-enter new password: 
By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.

Remove anonymous users? (Press y|Y for Yes, any other key for No) : y
Success.


Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.

Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y
Success.

By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.


Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y
 - Dropping test database...
Success.

 - Removing privileges on test database...
Success.

Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.

Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y
Success.

All done!

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

2.编译下载PHP

在这里插入图片描述

yum install -y net-snmp-devel libmcrypt-* gmp-devel-4.3.1-7.el6_2.2.x86_64 freetype-devel libpng-devel-1.2.49-1.el6_2.x86_64 libjpeg-turbo-devel-1.2.1-1.el6.x86_64 libcurl-devel openssl-devel libxml2-devel curl-devel openssl-devel
./configure --prefix=/usr/local/lnmp/php --with-config-file-path=/usr/local/lnmp/php/etc --with-openssl --with-snmp --with-gd --with-zlib --with-curl --with-libxml-dir --with-png-dir --with-jpeg-dir --with-freetype-dir --with-gmp --with-gettext --with-pear --enable-mysqlnd --enable-inline-optimization --enable-soap --enable-ftp --enable-sockets --enable-mbstring --enable-fpm --with-fpm-user=nginx --with-fpm-group=nginx --with-mcrypt --with-mhash

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

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

配置php

1.添加nginx用户

useradd nginx

2.php的配置文件

cd /usr/local/lnmp/php/etc
cp php-fpm.conf.default php-fpm.conf
vim php-fpm.conf
  25 pid = run/php-fpm.pid     ##这一行不打开就没法启动。。

3.php的主配置文件

cd /root/php-5.6.35   ##php安装包解压后的目录
cp php.ini-production /usr/local/lnmp/php/etc/php.ini
cd /usr/local/lnmp/php/etc
vim php.ini
  936 date.timezone = Asia/Shanghai

4.php启动脚本

cd /root/php-5.6.35/sapi/fpm
cp init.d.php-fpm /etc/init.d/php-fpm
ll /etc/init.d/php-fpm             ##启动脚本权限不够
chmod +x /etc/init.d/php-fpm       ##添加执行权限

5.启动php服务

/etc/init.d/php-fpm start          ##开启php服务
netstat -tnlp                      ##查看到php启动后,开放的端口9000

nginx

一.编译nginx

1.tar zxf nginx-1.14.0.tar.gz 
2.cd nginx-1.14.0    ##进入nginx解压目录中
  vim src/core/nginx.h
    14 #define NGINX_VER          "nginx/"   ##隐藏版本号

3.[root@server1 nginx-1.14.0]# vim auto/cc/gcc       ##因为会产生的debug太多,所以索性关了
171 # debug
172 #CFLAGS="$CFLAGS -g"

4. ./configure --prefix=/usr/local/lnmp/nginx --with-http_ssl_module --with-http_stub_status_module --with-threads --with-file-aio --user=nginx --group=nginx    ##添加模块编译

5.yum install pcre-devel -y   ##依赖性

6. ./configure --prefix=/usr/local/lnmp/nginx --with-http_ssl_module --with-http_stub_status_module --with-threads --with-file-aio --user=nginx --group=nginx

7.make && make install

二.配置nginx

8.cd /usr/local/lnmp/nginx/conf/
vim nginx.conf            ##开启nginx服务
 65         location ~ \.php$ {
 66             root           html;
 67             fastcgi_pass   127.0.0.1:9000;
 68             fastcgi_index  index.php;
 69             #fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
 70             include        fastcgi.conf;
 71         }


45             index  index.php index.html index.htm;    ##默认发布文件添加index.php
9.cd /usr/local/lnmp/nginx/sbin        
ln -s /usr/local/lnmp/nginx/sbin/nginx /usr/local/sbin/    ##做一个软链接,这样不在它的目录下也可以使用nginx的相关命令
nginx -t       ##检测nginx是否可以使用
10.nginx          ##开启nginx
netstat -tnlp  ##查看到nginx使用的80端口
此时浏览器172.25.14.1可以查看到php页面
11.cd /usr/local/lnmp/nginx/html   ##编辑发布文件,内容是最简的测试页面
vim index.php
  <?php
  phpinfo();
  ?>
12.此时浏览器172.25.76.1可以查看到php的测试页面

mysql+nginx+php

论坛安装

1.下载解压论坛安装包

yum install -y unzip         ##下载解压软件
unzip Discuz_X3.2_SC_UTF8.zip -d /usr/local/lnmp/nginx/html/   ##将安装包解压到nginx的发布目录

2.浏览器访问开始图形界面安装

cd /usr/local/lnmp/nginx/html/   ##查看解压后的文件
mv upload/ bbs     ##将论他安装的文件重命名为bbs,便于访问
浏览器访问172.25.76.1/bbs/install 开始论坛安装

论坛安装检测到指定的文件权限不足

cd /usr/local/lnmp/nginx/html/bbs/   ##给指定文件添加权限
chmod 777 config/ -R
chmod 777 data -R
chmod 777 uc_* -R

此时检测到数据库链接不正常

vim /usr/local/lnmp/php/etc/php.ini   ##在php的主配置文件中添加数据库的套接字路径
1013 pdo_mysql.default_socket = /usr/local/lnmp/mysql/data/mysql.sock
1162 mysql.default_socket =/usr/local/lnmp/mysql/data/mysql.sock
1221 mysqli.default_socket = /usr/local/lnmp/mysql/data/mysql.sock
此时可以正常安装

若安装报错

在mysql 目录中
chmod 755 data

3.管理员登陆管理用户

admin    redhat
添加用户,但是系统提示需要删除指定文件
cd /usr/local/lnmp/nginx/html/bbs/install/
rm -fr index.php 
此时管理员可以正常管理用户

4.添加用户后查看数据库是否更新

mysql -uroot -predhat
show databases;
use discuz;
show tables;
select * from pre_ucenter_members;   ##可以查看到新添加的用户信息

给php做缓存,实现访问加速

1.下载编译memcache

tar zxf memcache-2.2.5.tgz   ##解压
vim ~/.bash_profile       ##增加php的环境变量
  10 PATH=$PATH:$HOME/bin:/usr/local/lnmp/mysql/bin:/usr/local/lnmp/php/bin
cd /root/memcache-2.2.5 
source ~/.bash_profile    ##重新加载系统环境变量
phpize          ##进入解压后的目录后,没有configure的选项,通过phpize命令生成
./configure     ##编译
make && make install

2.配置缓存

cd /usr/local/lnmp/php/etc
vim /usr/local/lnmp/php/etc/php.ini   ##将memcache模块添加到php中
  873 extension=memcache.so
/etc/init.d/php-fpm reload    ##重新加载php服务
php -m | grep memcache        ##查看php下加载的模块是否有memcache
yum install -y memcached      ##安装memcached工具
vim /etc/sysconfig/memcached     ##查看memcached的启动配置,监控端口为所有主机的11211端口
/etc/init.d/memcached start      ##启动memcached服务
telnet localhost 11211        ##远程登陆本地的11211端口,用于测试缓存功能

cd /root/memcache-2.2.5
cp memcache.php example.php /usr/local/lnmp/nginx/html/    ##将memcache的两个测试页发布在nginx上
cd /usr/local/lnmp/nginx/html
vim memcache.php        ##修改统计访问的页面文件
  23 define('ADMIN_PASSWORD','westos');      // Admin Password    ##将登陆密码修改为westos

  28 $MEMCACHE_SERVERS[] = '172.25.76.1:11211'; // add more as an array    ##添加测试的后台服务器的ip
  29 #$MEMCACHE_SERVERS[] = 'mymemcache-server2:11211'; // add more as an array  ##因为只配置了一台服务器,所以多出的注释

/et
检测:

打开浏览器172.25.14.1/memcache.php   ##可以统计访问172.25.14.1/example.php页面的具体结果,是去访问的缓存还是后台的服务器
172.25.14.1/example.php    ##通过不断的刷新访问,可以用于检测缓存的结果统计

使用物理机:

ab -c 5 -n 1000 http://172.25.76.1/index.php
ab -c 5 -n 1000 http://172.25.76.1/example.php    ##模拟5台主机并发访问1000次主页的情况,可以查看到访问缓存的时间效率远远大于直接访问后台服务器

给nginx做缓存

1.nginx -s stop     ##先将nginx服务关闭,因为新安装的服务自带nginx
2.下载编译openresty
tar zxf openresty-1.13.6.1.tar.gz   ##解压
cd /root/openresty-1.13.6.1     ##进入解压目录
./configure                     ##编译
gmake && gmake install

3.配置nginx的缓存
##将之前做好的两个测试页复制到本地
cd /usr/local/openresty/nginx/html/
cp /usr/local/lnmp/nginx/html/index.php .    ##php的测试页
cp /usr/local/lnmp/nginx/html/example.php .  ##做了memcache缓存的测试页

cd /usr/local/openresty/nginx/conf/
vim nginx.conf              ##编辑nginx主配置文件

 17 http {
 18 
 19         upstream memcache {
 20             server localhost:11211;     ##访问本地的11211端口
 21             keepalive 512;
 22         }
 23     include       mime.types;
 24     default_type  application/octet-stream;

 53         #error_page  404              /404.html;
 54 
 55         location /memc {
 56             internal;
 57             memc_connect_timeout 100ms;   
 58             memc_send_timeout 100ms;
 59             memc_read_timeout 100ms;      
 60             set $memc_key $query_string;   
 61             set $memc_exptime 300;  ##过期时间300s
 62             memc_pass memcache;     ##在访问
 63         }
 64         # redirect server error pages to the static page /50x.html
 65         #
##开启php服务,添加key
 79         location ~ \.php$ {
 80             set $key $uri$args;         
 81             srcache_fetch GET /memc $key;
 82             srcache_store PUT /memc $key;
 83             root           html;  
 84             fastcgi_pass   127.0.0.1:9000;
 85             fastcgi_index  index.php;
 86             #fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
 87             include        fastcgi.conf;
 88         }



cd /usr/local/openresty/nginx/sbin/
./nginx -t     ##此时nginx服务的开启需要在openresty的指定路径,检测语法是否有误
./nginx        ##开启nginx服务
netstat -tnlp   ##查看到nginx开启的80端口

4.测试

 ab -c 5 -n 1000 http://172.25.14.1/example.php   ##相比之前的访问时间,速度又得到提升
 ab -c 5 -n 1000 http://172.25.14.1/index.php      

tomcat

1.解压安装包
tar zxf apache-tomcat-7.0.37.tar.gz -C /usr/local
tar zxf jdk-7u79-linux-x64.tar.gz -C /usr/local
2.
cd /usr/local/
ln -s apache-tomcat-7.0.37/ tomcat
ln -s jdk1.7.0_79/ java

vim /etc/profile                             ##配置环境变量
 80 export JAVA_HOME=/usr/local/java
 81 export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
 82 export PATH=$PATH:$JAVA_HOME/bin
source /etc/profile

cd
vim test.java
public class test {
	public static void main(String[] args)
	{
		System.out.println("Hello World");
	}	

}

cd /usr/local/tomcat/bin/
./startup.sh



[root@server1 bin]# vim /usr/local/openresty/nginx/conf/nginx.conf
[root@server1 bin]# cat /usr/local/openresty/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 {
#	upstream memcache {
#		server localhost:11211;
#		keepalive 512;
	}
    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;
        #}


	location ~ \.jsp$ {
		proxy_pass 	http://127.0.0.1:8080;
	}
        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
     #   location /memc {
#		internal;
#		memc_connect_timeout 100ms;
#		memc_send_timeout 100ms;
#		set $memc_key $query_string;
#		set $memc_exptime 300;
#		memc_pass memcache;
#	}
        #
        location ~ \.php$ {
#	    set $key $uri$args;
#	    srcache_fetch GET /memc $key;
#	    srcache_store PUT /memc $key;
            root           html;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
            include        fastcgi.conf;
        }

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

}

在server1中:

在tomcat bin 目录下启动
./startup.sh

在tomcat /usr/local/tomcat/webapps/ROOT下
vim test.jsp
<%=new java.util.Date() %>
测试网页




在浏览器中访问172.25.76.1:8080/test.jsp
可测试是否成功

实现轮询访问

在server2:

[root@server2 ~]# tar zxf jdk-7u79-linux-x64.tar.gz -C /usr/local/
[root@server2 ~]# tar zxf apache-tomcat-7.0.37.tar.gz -C /usr/local/
[root@server2 ~]# vim /etc/profile
export JAVA_HOME=/usr/local/java
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$PATH:$JAVA_HOME/bin

[root@server2 ~]# cd /usr/local/
[root@server2 local]# ln -s apache-tomcat-7.0.37/ tomcat
[root@server2 local]# ln -s jdk1.7.0_79/ java
[root@server2 local]# source /etc/profile

vim /usr/local/lnmp/nginx/conf/nginx.conf

nginx -s reload

nginx ##启动服务

在浏览器测试

使用tomcat+memcache 实现session共享

在server1 和 server3中都进行:

tar zxf nginx-1.10.1.tar.gz
tar zxf nginx-sticky-module-ng.tar.gz

cd nginx-1.10.1

./configure --prefix=/usr/local/lnmp/nginx/ --with-threads --with-http_stub_status_module --with-http_ssl_module --with-file-aio --add-module=/root/nginx-sticky-module-ng

make && make install


vim /usr/local/tomcat/webapps/ROOT/test.jsp
<%@ page contentType="text/html; charset=GBK" %> <%@ page import="java.util.*" %> <html><head><title>Cluster App Test</title></head> <body> Server Info: <% out.println(request.getLocalAddr() + " : " + request.getLocalPort()+"<br>");%> <% out.println("<br> ID " + session.getId()+"<br>"); String dataName = request.getParameter("dataName"); if (dataName != null && dataName.length() > 0) { String dataValue = request.getParameter("dataValue"); session.setAttribute(dataName, dataValue); } out.print("<b>Session list</b>"); Enumeration e = session.getAttributeNames(); while (e.hasMoreElements()) { String name = (String)e.nextElement(); String value = session.getAttribute(name).toString(); out.println( name + " = " + value+"<br>"); System.out.println( name + " = " + value); } %> <form action="test.jsp" method="POST"> name:<input type=text size=20 name="dataName"> <br> key:<input type=text size=20 name="dataValue"> <br> <input type=submit> </form> </body> </html>


cd /usr/local/tomcat/conf
vim context.xml


<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
memcachedNodes="n1:172.25.76.1:11211,n2:172.25.76.3:11211"
failoverNodes="n1"        ##failoverNodes="n1"的作用是告诉msm最好是把session保存在memcached "n2"节点上,只有在n2节点不可用的情况下才把session保存在n1节点。这样即使host1主机宕机,仍然可以通过host2上的tomcat2访问存放在memcached "n2" 节点中的session。
requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$" transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoder    Factory"
/>

server3中:

failoverNodes改为n2

需要所有的jar包,删除tc6
将jar包放在tomcat的lib目录下

启动tomcat

在日志中一定要看到memcachedsessionservice的初始化信息

启动memcached

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值