Linux APACHE构建服务器

35 篇文章 6 订阅

了解常见的WEB服务器
熟悉apache服务的基本配置
掌握apache服务的虚拟主机配置 一台物理机部署多个虚拟主机 多个网站
掌握apache的访问控制 —— 用户和网络控制
掌握MySQL的安装

 

一、介绍

常见的web服务端程序有:
 Apache/Nginx/Tengine/Lighttpd/ISS等
Apache或Nginx都支持静态页面的解析
 

Web服务的中间件
Apache不能直接解析动态页面,要通过 访问中间件的解析
PHP:PHP-FPM、HHVM(HipHop Virtual Machine)
JSP:Tomcat、JBOSS、Resin、IBM WebSphere
Nginx是用PHP-FPM程序去完成的,Apache通过解释器去加载模块
 

常见的WEB组合方式
LAMP(Linux + Apache + MySQL + PHP) //php作为Apache的模块
LNMP(Linux + Nginx + MySQL + PHP) //php-fpm进程(服务)
Nginx / Apache + Tomcat
 

Apache的工作原理
在这里插入图片描述Apache的手册
www.apache.org
httpd-manual.noarch
中文手册.★
英文手册:
#yun list | grep ^httpd
#yum -y install httpd-manual
#service httpd start
IE:http://10.1.1.2/manual/
 

 

二、搭建简易WEB服务

1.关闭防火墙和selinux
2.配置yum源
3.软件三部曲(查看安装|确认成功安装|查看软件的文件列表)
4.了解配置文件 man 5 xxx.conf |程序的官方手册 appache,mysql
5.根据需求通过修改配置文件来完成服务搭建
6.启动服务,开机自启动
7.测试验证

需求:访问一个静态页面,内容:hello world!

环境:
web-server:10.1.1.2
步骤:
1.关闭防火墙和selinux 
#service iptables stop
#chkconfig iptables off
#getenforce
Enforcing
#setenforce 0   //临时关闭
#getenforce
Permissive
#vim /etc/sysconfig/selinux   //永久关闭
#grep ^SELINUX /etc/sysconfig/selinux
SELINUX=disabled
SELINUXTYPE=targeted

2.配置yum源 (在我的博客中可以找到)

3.软件三步曲
#rpm -ivh httpd-2.2.15-69.el6.centos.x86_64.rpm 
#rpm -q httpd
#rpm -ql httpd
/etc/httpd
/etc/httpd/conf     //主配置文件的主目录
/etc/httpd/conf.d   //子配置文件的目录
/etc/httpd/conf.d/README    //说明书
/etc/httpd/conf.d/welcome.conf  //欢迎页面
/etc/httpd/conf/httpd.conf  //主配置文件
/etc/httpd/logs     //  硬链接    /var/log/httpd/      同一个文件   inode号一样
/etc/httpd/modules
/etc/httpd/run      //  硬链接 /var/log/httpd 两个文件(iNode)是一样的  可以 #ll -id xxx 列举两个对比
/etc/logrotate.d/httpd      //日志轮转  
/etc/rc.d/init.d/httpd      //服务启动脚本
/etc/sysconfig/httpd

/usr/sbin/apachectl
/usr/sbin/htcacheclean
/usr/sbin/httpd

/var/log/httpd
/var/run/httpd
/var/www        //apache服务的数据目录
/var/www/html   //apache服务的静态页面存放路径
/var/www/error/HTTP_NOT_FOUND.html.var  404
/var/www/error/HTTP_FORBIDDEN.html.var  403

//互为硬链接,同时改变,一个改变另一个也改变
[root@web-server ~]# ll -id /var/log/httpd/
267919 drwx------. 2 root root 4096 Apr 23 18:52 /var/log/httpd/
[root@web-server ~]# ll -id /etc/httpd/logs/
267919 drwx------. 2 root root 4096 Apr 23 18:52 /etc/httpd/logs/


4.了解配置文件
/etc/httpd/conf/httpd.conf 配置文件:
serverRoot  "/etc/httpd"    //服务主目录
Listen  80                  //监听端口
IncludeOptional conf.d/*.conf   //包含conf.d下的*.conf文件
User apache                 //运行Apache的用户
Group apache                //允许Apache的用户组
DirectoryIndex index.html index.php     //设置默认主页
DocumentRoot        /var/www/html/      //站点默认数据主目录

<Directory />       //系统的根目录授权
    Option FollowSymLinks       //支持软连接
    AllowOverride   None        //不支持 .htaccess访问列表 .htaccess文件提供了针对每个目录改变配置的方法
</Directory>

/usr/local/apache/conf/extra配置文件下的 httpd-mpm.conf
扩展:配置进程和线程  针对apache2.2 针对面试
# perfork MPM       //进程模式
<IfModule prefork.c>
StartServers        10      //初始建立的进程数
MinSpareServers 10          //最小空闲的进程数
MaxSpareServers 15          //最大空闲的进程数
ServerLimit     2000        //最大启动的进程数  默认256
MaxClients      2000        //最大并发连接数    默认256
MaxRequestsPerChid  4000    //每个子进程在其生命周期内允许响应的最大请求数,0不限制
</IfModule>

# worker MPM        //线程模式
<IfModule worker.c>         
StartServer         2       //初始创建的进程数
ThreadPerChild  50          //每个进程建立的线程数
MinSpareThreads 100         //最小空闲的线程数
MaxSpareThreads 200         //最大空闲的线程数
MaxClients      2000        //最大的并发访问量(线程)
MaxRequestsPerChild 0       //每个子进程在其生命周期内允许响应的最大请求数,0不限制
</IfModule>

5.根据需求通过修改配置文件完成服务搭建
1)创建一个首页文件
#netstat -ntlp | grep httpd
#echo "hello world!!"  > /var/www/html/index.html
2)启动服务

6.测试验证
IE:http://10.1.1.2

 

三、Apache更改默认数据根目录

#cd /etc/httpd/conf
#cp httpd.conf httpd.conf.bak
#vim /etc/httpd/conf/httpd.conf 
/Docu

DocumentRoot "/webserver/"   //站点默认数据主目录

<Directory "/webserver/">       //系统的根目录授权
    ....其他默认....
</Directory>
#mkdir /webserver        //创建对应的主目录
#echo "2020/2/19">/webserver/index.html
#service httpd restart
————————————————————————————————————————————
//有问题才看,没问题忽略这步
假设主机名和IP地址的解析问题,有问题才弄这步
#hostname
web-server
#vim /etc/hosts
10.1.1.2 web-server
#vim /etc/httpd/conf/httpd.conf 
删掉注释:ServerName 10.1.1.2:80  或   ServerName web-server:80
//
————————————————————————————————————————————


测试验证:http://10.1.1.2


DocumentRoot "/webserver"
<Directory />
     Options Indexes FollowSymLinks   #没有index.html,列出目录结构    
     AllowOverride None
     Order allow,deny  # 先检测allow设置,再检测deny设置
     Allow from all    #如果是CentOS 8 不同
</Directory>

第一种方法:
上面的Options Indexes FollowSymLinks---->Options FollowSymLinks
       把Indexes 去掉,就可以禁止 Apache 显示该目录结构。用户就不会看到该目录下的文件和子目录列表了。

第二种方法:
编辑httpd.conf文件
  vi ./conf/httpd.conf
在Options Indexes FollowSymLinks在Indexes前面加上 – 符号。 # Options None 也行
  即: Options -Indexes FollowSymLinks
 【备注:在Indexes前,加 + 代表允许目录浏览;加 – 代表禁止目录浏览。】
这样的话就属于整个Apache禁止目录浏览了。


 

四、Apache共享文件

1.软连接方式

需求1:共享web-server服务端的/data目录里的所有文件(在上面更改数据目录的基础上)

方法一:
1.apache服务默认情况下到默认指定目录找相应的文件
2.将本地的/data目录做一个快捷方式(软连接)到默认指定的目录里

步骤:
1.创建 /data 共享目录
#cd 
#mkdir /data   //根下创建
#touch /data/file{1..5}
#mkdir /data/Kolor
#ll /webserver/
2.创建快捷方式(软连接)
#ln -s /data/  /webserver/share         
#ll /webserver/share/
3.测试验证
IE:http://10.1.1.2/share


得出结论:
1.当默认数据目录里有index.html的首页文件时,优先找首页文件
2.通过#mv /webserver/index.html /webserver/index.html.bak
得出:当默认数据目录里没有index.html的首页文件时,会显示测试页 
3.不管有没有首页文件,都不会直接找数据文件

那如何解决: 没首页情况,直接得到数据文件
1.加入路径
http://10.1.1.2/share

2.将测试页欢迎页删除或者重命名即可 。 //当没有首页文件时,会显示测试页,测试页都没有
#cd /etc/httpd/conf.d/
#mv welcome.conf welcome.conf.bak
#service httpd restart

2.别名方式

方法二:
别名方式
#vim  /etc/httpd/conf/httpd.conf
Alias /test/ "/data/"          这里的/test/是别名
DocumentRoot "/data/"   //站点默认数据主目录 //原先的只需要注释掉DocumentRoot就行
指定了数据默认主目录后 就要授权
<Directory "/data/">       //系统的根目录授权
    Options Indexes MultiViews FollowSysmLinks
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>
#service httpd restart
#echo hello world > /data/Kolor/test
注意:别名后面的路径 test“/” 会影响访问
IE:http://10.1.1.2/test   ——》 不能访问
IE:http://10.1.1.1/test/  ——》 可以访问

模板:
Alias /icons/ "/var/www/icons/"
<Directory "/var/www/icons">
    Options Indexes MultiViews FollowSymLinks
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>

 
课堂练习:
通过2种方式共享你的/home目录和/tmp目录里的所有文件
/home 用别名
/tmp目录 用软件

/home
#vim /etc/httpd/conf/httpd.conf     // home的别名是rhome
Alias /rhome "/home/"      
<Directory "/home/">       //系统的根目录授权
    Options Indexes MultiViews FollowSymLinks
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>
#service httpd restart
#mkdir /home/test     因为home下其他人没权限,因此创建一个后 就会默认赋予权限
验证:http://10.1.1.2/rhome/test
/tmp
#ln -s /tmp/  /data/tmp     因为 四、共享文件的方法二 我已经修改主目录为 /data/
#ll /data/

在这里插入图片描述
 

五、Apache服务的访问控制

Apache HTTP Server Version 2.2 文档 - Apache 2.2 中文手册 [金步国] http://www.jinbuguo.com/apache/manual/index.html

1.开启基本认证(用户密码)

根据需求,基本认证,选取所要条件
<Directory "/xx/">
AuthType Basic                   //开启基本认证
AuthName "Restricted Files"      //认证信息
#(下面这一行是可选的)
AuthBasicProvider file           //声明指定文件
AuthUserFile /usr/local/apache2/passwd/passwords   //指定刚创建的文件
Require user rbowen      //允许指定用户
</Directory>

需求1:/data/ ——》 index.html
步骤:
查询 htpasswd这个命令来自于哪
#which htpasswd
/usr/bin/htpasswd
#rpm -qf /usr/bin/htpasswd
httpd-tools-2.2.15-69.el6.centos.x86_64
如果没这个命令,就要安装 httpd-tools-2.2.15-69.el6.centos.x86_64

步骤
1.创建密码文件
#htpasswd -cm /etc/httpd/conf/xxx     文件名字(任意取)  用户名
                              .passfile 表示隐藏文件passfile,点
#htpasswd -cm /etc/httpd/conf/.passfile harry
New password: 
Re-type new password: 
Adding password for user harry
#htpasswd -bm /etc/httpd/conf/.passfile jack 123456
Adding password for user jack

htpasswd:
-c:创建新的密码文件
-m:密码使用md5加密
-b:非交互式

2.修改配置文件开启基本认证   目前在/data/ 是默认主目录
#vim /etc/httpd/conf/httpd.conf
<Directory "/data/">
    ...
    AuthType Basic            //开启基本认证
    AuthName "Input your name and password:"    //认证信息
    AuthBasicProvider file       //声明指定文件
    AuthUserFile /etc/httpd/conf/.passfile       //指定刚创建的文件
    Require user harry         //允许指定用户
</Directory>


3.测试验证  
#service httpd restart  重启服务
 http://10.1.1.3
 
 总结:
 1.开启用户名密码认证有几点注意
 1)创建一个密码文件来保存用户名和密码
 2)需要知道网站的数据根目录  DocumentRoot
 3)将认证信息加入到 <Directory " "> 认证信息 </Directory>
 

在这里插入图片描述
需求2:允许多人访问

模板:
AuthType Basic
AuthName "By Invitation Only"
AuthUserFile /usr/local/apache2/passwd/passwords
AuthGroupFile /usr/local/apache2/passwd/groups
Require group GroupName

1.创建一个文件保存所有的用户(将很多用户加入到一个组里)  //实际上组是不存在的
#vim /etc/httpd/conf/groups
admin:user01 user02 user03

2.将组成员加入到密码文件中
htpasswd -mb /etc/httpd/conf/.passfile user01 123
htpasswd -mb /etc/httpd/conf/.passfile user02 123
htpasswd -mb /etc/httpd/conf/.passfile user03 123

3.修改主配置文件
#vim /etc/httpd/conf/httpd.conf
<Directory "/data/">
    Options Indexes MultiViews FollowSymLinks
    AllowOverride None
    Order allow,deny
    Allow from all
    AuthType Basic
    AuthName "请输入用户名和密码"
    AuthUserFile /etc/httpd/conf/.passfile
    AuthGroupFile /etc/httpd/conf/groups
    Require group admin
</Directory>

4.重启服务,测试验证
#service httpd restart
http://10.1.1.3

思考:
Require group admin
Require user jack 
两个一起的话,就只会允许jack,不允许group admin  。即使都在密码文件中。
那怎么解决 不把jack加组里,然后去访问group admin同时 也能访问jack
Require group admin
Require valid-user jack 

总结:
1.将很多人加入到组里(创建一个文件建立组合用户的关系)  /etc/httpd/conf/groups
2.在配置文件中指定允许属于组成员来访问      Require group admin
结论:只允许admin组成员访问,那么密码文件中的其他用户不可以访问
思考:想允许其他用户和admin组成员都可以访问,咋办?
#vim /etc/httpd/conf/httpd.conf
<Directory "/data/">
    ....
    Require group admin
    Require valid-user jack 
    
Require valid-user:指定多个用户访问
Require user:指定某个人访问

 

2.网络访问控制

RHEL6:http 2.2版本
Order allow,deny    如果allow和deny冲突,deny为准
Order deny,allow    如果allow和deny冲突,allow为准
加入到 授权目录 <Directory "授权目录">  </Directory>  :

1.禁止部分IP不能访问网站
Order allow,deny
Allow from all
Deny from 192.168.0.254 10.1.1.5

2.针对某个网站
Order allow,deny
Allow from all
Deny from 192.168.0.0/255.255.255.0

3.针对域名
Order allow,deny
Allow from all
Deny from *.itcast.cc
4.拒绝大部分,允许某个IP
Order deny,allow
Deny from all
Allow from 192.168.0.254

需求3:只拒绝10.1.1.2主机访问我的网站

#vim /etc/httpd/conf/httpd.conf
<Directory "/data/">
    Order allow,deny      //排序,先allow后deny
    Allow from all
    Deny from 10.1.1.2
</Directory>
#service httpd restart

HTTP通过状态码来标记返回信息,以下为常见的状态码:

  • 常用状态码分类:
    200:成功,请求的所有数据通过响应报文的entity-body部分发送:OK
    301:请求的URL指向的资源已经被删除,但是在响应报文中通过首部Location指明了资源现在所处的新位置:Moved Permanently
    302:与301相似,但是在响应报文中通过Location指明资源现在所处的临时新位置:Found
    304:客户端发出条件式请求,但是服务器上的资源未发送改变,通过响应此响应状态码通知客户端,Not Modified
    401:需要客户端输入账户和密码才能访问资源:Unauthorized
    403:请求被禁止:Forbidden
    404:服务器无法找到客户端请求的资源:Not Found
    500:服务器内部错误:Internal Server Error
    502:代理服务器从后端服务器收到了一条伪响应:Bad Gateway

 

六、Apache服务的虚拟主机

一台物理真机,搭建两个 两张网卡

1.基于IP的虚拟主机 (里面已包含了 DocumentRoot)

一台物理真机,搭建两个  两张网卡
环境准备:
eth0:10.1.1.1
eth1:192.168.0.1

需求:
IE:http://10.1.1.1  ——》this is 10.1.1.1 test page
    http://192.168.0.1  ——》this is 192.168.0.1 test page

步骤:
1.创建相应的数据目录及首页文件
#mkdir /web{1,2}/data -p
echo "this is 10.1.1.1 test page" >/web1/data/index.html
echo "this is 192.168.0.1 test page" >/web2/data/index.html

2.发布网站
#cd /etc/httpd/conf
#vim httpd.conf   也可以通过 Include conf/httpd-vhosts.conf的方法。这里是直接在httpd.conf配置文件下加的
在文件最后面增加以下内容
<VirtualHost 10.1.1.2:80>
    ServerAdmin webmaster@dummy-host.example.com
    DocumentRoot /web1/data/
    #ServerName dummy-host.example.com
    ErrorLog logs/10.1.1.2-error_log
    CustomLog logs/10.1.1.2-access_log common
</VirtualHost>

<VirtualHost 192.168.1.2:80>
    ServerAdmin webmaster@dummy-host.example.com
    DocumentRoot /web2/data/
    #ServerName dummy-host.example.com
    ErrorLog logs/192.168.1.2-error_log
    CustomLog logs/192.168.1.2-access_log common
</VirtualHost>

3.重启服务
#hostname
server.localdomain
#vim /etc/hosts
192.168.1.2 server.localdomain
#service httpd restart

#yum -y install elinks
使用:elinks http://IP

2.基于端口的虚拟主机

需求2:
IE:
http://10.1.1.2:80
http://192.168.1.2:10086

步骤:
1.创建相应的数据目录及首页文件
#mkdir /data/{80,10086} -p
echo "this is 80 test page" >/data/80/index.html
echo "this is 10086 test page" >/data/10086/index.html

2.发布虚拟主机
#vim /etc/httpd/conf/httpd.conf
<VirtualHost 10.1.1.2:80>
    ServerAdmin webmaster@dummy-host.example.com
    DocumentRoot /data/80
    #ServerName dummy-host.example.com
    ErrorLog logs/80-error_log
    CustomLog logs/80-access_log common
</VirtualHost>

<VirtualHost *:10086>
    ServerAdmin webmaster@dummy-host.example.com
    DocumentRoot /data/10086
    #ServerName dummy-host.example.com
    ErrorLog logs/10086-error_log
    CustomLog logs/10086-access_log common
</VirtualHost>

3.重启服务
#service httpd restart
[root@web-server conf]# netstat -nltp|grep 80
tcp        0      0 :::80                       :::*                        LISTEN      2663/httpd          
[root@web-server conf]# netstat -nltp|grep 10086

在配置文件 /etc/httpd/conf/httpd.conf 必须得添加一个
Listen 10086

4.测试验证
#service httpd restart


3.基于域名的虚拟主机

需求3:
http://www.myweb.cc --> this is myweb.cc
http://ftp.test.net --> this is myftp

思路:
1.搭建DNS服务器
2.搭建web服务器
3.客户端指定DNS服务器测试验证

环境:
WEB-server:10.1.1.2
DNS-server:10.1.1.3
client:10.1.1.4

步骤:
1.搭建DNS服务器 (在10.1.1.3完成)
2.搭建WEB服务器 (在10.1.1.2完成)
3.测试验证

1.搭建DNS服务器 (在10.1.1.3完成)
[root@DNS-server ~]# vim /etc/named.conf    两个any,两个no
[root@DNS-server ~]# vim /etc/named.rfc1912.zones 
zone "myweb.cc" IN {
        type master;
        file "myweb.cc.zone";
        allow-update { none; };
};

zone "test.net" IN {
        type master;
        file "test.net.zone";
        allow-update { none; };
};
在/var/named/里面添加两个文件myweb.cc.zone test.net.zone
#cd /var/named/               //-p 连同档案的属性一起复制过去
#cp -p named.localhost myweb.cc.zone   //复制个模板,方便编写
#cp -p named.localhost test.net.zone
然后修改   @ IN SOA myweb.cc.  rname.....
          @  NS a.myweb.cc.
          a  A  10.1.1.3
          www A  10.1.1.1   另一个test.net.zone 略
修改完毕重启服务  #service named restart
当请求www.myweb.cc时域名对应的IP是什么,就会查询 /var/named/myweb.cc.zone记录
 www A  10.1.1.1     向10.1.1.3dns服务器要,服务器回应10.1.1.1

2.搭建web服务
1)创建相应的数据目录和首页文件
#mkdir /data/{myweb,myftp}
[root@server ~]# echo "this is myweb.cc" > /data/myweb/index.html
[root@server ~]# echo "this is myftp" > /data/myftp/index.html
2)发布两个虚拟主机
#vim /etc/httpd/conf/httpd.conf
打开NameVirtualHost *:80 ★
<VirtualHost *:80>
    ServerAdmin webmaster@dummy-host.example.com
    DocumentRoot /data/myweb
    ServerName www.myweb.cc   //当访问到www.myweb.cc的时候就到/data/myweb找首页文件
    ErrorLog logs/80-error_log
    CustomLog logs/80-access_log common
</VirtualHost>

<VirtualHost *:80>
    ServerAdmin webmaster@dummy-host.example.com
    DocumentRoot /data/myftp
    ServerName ftp.test.net
    ErrorLog logs/80-error_log
    CustomLog logs/80-access_log common
</VirtualHost>
3.重启服务
#service httpd restart

4.客户端测试验证(如下图)
CLIENT:
#echo nameserver 10.1.1.3>/etc/resolv.conf   //resolv.conf是DNS客户机配置文件
#elinks http://ftp.test.net

在这里插入图片描述
补充:
/usr/local/apache/conf/extra配置文件中比较重要的:httpd-default.conf、httpd-mpm.conf、http-vhosts.conf

文件;httpd-default.conf
Timeout 60     
KeepAlive On   建立连接后保持一端时间
KeepAliveTimeout 5  默认5秒内没有请求连接,就断开
ServerTokens Prod 禁止显示或发送Apache版本号,更安全
ServerTokens Full (或未指定) 
服务器会发送(比如): Server: Apache/2.0.41 (Unix) PHP/4.2.2 MyMod/1.2

文件:httpd-mpm.conf
# perfork MPM       //进程模式
<IfModule prefork.c>
StartServers        10      //初始建立的进程数
MinSpareServers 10          //最小空闲的进程数
MaxSpareServers 15          //最大空闲的进程数
ServerLimit     2000        //最大启动的进程数  默认256
MaxClients      2000        //最大并发连接数    默认256
MaxRequestsPerChid  4000    //每个子进程在其生命周期内允许响应的最大请求数,0表不限制
</IfModule>

# worker MPM        //线程模式
<IfModule worker.c>         
StartServer         2       //初始创建的进程数
ThreadPerChild  50          //每个进程建立的线程数
MinSpareThreads 100         //最小空闲的线程数
MaxSpareThreads 200         //最大空闲的线程数
MaxClients      2000        //最大的并发访问量(线程)
MaxRequestsPerChild 0       //每个子进程在其生命周期内允许响应的最大请求数,0表不限制
</IfModule>


文件:httpd-vhosts.conf
<VirtualHost *:80>
    ServerAdmin webmaster@dummy-host.example.com
    DocumentRoot /data/myweb
    <Directory "/data/myweb">
		Options None
		AllowOverride None
		Require all granted   # 这个是Centos 8写法
	</Directory>
    ServerName www.myweb.cc   //当访问到www.myweb.cc的时候就到/data/myweb找首页文件
    ServerAlias myweb.cc
    ErrorLog logs/80-error_log
    CustomLog logs/80-access_log common
</VirtualHost>
然后在 httpd.conf 把这个文件包含进去 Include conf/httpd-vhosts.conf的方法

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值