nginx+fastdfs集群方案

本文详细介绍了如何配置FastDFS集群,并结合Nginx实现高可用和缓存服务。首先,关闭防火墙和修改SELinux配置,然后安装FastDFS的tracker和storage服务,设置开机启动。接着,安装Nginx并集成FastDFS模块,配置负载均衡和缓存策略。最后,添加Nginx服务至系统启动项,并调整文件权限,确保防火墙开放正确端口。

#临时关闭防火墙:systemctl stop firewalld.service
#永久关闭防火墙:systemctl disable firewalld.service
#打开文件:vi /etc/selinux/config,并把SELINUX=enforcing修改为SELINUX=disabled。

所有机器安装编译工具:yum -y install gcc yum -y install gcc-c++

拷贝文件:libfastcommon-master.zip到/usr/local/src目录下并解压。
进入刚刚解压后的文件夹,使用命令:./make.sh编译安装包,并使用命令:./make.sh install安装。

拷贝文件:FastDFS_v5.05.tar.gz到usr/local/src目录下并解压。
进入刚刚解压后的文件夹,使用命令:./make.sh编译安装包,并使用命令:./make.sh install安装。

进入目录:/etc/fdfs打开tracker.conf.sample另存为tracker.conf。
在根目录创建文件夹tracker。打开文件/etc/fdfs/tracker.conf,修改base_path=/tracker。
一般只需改动以下几个参数即可:
base_path=/tracker         #设置tracker的数据文件和日志目录(需预先创建)
max_connections            #最大连接数
allow_hosts=*              #设置可以连接当前tracker的IP范围,包括client和storage_server
#disabled=false            #启用配置文件
#port=22122                #设置tracker的端口号
#http.server_port=8080     #设置http端口号
在/etc/fdfs/目录下执行命令:fdfs_trackerd tracker.conf。或者在任意目录执行:fdfs_trackerd /etc/fdfs/tracker.conf 来启动tracker(跟踪器)。
确认启动是否成功。(查看是否对应端口22122是否开始监听)
命令:netstat -unltp | grep fdfs
结果:tcp    0    0.0.0.0:22122       0.0.0.0:*           LISTEN      1766/fdfs_trackerd
设置开机自动启动
复制/usr/local/src/FastDFS/init.d/fdfs_trackerd文件到/etc/rc.d/init.d/fdfs_trackerd,如果存在就不用复制。
打开上述文件,删除所有路径中的/local(根据自己系统的执行文件来修改)。
根目录下执行命令:chkconfig --add /etc/rc.d/init.d/fdfs_trackerd 来把启动项,加入开机启动。
接着执行:chmod 777 /etc/rc.d/init.d/fdfs_trackerd 来修改文件的权限,使所有用户都可读写和执行。


进入目录:/etc/fdfs打开storage.conf.sample另存为storage.conf。
在根目录创建文件夹storage。打开文件/etc/fdfs/storage.conf,修改base_path=/storage、store_path0=/storage、tracker_server=192.168.254.130:22122(自己安装tracker的ip地址和端口)。
一般只需改动以下几个参数即可:
group_name=group1         #组名,根据实际情况修改
base_path=/storage        #设置storage的日志目录(需预先创建)
store_path0=/storage      #存储路径
store_path_count=1        #存储路径个数,需要和store_path个数匹配
tracker_server=192.168.254.130:22122            #tracker服务器的IP地址和端口号(自己安装tracker的ip地址和端口)
#disabled=false            #启用配置文件
#port=23000                #设置storage的端口号
#http.server_port=8080       #设置http端口号 fyj 此处不和nginx的端口对应 无影响
在/etc/fdfs/目录下执行命令:fdfs_storaged storage.conf。或者在任意目录执行:fdfs_storaged /etc/fdfs/storage.conf 来启动storage(存储节点)。
确认启动成功后,可以运行fdfs_monitor查看storage服务器是否已经登记到tracker服务器。
命令:fdfs_monitor /etc/fdfs/storage.conf
结果:看到“192.168.254.131(本机ip)  ACTIVE”即可确认storage运行正常。
设置开机自动启动
复制/usr/local/src/FastDFS/init.d/fdfs_storaged文件到/etc/rc.d/init.d/fdfs_storaged,如果存在就不用复制。
打开上述文件,删除所有路径中的/local(根据自己系统的执行文件来修改)。
根目录下执行命令:chkconfig --add /etc/rc.d/init.d/fdfs_storaged 来把启动项,加入开机启动。
接着执行:chmod 777 /etc/rc.d/init.d/fdfs_storaged 来修改文件的权限,使所有用户都可读写和执行。


-----------------------------------------------------------------------------------------------------------------

在每个storage上安装nginx。
FastDFS通过Tracker服务器,将文件放在Storage服务器存储,
但是同组之间的服务器需要复制文件,有延迟的问题.
假设Tracker服务器将文件上传到了192.168.1.80,文件ID已经返回客户端,
这时,后台会将这个文件复制到192.168.1.30,如果复制没有完成,客户端就用这个ID在192.168.1.30取文件,肯定会出现错误
这个fastdfs-nginx-module可以重定向连接到源服务器取文件,避免客户端由于复制延迟的问题,出现错误。

拷贝文件:fastdfs-nginx-module_v1.15.tar.gz到/usr/local/src目录下并解压。
进入刚刚解压后的文件夹,打开src文件夹下的config开始修改。
原来的内容是
CORE_INCS="$CORE_INCS /usr/local/include/fastdfs /usr/local/include/fastcommon/"
修改为
CORE_INCS="$CORE_INCS /usr/include/fastdfs(FastDFS的安装文件) /usr/include/fastcommon(FastDFS的安装文件)"
各个版本的位置并不统一.所以需要根据自己的版本修改位置。

安装编译工具:yum -y install gcc automake autoconf libtool make gcc-c++ pcre* zlib openssl openssl-devel

拷贝文件:nginx-1.7.10.tar.gz到/usr/local/src目录下并解压。
进入刚刚解压后的文件夹,分三步执行命令:
1:./configure --prefix=/usr/local/nginx --add-module=/usr/local/src/fastdfs-nginx-module/src(运行./configure进行安装前的设置,主要设置安装路径、FastDFS插件模块目录、pcre库目录、zlib库目录。)
如果提示错误,可能缺少依赖的软件包,需先安装依赖包,再次运行./configure)
2:make( 运行make进行编译,确保编译成功。) 
3:make install(运行make install进行安装。)

复制/usr/local/src/fastdfs-nginx-module/src/mod_fastdfs.conf文件到/etc/fdfs,命令:cp /usr/local/src/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs/

------------------------------------------------------------------------------------------------------------------------------


编辑/usr/local/nginx/conf配置文件目录下的nginx.conf,设置添加storage信息并保存。
(将server段中的listen端口号改为8080:listen  8080;)
在server段中添加:
location ~/group[1-3]/M00 {
    root   /storage;
    ngx_fastdfs_module;
}
###########一组多个storage###########
location ~/group1/M00 { fyj #~的意思任意ip都可以访问,不止是本机
    root   /storage; #storage的文件目录
    ngx_fastdfs_module;;
}
###########一组多个storage###########


编辑/etc/fdfs配置文件目录下的mod_fastdfs.conf,设置storage信息并保存。
一般只需改动以下几个参数即可:
base_path=/storage                #保存日志目录
store_path0=/storage              #存储路径
store_path_count=1                #存储路径个数,需要和store_path个数匹配
tracker_server=192.168.254.130:22122 #tracker服务器的IP地址以及端口号(自己安装tracker的ip地址和端口)。
storage_server_port=23000         #storage服务器的端口号
group_name=group1                 #当前服务器的group名
url_have_group_name= true         #文件url中是否有group名  fyj
http.need_find_content_type=true  #从文件扩展名查找文件类型(nginx时为true)
group_count= 0                    #设置组的个数,0是单组
在末尾增加3个组的具体信息(解开末尾注释):
[group1]
group_name=group1
storage_server_port=23000
store_path_count=1
store_path0=/storage
 
[group2]
group_name=group2
storage_server_port=23000
store_path_count=1
store_path0=/storage

建立M00至存储目录的符号连接。
命令:
ln -s /storage/data /storage/M00
ll /storage/M00
结果:
lrwxrwxrwx. 1 root root 13 3月  17 13:54 /storage/M00 -> /storage/data

至此,nginx以及FastDFS插件模块设置完成。 

-------------------------------------------------------------------------------------------------------------------------

复制/usr/local/src/FastDFS/conf/http.conf和mime.types到/etc/fdfs目录下
命令:cp /usr/local/src/FastDFS/conf/http.conf /etc/fdfs
      cp /usr/local/src/FastDFS/conf/mime.types /etc/fdfs

进入:/usr/local/nginx/sbin目录,使用命令:/usr/local/nginx/sbin/nginx
重启nginx的命令:/usr/local/nginx/sbin/nginx -s reload

storage全部安装上nginx并确认运行正常。
----------------------------------------------------------------------------------------------


在tracker上安装nginx
在tracker上安装的nginx主要为了提供http访问的反向代理、负载均衡以及缓存服务。

安装编译工具:yum -y install gcc automake autoconf libtool make gcc-c++ pcre* zlib openssl openssl-devel

1.安装
首先拷贝文件:nginx-1.7.10.tar.gz和ngx_cache_purge-2.3.tar.gz到/usr/local/src目录下并解压。

进入刚刚解压后的/usr/local/src/nginx-1.7.10文件夹,分三步执行命令:
1:./configure --prefix=/usr/local/nginx --add-module=/usr/local/src/ngx_cache_purge-2.3 (运行./configure进行安装前的设置,主要设置安装路径、FastDFS插件模块目录、pcre库目录、zlib库目录。)
#./configure --prefix=/usr/local/nginx --add-module=/usr/local/src/fastdfs-nginx-module/src --add-module=/usr/local/src/ngx_cache_purge-2.3          #tracker和storage在同一机器上,用此命令
如果提示错误,可能缺少依赖的软件包,需先安装依赖包,再次运行./configure)
2:make( 运行make进行编译,确保编译成功。) 
3:make install(运行make install进行安装。)

2.配置
编辑/usr/local/nginx/conf配置文件目录下的nginx.conf,设置负载均衡以及缓存。

worker_processes  4;                  #根据CPU核心数而定
events{
    worker_connections  65535;       #最大链接数
    use epoll;#新版本的Linux可使用epoll加快处理性能
}

http{
    #在日志格式中加入$upstream_cache_status
    log_format  test  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for" $upstream_cache_status $request_time';

    access_log  logs/access.log  test;
    
    #设置缓存参数
    client_max_body_size 300m; #用来设置允许客户端请求的最大的单个文件字节数。
    client_header_buffer_size 32K; #用于指定来自客户端请求头的headerbuffer大小。对于大多数请求,1K的缓冲区大小已经足够,如果自定义了消息头或有更大的Cookie,可以增加缓冲区大小。这里设置为32K。
    large_client_header_buffers 4 32k;用来指定客户端请求中较大的消息头的缓存最大数量和大小, “4”为个数,“128K”为大小,最大缓存量为4个共128K。
    sendfile on; #参数用于开启高效文件传输模式。将tcp_nopush和tcp_nodelay两个指令设置为on用于防止网络阻塞。
    tcp_nopush     on;
    tcp_nodelay    on;
    

    #设置缓存存储路径、存储方式、分配内存大小、磁盘最大空间、缓存期限
    #/var/cache/nginx/proxy_cache 表示缓存文件要存放的目录
    #levels=1:2 表示缓存目录的第一级目录是1个字符,第二级目录是2个字符,即/var/cache/nginx/proxy_cache/a/1b这种形式
    #keys_zone=http-cache:100m 表示这个zone(区)名称为http-cache,分配的内存大小为100MB
    #inactive=1d 表示http-cache这个zone(区)中的缓存文件如果在6天内都没有被访问,那么文件会被cache manager进程删除掉
    #max_size=1g 表示http-cache这个zone(区)的硬盘容量为6GB

    #开启服务器缓存
    proxy_cache_path /var/cache/nginx/proxy_cache levels=1:2 keys_zone=http-cache:100m inactive=1d max_size=1g; 
    proxy_temp_path /var/cache/nginx/proxy_cache/temp;

    #设置group1的服务器,设置group1的集群机器
    upstream fdfs_group1 {
        server 192.168.77.131:80 weight=1 max_fails=2 fail_timeout=30s;
        server 192.168.77.132:80 weight=1 max_fails=2 fail_timeout=30s;
    }
    #设置group2的服务器,设置group2的集群机器
    upstream fdfs_group2 {
        server 192.168.77.133:80 weight=1 max_fails=2 fail_timeout=30s;
    }
    
    server{
    
        #设置group1的负载均衡参数
        location /group1/M00 {
            proxy_next_upstream http_502 http_504 error timeout invalid_header; #错误转发,转发到集群中的另一台机器
            proxy_cache http-cache;  #此处需和缓存keys_zone后的参数名相同
            proxy_cache_valid 200 304 1h; #设置状态码为200和304的响应可以进行缓存,并且缓存时间为1小时
            proxy_cache_key $host$uri$is_args$args; #设置缓存的key
            proxy_set_header Host  $host;
            proxy_set_header X-Forwarded-For  $remote_addr;
            proxy_set_header X-Real-IP $remote_addr;
            add_header X-Cache $upstream_cache_status;
            proxy_pass http://fdfs_group1;   #此处的名称和upstream 后面自定义的名称相同
            expires      1d;
        }
        
        #设置group2的负载均衡参数
        location /group2/M00 {
            proxy_next_upstream http_502 http_504 error timeout invalid_header; #错误转发,转发到集群中的另一台机器
            proxy_cache http-cache;  #此处需和缓存keys_zone后的参数名相同
            proxy_cache_valid 200 304 1h; #设置状态码为200和304的响应可以进行缓存,并且缓存时间为1小时
            proxy_cache_key $host$uri$is_args$args; #设置缓存的key
            proxy_set_header Host  $host;
            proxy_set_header X-Forwarded-For  $remote_addr;
            proxy_set_header X-Real-IP $remote_addr;
            add_header X-Cache $upstream_cache_status;
            proxy_pass http://fdfs_group2;   #此处的名称和upstream 后面自定义的名称相同
            expires      1d;
        }

        #设置清除缓存的访问权限
        location ~ /purge(/.*) {
            #允许的IP
            allow 127.0.0.1;
            #10网段的都可以访问
            allow 192.168.254.0/24;
            deny all;  #其他的禁止访问
            proxy_cache_purge http-cache $host$1$is_args$args;
        }
    }
 
----------------至此,nginx以及nginx cachepurge插件模块设置完成。
3.      运行
启动nginx,确认启动是否成功。(查看是否对应端口8080是否开始监听)
启动nginx命令:/usr/local/nginx/sbin/nginx
查看是否对应端口是否开始监听的命令:netstat -unltp | grep nginx
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      7600/nginx: master  

4.    上传文件

尝试上传一个文件到FastDFS,然后访问试试。先配置client.conf文件。
打开文件/etc/fdfs/client.conf
修改以下参数:
base_path=/client                          #日志存放路径,需要预先创建
tracker_server=192.168.254.130:22122       #tracker服务器IP地址和端口号(自己安装tracker的ip地址和端口)
http.tracker_server_port=8080              #tracker服务器的http端口号 fyj 此处不配置 也无影响?测试时没发现有影响
 
使用fdfs_upload_file命令来上传一个文件,程序会自动返回文件的URL。
上传文件的命令:fdfs_upload_file /etc/fdfs/client.conf /home/sao.jpg

然后使用浏览器访问,全部访问tracker,tracker上配置了http访问代理,会自动去storage上找文件(storage可以使用内网ip,可以加快文件同步,tracker暴露在外网就可以了):
http://192.168.152.128/group1/M00/00/00/wKiYgVUH4o2AbSYkAAU9pfnz-JI275.jpg
http://192.168.152.128/group1/M00/00/00/wKiYglUH7U2AS89MAAnUHXlWbUg487.jpg

------------------------------把nginx添加进系统服务,并开机启动开始----------------------------------
CentOS 系统服务脚本目录:/usr/lib/systemd/  

有系统(system)和用户(user)之分,如需要开机没有登陆情况下就能运行的程序,
存在系统服务(system)里,即:/usr/lib/systemd/system/ 

反之,用户登录后才能运行的程序,存在用户(user)里。
服务以.service结尾。

这边以nginx开机运行为例:vim /usr/lib/systemd/system/nginx.service

按 i 进入编辑模式,编辑完后按Esc退出编辑模式,再输入:wq 保存并退出vim编辑器。

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

[Service]
Type=forking
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
PrivateTmp=true

[Install]
WantedBy=multi-user.target


---------------------配置说明--------------------
[Unit]:服务的说明
Description:描述服务
After:描述服务类别
[Service]服务运行参数的设置
Type=forking是后台运行的形式
ExecStart为服务的具体运行命令
ExecReload为重启命令
ExecStop为停止命令
PrivateTmp=True表示给服务分配独立的临时空间
注意:[Service]的启动、重启、停止命令全部要求使用绝对路径
[Install]服务安装的相关设置,可设置为多用户


更改nginx.service文件权限为:754的命令:chmod 754 /usr/lib/systemd/system/nginx.service

启用开机启动:systemctl enable nginx

用systemctl命令,要记住start,stop,restart,status,enable,disable,is-enabled。就可

注意点:在storage中添加nginx开机启动的服务时,必须把/etc/fdfs/mon_fastdfs.conf配置文件中的tracker_server这个参数配置上,哪怕随便配置一个tracker的ip和端口。
否则会导致nginx在开机启动时,子进程无法启动的问题。
------------------------------把nginx添加进系统服务,并开机启动结束-------------------------------

---------------------文件权限:754说明开始--------------------------
读r=4
写w=2
执行x=1

总共用三个数字代表三个组的权限,每个数字的大小等于每个组所包含的三个权限的数字之和。

例如:一个文件的权限为rw-rwx-r-x,它的数字表示方法就是675
也就是    [用户]读写
          [群组]读写执行
          [其它]读执行

常用的权限组合:
          444=r--r--r--
          644=rw-r--r--
          666=rw-rw-rw
          754=rwxr-xr--
          777=rwxrwxrwx

所以 644的意思,第一个6肯定是4+2的,有“读”跟“写”的意思,  
所以在第一行 在“读”和“写”上打对号
4肯定就是4,就是读,所以在第2行 ,“读”上打对号,(没有“写”跟“执行”的权限)同理第3行也是“读”打对号。
    
-----------------------文件权限:754说明结束------------------------------

-------------------------firewall防火墙开放端口 start-------------------------------------
开启端口

firewall-cmd --zone=public --add-port=80/tcp --permanent

命令含义:

--zone #作用域

--add-port=80/tcp  #添加端口或端口范围80-90,格式为:端口/通讯协议   

--query-port=80/tcp #查询端口是否开放

--permanent  #永久生效,没有此参数重启后失效


重启防火墙

firewall-cmd --reload
--------------------------firewall防火墙开放端口 end---------------------------------------

-------------------------iptables防火墙开放端口 start-------------------------------------
iptables -t filter -A INPUT -p tcp --dport 80 -j ACCEPT
-A #追加
-p tcp #协议 tcp udp
--dport #端口 22
-j 
 DROP:悄悄丢弃
        一般我们多用DROP来隐藏我们的身份,以及隐藏我们的链表
 REJECT:明示拒绝
 ACCEPT:接受
    custom_chain:转向一个自定义的链
 DNAT
 SNAT
 MASQUERADE:源地址伪装
 REDIRECT:重定向:主要用于实现端口重定向
 MARK:打防火墙标记的
 RETURN:返回
    在自定义链执行完毕后使用返回,来返回原规则链。
-D num:删除,明确指定删除第几条规则

iptables save #永久生效
--------------------------iptables防火墙开放端口 end---------------------------------------

-----------------------nginx_proxy_cache start------------------------------
$upstream_cache_status包含以下几种状态:

MISS 未命中,请求被传送到后端
HIT 缓存命中
EXPIRED 缓存已经过期请求被传送到后端
UPDATING 正在更新缓存,将使用旧的应答
STALE 后端将得到过期的应答
BYPASS 缓存被绕过了

清除缓存
使用方式:
其中uri为资源的URI,如果缓存的资源的URL为 http://192.168.10.16/group2/M00/00/46/ooYBAFIODMyAUSk3ANFjhglUy6s933.flv,
那么访问 http://192.168.10.16/purge/group2/M00/00/46/ooYBAFIODMyAUSk3ANFjhglUy6s933.flv则会清除缓存。

注意:nginx配置中location的匹配符优先级
-----------------------nginx_proxy_cache end------------------------------

---------------nginx的location的匹配规则和优先级 start---------------------
一、 location 的匹配符
1.等于匹配符:=
等于匹配符就是等号,特点可以概括为两点:
精确匹配
不支持正则表达式
2.空匹配符
空匹配符的特点是:
匹配以指定模式开始的 URI
不支持正则表达式
3.正则匹配符:~
正则匹配符是可以使用正则表达式的匹配符。不过这里要强调的是,一般来说~是指:
区分大小写的正则匹配
而~*表示:
不区分大小写的正则匹配
但是对于一些对大小写不敏感的操作系统,这两者没有区别。另外一个就是^~,其表示以指定模式开始的正则匹配。
4.内部访问符:@
一般用于错误页面等,这个暂不讨论。
二、匹配符优先级
1.=
2.空匹配符,满足精确匹配时
3.^~
4.~或~*
5.空匹配符,满足以指定模式开始时的匹配时
---------------nginx的location的匹配规则和优先级 end---------------------


--------------------------------命令汇总--------------------------------------
启动tracker(跟踪器):fdfs_trackerd /etc/fdfs/tracker.conf
重启tracker(跟踪器):fdfs_trackerd /etc/fdfs/tracker.conf restart | stop | start
启动storage(存储节点):fdfs_storaged /etc/fdfs/storage.conf
启动storage(存储节点):fdfs_storaged /etc/fdfs/storage.conf restart | stop | start
删除storage(存储节点):fdfs_monitor /etc/fdfs/client.conf delete groupname 192.168.1.2
查看storage(存储节点)的运行状态:fdfs_monitor /etc/fdfs/storage.conf

启动nginx:/usr/local/nginx/sbin/nginx
重启nginx:/usr/local/nginx/sbin/nginx -s reload
停止nginx:/usr/local/nginx/sbin/nginx -s stop

查看对应程序是否执行:netstat -unltp | grep  fdfs或者nginx

进入编辑器:vim /lib/systemd/system/nginx.service (不存在会新建)。
进入编辑模式:i
退出编辑模式:Esc
保存的命令为::wq(冒号)

更改文件权限:chmod 754 nginx.service

解压.tar.gz文件:tar zxvf 文件名 (注意解压后的目录)
 1、*.tar 用 tar –xvf 解压 
 2、*.gz 用 gzip -d或者gunzip 解压 
 3、*.tar.gz和*.tgz 用 tar –xzf 解压 
 4、*.bz2 用 bzip2 -d或者用bunzip2 解压 
 5、*.tar.bz2用tar –xjf 解压 
 6、*.Z 用 uncompress 解压 
 7、*.tar.Z 用tar –xZf 解压 
 8、*.rar 用 unrar e解压 
 9、*.zip 用 unzip 解压

删除文件(夹):rm -rf /home/test
f是不提示用户,删除目录下的所有文件。请注意检查路径,输成别的目录就悲剧了。

把启动文件,加入开机启动:chkconfig --add /etc/rc.d/init.d/fdfs_trackerd 

linux系统的文件限制


#./configure --with-http_realip_module  --with-pcre  --with-luajit --add-module=/usr/local/src/ngx_cache_purge-2.3 --add-module=/usr/local/src/nginx_upstream_check_module-0.3.0 -j2 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值