Tomcat8安装,配置启动脚本,简单目录结构介绍,web部署,虚拟主机等

Tomcat8安装,配置启动脚本,简单目录结构介绍,web部署,虚拟主机等


前言

Tomcat服务器是一个免费的开放源代码的Web应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP程序的首选。

Tomcat和Nginx、Apache(httpd)、lighttpd等Web服务器一样,具有处理HTML页面的功能,另外它还是一个Servlet和JSP容器,独立的Servlet容器是Tomcat的默认模式。不过,Tomcat处理静态HTML的能力不如Nginx/Apache服务器。


一、JDK安装

tomcat依赖于JDK工具包,JDK是Java语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心,它包含了JAVA的运行环境(JVM+Java系统类库)和JAVA工具。
官网下载地址https://www.oracle.com/java/technologies/downloads/archive/
在这里插入图片描述
直接安装即可,如果使用压缩包安装则需要自己配置环境变量

# 解压安装JDK
mkdir -p /usr/java
tar xf jdk-8u60-linux-x64.tar.gz -C /usr/java
# 配置环境变量
vim /etc/profile.d/java.sh
JAVA_HOME=/usr/java/jdk1.8.0_60
PATH=$JAVA_HOME/bin:$PATH
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOMECLASSPATHPATH
# 测试
source /etc/profile.d/java.sh
java -version

在这里插入图片描述

二、tomcat

1.安装

tomcat官网地址:https://dlcdn.apache.org/tomcat/tomcat-8

[root@localhost ~]# wget -c https://dlcdn.apache.org/tomcat/tomcat-8/v8.5.84/bin/apache-tomcat-8.5.84.tar.gz
[root@localhost ~]# ls
anaconda-ks.cfg  apache-tomcat-8.5.84.tar.gz  jdk-8u144-linux-x64.rpm
# 下载好后解压到/usr/local目录下
# tomcat解压就能使用
[root@localhost ~]# tar xf apache-tomcat-8.5.84.tar.gz -C /usr/local/
[root@localhost ~]# ls /usr/local/
apache-tomcat-8.5.84  bin  etc  games  include  lib  lib64  libexec  sbin  share  src
# 建立一个软连接
[root@localhost ~]# ln -sv /usr/local/apache-tomcat-8.5.84/ /usr/local/tomcat/usr/local/tomcat’ -> ‘/usr/local/apache-tomcat-8.5.84/’

软链接的好处:
1、减少输入
2、方便升级

2.tomcat目录结构

目录及其功能:

[root@localhost ~]# cd /usr/local/tomcat/
[root@localhost tomcat]# tree -L 1
.
├── bin	# 存放tomcat管理脚本,二进制文件
├── BUILDING.txt 
├── conf # tomcat配置文件存放目录
├── CONTRIBUTING.md
├── lib # web应用调用的jar包存放路径
├── LICENSE
├── logs # tomcat日志存放目录,catalina.out 为主要输出日志
├── NOTICE
├── README.md
├── RELEASE-NOTES
├── RUNNING.txt
├── temp # 存放临时文件
├── webapps # web程序存放目录
└── work # 存放编译产生的.java和.class文件

7 directories, 7 files
[root@localhost tomcat]# tree -L 1  /usr/local/tomcat/webapps/
/usr/local/tomcat/webapps/
├── docs # tomcat 帮助文档
├── examples # web应用实例
├── host-manager # 主机管理
├── manager # 管理
└── ROOT # 默认站点根目录

5 directories, 0 files
[root@localhost tomcat]# tree -L 1 /usr/local/tomcat/conf
/usr/local/tomcat/conf
├── catalina.policy
├── catalina.properties
├── context.xml
├── jaspic-providers.xml
├── jaspic-providers.xsd
├── logging.properties
├── server.xml # tomcat主配置文件
├── tomcat-users.xml # tomcat管理用户配置文件
├── tomcat-users.xsd
└── web.xml

0 directories, 10 files

3.tomcat启动

启动程序

[root@localhost tomcat]# /usr/local/tomcat/bin/startup.sh 
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Using CATALINA_OPTS:   
Tomcat started.
# 查看服务是否启动成功
# 查看进程
[root@localhost tomcat]# ps -ef | grep java
root       6752      1  3 14:51 pts/0    00:00:05 /usr/bin/java -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/tomcat -Dcatalina.home=/usr/local/tomcat -Djava.io.tmpdir=/usr/local/tomcat/temp org.apache.catalina.startup.Bootstrap start
root       6928   1445  0 14:53 pts/0    00:00:00 grep --color=auto java
# 可查看端口8080是否开启
[root@localhost tomcat]# netstat -lnupt | grep 8080
tcp6       0      0 :::8080                 :::*                    LISTEN      6752/java           

浏览器使用IP加端口即可访问默认主页
启动脚本

[root@localhost tomcat]# vi /usr/lib/systemd/system/tomcat.service

[Unit]
Description=Tomcat
After=network.target


[Service]
Type=forking
ExecStart=/usr/local/tomcat/bin/startup.sh
ExecStop=/usr/local/tomcat/bin/shutdown.sh
PrivateTmp=true


[Install]
WantedBy=multi-user.target
# 保存后测试
[root@localhost tomcat]# systemctl daemon-reload
[root@localhost tomcat]# /usr/local/tomcat/bin/shutdown.sh 
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Using CATALINA_OPTS:   
[root@localhost tomcat]# ps -ef | grep java
root       7740   1445  0 15:07 pts/0    00:00:00 grep --color=auto java
[root@localhost tomcat]# systemctl start tomcat
[root@localhost tomcat]# ps -ef | grep java
root       7769      1 99 15:07 ?        00:00:02 /usr/bin/java -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/tomcat -Dcatalina.home=/usr/local/tomcat -Djava.io.tmpdir=/usr/local/tomcat/temp org.apache.catalina.startup.Bootstrap start
root       7786   1445  0 15:07 pts/0    00:00:00 grep --color=auto java
[root@localhost tomcat]# systemctl stop tomcat
[root@localhost tomcat]# ps -ef | grep java
root       7846   1445  0 15:08 pts/0    00:00:00 grep --color=auto java

Tomcat日志–解决启动慢
发现耗时在这里:是session引起的随机数问题导致的。Tocmat的Session ID是通过SHA1算法计算得到的,计算Session ID的时候必须有一个密钥。为了提高安全性Tomcat在启动的时候会通过随机生成一个密钥。
查看是否有足够的熵来用于产生随机数

[root@localhost ~]# cat /proc/sys/kernel/random/entropy_avail 
282

推荐解决方法:

yum install rng-tools -y # 安装rngd服务(熵服务,增大熵池)
systemctl start rngd # 启动服务
systemctl enable rngd # 开机自启
[root@localhost~]# systemctl enable --now rngd
[root@localhost~]# cat /proc/sys/kernel/random/entropy_avail
2980

4.tomcat web管理功能

注意:不要在生产环境使用 ! ! !
Tomcat管理功能用于对Tomcat自身以及部署在Tomcat上的应用进行管理的web应用。在默认情况下是处于禁用状态的。如果需要开启这个功能,就需要配置管理用户。
在这里插入图片描述
报403错误,无法使用
在这里插入图片描述

1、配置tomcat-users.xml文件

[root@localhost conf]# vim /usr/local/tomcat/conf/tomcat-users.xml
<role rolename="admin-gui"/>
<role rolename="admin-script"/>
<role rolename="manager-gui"/>
<role rolename="manager-jmx"/>
<role rolename="manager-script"/>
<role rolename="manager-status"/>
<user username="tomcat" password="tomcat" roles="admin-gui,manager-gui,managerjmx,manager-script,manager-status,admin-script"/>
</tomcat-users> #前面加上以上几行,注意,此句在文本末尾,且不要添加到注释里面去。

注意:不要在生产环境使用 ! ! !
2、允许访问Manager App

[root@localhost ~]# vim /usr/local/tomcat/webapps/manager/META-INF/context.xml
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
       allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
       allow="^.*"/>#修改网段范围

3、允许访问Host Manager

[root@localhost ~]# vim /usr/local/tomcat/webapps/host-manager/META-INF/context.xml
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
       allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
       allow="^.*"/>#修改网段范围

修改完成后,重启tomcat;
登录即可(用户名密码都为tomcat)
在这里插入图片描述
注意:不要在生产环境使用 ! ! !

5.tomcat配置文件

server.xml组件类别:
顶级组件:位于整个配置的顶层,如server。
容器类组件:可以包含其它组件的组件,如service、engine、host、context。
连接器组件:连接用户请求至tomcat,如connector。
被嵌套类组件:位于一个容器当中,不能包含其他组件,如Valve、logger。

server.xml组件介绍:
engine:核心容器组件,catalina引擎,负责通过connector接收用户请求,并处理请求,将请求转至对应的虚拟主机host。
host:类似于httpd中的虚拟主机,一般而言支持基于FQDN的虚拟主机。
context:定义一个应用程序,是一个最内层的容器类组件(不能再嵌套)。配置context的主要目的指定对应对的webapp的根目录,类似于httpd的alias,其还能为webapp指定额外的属性,如部署方式等。
connector:接收用户请求,类似于httpd的listen配置监听端口的。
service(服务):将connector关联至engine,因此一个service内部可以有多个connector, 但只能有一个引擎engine。service内部有两个connector,一个 engine。因此,一般情况下一个server内部只有一个service,一个service内部只有一个engine,但一个 service内部可以有多个connector。
server:表示一个运行于JVM中的tomcat实例。
Valve:阀门,拦截请求并在将其转至对应的webapp前进行某种处理操作,可以用于任 何容器中,比如记录日志(access log valve)、基于IP做访问控制(remote address filter valve)。
logger:日志记录器,用于记录组件内部的状态信息,可以用于除context外的任何容器中。
realm:可以用于任意容器类的组件中,关联一个用户认证库,实现认证和授权。可以关联的认证库有两种:UserDatabaseRealm、MemoryRealm和JDBCRealm。
UserDatabaseRealm:使用JNDI自定义的用户认证库。
MemoryRealm:认证信息定义在tomcat-users.xml中。
JDBCRealm:认证信息定义在数据库中,并通过JDBC连接至数据库中查找认证用户。

Connector主要参数说明:

参数参数说明
connector接收用户请求,类似于httpd的listen配置监听端口.
port指定服务器端要创建的端口号,并在这个端口监听来自客户端的请求。
address指定连接器监听的地址,默认为所有地址(即0.0.0.0)
protocol连接器使用的协议,支持HTTP和A JP。A JP(Apache Jserv Protocol)专用于tomcat与apache建立通信的, 在httpd反向代理用户请求至tomcat时使用(可见Nginx反向代理时不可用A JP协议)。
minProcessors服务器启动时创建的处理请求的线程数
maxProcessors最大可以创建的处理请求的线程数
enableLookups如果为true,则可以通过调用request.getRemoteHost()进行DNS查询来得到远程客户端的实际主机名,若为false则不进行DNS查询,而是返回其ip地址
redirectPort指定服务器正在处理http请求时收到了一个SSL传输请求后重定向的端口号
acceptCount指定当所有可以使用的处理请求的线程数都被使用时,可以放到处理队列中的请求数,超过这个数的请求将不予处理
connectionTimeout指定超时的时间数(以毫秒为单位)

host参数说明:

参数参数说明
host表示一个虚拟主机
name指定主机名
appBase应用程序基本目录,即存放应用程序的目录.一般为appBase=“webapps” ,相对于CATALINA_HOME而言的,也可以写绝对路径。
unpackWARs如果为true,则tomcat会自动将WAR文件解压,否则不解压,直接从WAR文件中运行应用程序
autoDeploy在tomcat启动时,是否自动部署。
xmlValidation是否启动xml的校验功能,一般xmlValidation=“false”。
xmlNamespaceAware检测名称空间,一般xmlNamespaceAware=“false”。

context参数说明:

参数参数说明
Context表示一个web应用程序,通常为WAR文件
docBase应用程序的路径或者是WAR文件存放的路径,也可以使用相对路径,起始路径为此Context所属Host中appBase定义的路径。
path表示此web应用程序的url的前缀,这样请求的url为http://localhost:8080/path/
reloadable这个属性非常重要,如果为true,则tomcat会自动检测应用程序的/WEB-INF/lib和/WEB-INF/classes目录的变化,自动装载新的应用程序,可以在不重启tomcat的情况下改变应用程序

6.tomcat web站点部署

通过两种方式,第一种方式是直接将程序目录放在webapps目录下面
第二种方式是使用开发工具将程序打包成war包,然后上传到webapps目录下面。

部署开源站点jpress
下载地址:https://github.com/JpressProjects/jpress

# 安装配置数据库
[root@bbs ~]# yum install mariadb-server -y
[root@bbs ~]# systemctl enable --now mariadb
[root@bbs ~]# mysql
MariaDB [(none)]> create database jpress default character set utf8;
MariaDB [(none)]> grant all on jpress.* to jpress@'localhost' identified by '123456';

接下来下载好war包后直接放在指定目录下即可,会自动解压

[root@bbs ~]# mv jpress-web-newest.war /usr/local/tomcat/webapps/
[root@bbs ~]# cd /usr/local/tomcat/webapps
[root@bbs webapps]# ll
total 20316
drwxr-x--- 15 root root     4096 Dec 26 10:27 docs
drwxr-x---  7 root root       99 Dec 26 10:27 examples
drwxr-x---  6 root root       79 Dec 26 10:27 host-manager
drwxr-x---  7 root root      102 Dec 26 14:35 jpress-web-newest
-rw-r--r--  1 root root 20797013 Oct 10 12:52 jpress-web-newest.war
drwxr-x---  6 root root      114 Dec 26 10:27 manager
drwxr-x---  3 root root      223 Dec 26 10:27 ROOT

浏览器访问 http://IP:8080/jpress-web-newest/install
在这里插入图片描述

安装完毕之后,重启tomcat即可访问
访问后台:http://IP:8080/jpress-web-newest/admin/login
在这里插入图片描述

7.tomcat虚拟主机

需修改server.xml文件

[root@localhost ~]# cd /usr/local/tomcat/conf/
# 备份
[root@localhost conf]# cp server.xml{,.bak}
[root@localhost conf]# vim server.xml

在命令模式下使用 /<Host 搜索编辑位置
在这里插入图片描述

# 添加内容示例
      <Host name="www.a.com"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
        <Context docBase="/web/a" path="" reloadable="flase" />
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log" suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />
      </Host>
      
      <Host name="www.b.com"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
        <Context docBase="/web/b" path="" reloadable="flase" />
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log" suffix=".txt"
               pattern="%h %l %u %t &quot;%r&quot; %s %b" />
      </Host>

虚拟主机目录与文件准备

[root@bbs conf]# mkdir -p /web/{a,b}
[root@bbs conf]# vim /web/a/index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
        <head>
        <title>JSP a page</title>
        </head>
        <body>
            <% out.println("Welocome to test site,http://www.a.com");%>
        </body>
</html>

[root@bbs conf]# cp /web/a/index.jsp /web/b/
[root@bbs conf]# vim /web/b/index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
        <head>
        <title>JSP a page</title>
        </head>
        <body>
            <% out.println("Welocome to test site,http://www.b.com");%>
        </body>
</html>

[root@bbs conf]# systemctl restart tomcat

客户端hosts文件添加dns解析
(注:windows下hosts文件目录为C:\Windows\System32\drivers\etc\hosts)
tomcat_IP www.a.com www.b.com
测试:
使用域名:8080,即可访问
在这里插入图片描述

8.动静分离

虽然tomcat已经有了这些服务,但常引入 Apache 或者其他的一些专门的HTTP 服务器原因有下面几个:

  1. 提升对静态文件的处理性能
  2. 利用 Web 服务器来做负载均衡以及容错
  3. 无缝的升级应用程序

jk

这是最常见的方式。JK 是通过 AJP 协议与 Tomcat 服务器进行通讯的,Tomcat 默认的 AJP Connector 的端口是 8009。JK本身提供了一个监控以及管理的页面jkstatus,通过 jkstatus 可以监控 JK 目前的工作状态以及对到 tomcat 的连接进行设置。
编译生成mod_jk模块
在apache中加载mod_jk并对其进行配置
在tomcat中修改配置以使其能接受mod_jk的转发
编译生成mod_jk.so

[root@bbs ~]# wget -c https://dlcdn.apache.org/tomcat/tomcat-connectors/jk/tomcat-connectors-1.2.48-src.tar.gz --no-check-certificate
[root@bbs ~]# tar xf tomcat-connectors-1.2.48-src.tar.gz -C /usr/local/src/
[root@bbs ~]# cd /usr/local/src/tomcat-connectors-1.2.48-src/native/
[root@bbs native]# yum install httpd-devel -y
[root@bbs native]# yum install gcc gcc-c++ make -y
[root@bbs native]# ./configure --with-apxs
[root@bbs native]# make && make install
# 查看是否编译成功
[root@bbs ~]# find / -name mod_jk.so
/usr/lib64/httpd/modules/mod_jk.so
/usr/local/src/tomcat-connectors-1.2.48-src/native/apache-2.0/.libs/mod_jk.so
/usr/local/src/tomcat-connectors-1.2.48-src/native/apache-2.0/mod_jk.so

创建测试页面

# 静态页面
[root@bbs ~]# vim /var/www/html/index.html
<h1>static_page_from_apache</h1>
[root@bbs ~]# vim /usr/local/tomcat/webapps/ROOT/test.jsp
<h1>dynamic_page_from_tomcat</h1>
[root@bbs ~]# systemctl restart httpd

通过浏览器访问IP可得到静态测试界面,IP:8080/test.jsp可查看到动态测试页面
在这里插入图片描述
当然用域名访问也是一样的
在这里插入图片描述
配置jk模块

# 官方模板文件位置
[root@bbs ~]# cd /usr/local/src/tomcat-connectors-1.2.48-src/conf/
[root@bbs conf]# ll
total 20
-rw-r--r-- 1 root bin 4924 Feb 21  2020 httpd-jk.conf
-rw-r--r-- 1 root bin 1461 Feb 21  2020 uriworkermap.properties
-rw-r--r-- 1 root bin 5963 Feb 21  2020 workers.properties

JK 的配置最关键的三个文件,分别是
httpd.conf:Apache 服务器的配置文件,用来加载 JK 模块以及指定 JK 配置文件信息
workers.properties:到 Tomcat 服务器的连接定义文件
uriworkermap.properties:URI 映射文件,用来指定哪些 URL 由 Tomcat 处理,你也可以直接在httpd.conf 中配置这些 URI,但是独立这些配置的好处是 JK 模块会定期更新该文件的内容,使得我们修改配置的时候无需重新启动 Apache 服务器。

在这里插入图片描述

# 创建相关的配置文件
[root@bbs conf]# vim /etc/httpd/conf.d/mod_jk.conf 

#JkWorkersFile 路径根据实际情况填写
JkWorkersFile conf/workers.properties
# Where to put jk logs
JkLogFile /var/log/httpd/mod_jk.log
# Set the jk log level [debug/error/info]
JkLogLevel info
# Select the log format
JkLogStampFormat "[%a %b %d %H:%M:%S %Y]"
# JkOptions indicate to send SSL KEY SIZE,
JkOptions +ForwardKeySize +ForwardURICompatUnparsed -ForwardDirectories
# JkRequestLogFormat set the request format
JkRequestLogFormat "%w %V %T"
#根据实际情况自己定义即可,就是将什么样的请求转发给worker1处理
#JkMount /* worker1
JkMount /*.jsp worker1
JkMount /servlet/* worker1
JkMount /*.do worker1
JkMount /*.action worker1
#JkMount /*.class worker1
#JkMount /*.jar worker1
JkMount /jkstatus status

[root@bbs conf]# vim /etc/httpd/conf/workers.properties

#路径根据实际情况修改
workers.tomcat_home=/usr/local/tomcat/
workers.java_home=/usr/java/jdk1.8.0_144

worker.list=worker1
# Set properties for worker1 下面的都可以不用修改,感兴趣可以搜索相关含义
worker.worker1.type=ajp13
worker.worker1.host=localhost
worker.worker1.port=8009
worker.worker1.lbfactor=50
#worker.worker1.cachesize=10
#worker.worker1.cache_timeout=600
#worker.worker1.socket_keepalive=1
#worker.worker1.socket_timeout=300
worker.list = status
worker.status.type=status

注意,8009端口默认关闭,需手动打开

[root@bbs conf]# netstat -lnupt | grep 8009
[root@bbs conf]# cd /usr/local/tomcat/conf
[root@bbs conf]# vim server.xml
# /8009 搜索端口,删除注释即可

在这里插入图片描述
重启tomcat

tomcat8.5.84版本经测试失败 -_-
回退到8.5.20版本测试成功

在这里插入图片描述
8.5.20版本默认8009端口打开,无需更改
无需加端口即可直接访问
JK 本身提供了一个监控以及管理的页面 jkstatus,通过 jkstatus 可以监控 JK 目前的工作状态以及对到tomcat 的连接进行设置,如下图所示:
在这里插入图片描述
至此,tomcat的一些基本内容就大致了解完毕了


总结

tomcat从安装到基本的了解和使用,以及web站点的配置部署等。
(本文为作者简单学习笔记,若有错误之处,感谢大佬指正!)

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值