如何在Linux环境下快速搭建一个电影网站,在网络上查询了一番后,发现苹果CMS开源且功能符合基本电影网站需求。下面记录一下苹果CMS搭建过程。

首先服务器上搭建好LNMP环境,也可以使用各种傻瓜面板进行安装。

  • Windows 平台: IIS/Apache//等 + PHP(5.5 +) + MySQL(5.5 +)
  • Linux/Unix 平台: Apache//等 + PHP (5.5 +) + MySQL(5.5 +) (PHP必须在非安全模式下运行)
  • 注意:PHP版本不要使用PHP8,PHP8下会有很多报错,建议安装PHP7.2

什么是苹果CMS

苹果CMS程序是一套采用PHP+MYSQL环境下运行的完善而强大的快速建站系统。 经过近多年的开发经验和技术积累,苹果CMS程序已逐步走向成熟,在易用性和功能上已经成为同行中的佼佼者。 程序体积小、运行速度快、经过优化程序代码、高效缓存处理后,只要普通的虚拟主机就可以完美搭建起来,建站成本非常低。仿MVC模板分离,内置标签,自定义函数标签接口,强大的自定义采集功能,只要你会HTML就可以轻松做出个性化的网站。 程序易用性和功能上一直以来都积极采纳广大站长提出的各种好的建议,迅速响应各种紧急问题,我们的服务理念贯穿其中,保证每一位站长每一个环节都可以从容应对。

Github源码:https://github.com/magicblack

苹果CMS:www.maccms.la

苹果cms在线手册

安装苹果CMS

通过SSH登录到服务器后,使用 cd 命令进入web存放目录,一般位置是 /home/www

1
cd /home/www

进入到www目录后,开始克隆拉取苹果CMS网站源码。

1
git clone https://github.com/magicblack/maccms10.git
苹果cms网站源码拉取完毕后,更改一下目录权限,当前nginx访问权限的用户和用户组都是nginx,需要把苹果cms的目录也设置成nginx用户可以访问。
1
chown nginx:nginx -R /home/www/maccms10

接下来开始进行安装操作,在Nginx中修改配置文件中的server模块,将网站存放目录修改成 /home/www/maccms10 之后修改 location / 根目录内容,具体修改给容如下:

1
2
3
4
5
6
7
8
9
10
#伪静态页
location / {
 if (!-e $request_filename) {
        rewrite ^/index.php(.*)$ /index.php?s=$1 last;
        rewrite ^/admin.php(.*)$ /admin.php?s=$1 last;
        rewrite ^/api.php(.*)$ /api.php?s=$1 last;
        rewrite ^(.*)$ /index.php?s=$1 last;
        break;
   }
}

server. 的完整代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#域名端口301重定向https

    server {
                  listen 80;
                  listen [::]:80;
                  server_name www.uzbox.tk uzbox.tk; # 网站的域名,可以是多个,用空格分开
                  return 301 https://uzbox.tk$request_uri;
                }

#网站配置核心块

server {
       listen 443 ssl http2;
       listen [::]:443 ssl http2;
       server_name  uzbox.tk;
       root /home/www/maccms10;
       index index.php index.html index.htm;

       ssl_certificate /etc/letsencrypt/live/uzbox.tk/fullchain.pem;         # ssl证书地址
       ssl_certificate_key /etc/letsencrypt/live/uzbox.tk/privkey.pem;    # ssl证书地址
       include /etc/letsencrypt/options-ssl-nginx.conf;
       ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
        # Config for 0-RTT in TLSv1.3
        ssl_early_data on;
        ssl_stapling on;
        ssl_stapling_verify on;
        add_header Strict-Transport-Security "max-age=31536000";

        include /etc/nginx/default.d/*.conf;                 # 从 /etc/nginx/default.d 加载默认服务器块的配置文件。

#伪静态页
location / {
 if (!-e $request_filename) {
        rewrite ^/index.php(.*)$ /index.php?s=$1 last;
        rewrite ^/admin.php(.*)$ /admin.php?s=$1 last;
        rewrite ^/api.php(.*)$ /api.php?s=$1 last;
        rewrite ^(.*)$ /index.php?s=$1 last;
        break;
   }
}

#反向代理

         location /chat886  {
              proxy_redirect off;
              proxy_pass http://127.0.0.1:12345;
              proxy_http_version 1.1;
              proxy_set_header X-Real-IP $remote_addr;
              proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
              proxy_set_header Upgrade $http_upgrade;
              proxy_set_header Connection "upgrade";
              proxy_set_header Host $http_host;

              # Config for 0-RTT in TLSv1.3
              proxy_set_header Early-Data $ssl_early_data;
                                            }

        }

Nginx修改完毕后,重启启动Nginx服务或者reboot重新启动服务器后,输入 nginx -t 验证一下配置信息。

下面输入你Nginx中配置的网站域名,开始安装苹果CMS-V10。

点击蓝色按钮,同意协议并安装系统。

目录权限一定要配置正确,否则会提示无法读取,例如服务器上安装的Nginx服务的用户组是nginx,然后Web网站存放目录的用户组和用户,也要改成nginx,目录的文件夹权限默认755。

PHP的函数扩展这里,如果有没有安装的,需要在服务器上使用 dnf install 命令安装。具体安装方法可以参考:安装PHP8

点击立即执行安装,只需要三步设置,苹果CMS就已经安装好了。接下来更改admin.php文件。

安装完成后,会提示修改后台默认入口文件名 admin.php,进入网站根目录下找到 admin.php 重命名为别的就可以,例如 adminxxx.php 然后在浏览器输入你的域名+自定义的php文件名称,即可进入苹果CMS管理后台,例如:"https://uzbox./admin888.php"

目录结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
│─application //应用目录
│  │─admin //后台模块
│  │─api //api模块
│  │─common //公共模块
│  │─extra //配置文件
│  │─index //前台模块
│  │─data //应用初始化和数据库备份目录
│  │─install //安装模块
│  │─lang //语言包
│  │─database.php //数据库配置文件
│  │─config.php //tp5应用配置文件
│  │─route.php //伪静态路配置文件
│  └─common.php //公共函数
│─addons //插件目录
│─extend  //扩展目录
│─runtime //缓存目录
│─static //静态文件目录
│─template //前台模板目录
│─thinkphp //tp目录
│─upload //附件目录
│─vendor //第三发库目录
└─index.php //前台入口文件
└─api.php //api入口文件
└─admin.php //后台入口文件
  • application: 标准 tp5 应用目录,存放程序所有模型、控制器和配置文件。
  • application/extra/.php: 后台所有配置参数。
  • application/extra/addons.php: 已安装的第三方应用配置。
  • application/extra/domain.php: 站群域名配置。
  • application/extra/timming.php: 定制任务配置。
  • application/extra/vodplayer.php: 已安装播放器配置。
  • application/extra/voddowner.php: 已安装下载器配置。
  • application/data/backup: 备份数据目录,后台备份数据就在这个目录里面。
  • application/data/config: 后台自定义菜单配置。
  • application/data/install: 初始安装目录,如需重新安装,把里面的 install.lock删除即可重进就如安装步骤。
  • application/route.php: 伪静态路由文件,如果后台写错路由导致后台无法访问,删除这个文件即可正常。
  • application/database.php: MySQL数据库连接配置文件。
  • addons: 用于存放大三方应用插件目录,购买的插件可以放在这里。
  • template: 主题模板目录,用于存放前台模板的目录。
  • static: 用于存储默认css 和 js 等静态文件。

安全设置

为了程序更安全,建议将下列文件夹禁止运行PHP程序文件。

  • /application :限制php文件访问。
  • /addons :限制php文件访问。
  • /extend :限制php文件访问。
  • /thinkphp :限制php文件访问。
  • /vendor :限制php文件访问。
  • /upload :限制php文件访问。

Nginx禁用目录下的php脚本访问:

Nginx下禁止制定目录运行php脚本,在server配置中增加配置参数,可以通过location条件匹配定位后进行权限禁止。

注意:下面的代码要放置在PHP解析代码Fastcgi的上面才会生效。

1
2
3
4
5
6
7
8
9
10
#单个目录禁止
location ~* ^/upload/.*\.(php|php5)$
{
deny all;
}
# 多个目录禁止
location ~* ^/(upload|vendor|thinkphp|extend|addons|application)/.*\.(php|php5)$
{
deny all;
}

到这里苹果CMS就安装完毕了,Web网站的框架已经搭建好了,接下来需要添加各种采集规则与前台模板。

安装模板

苹果cms 默认是没有前端模板的,需要你自己制作或者使用第三方模板,有了模板才能算是一个完成的网站,安装模板也非常的简单。

首先下载一个苹果CMS的测试模板:点击下载

你可以选择下载测试模板,也可以选择下载海螺模板,海螺模板V4.0里面有一些小问题,都已经得到了修复,可以正常使用。很多js问题都是hlexpand.js,hlhtml.js,hlstem.js这三个文件。JS文件被加密了,网上找了一些替换的。海螺模板必须要安装PHP的sg11扩展才可以使用,由于模板比较老了,现在的sg版本已经出到12了,没有测试是否支持sg12。

点击下载:海螺模板V4.0完美修复版.ZIP

  1. 上传模板至template目录内
  2. PHP必须安装sg11扩展
  3. 后台快捷菜单配置添加:
    海螺主题设置,/admin.php/admin/conch/theme
  4. 网站模板和手机模板都是【conch】模板目录【moban】,清理缓存。
  5. 注意微信观看功能要在conch/js/jquery.stem.js 这个文件夹修改相应的内容 第301行
  6. 幻灯片推荐9 大图模式需要上传海报图,建议尺寸1680px*580px 小图模式需设置3个推荐才显示
  7. 热播推荐1 建议推荐18个最佳(适配换一换功能)。
海螺模板V4.0完美修复版.ZIP
海螺模板V4.0完美修复版

将模板文件解压缩后,上传到 template 目录下,上传时候请将模板文件目录改名,然后更改模板文件目录用户与用户组,默认上传的所有者是 root 用户。

上传之后,更改文件目录的访问权限。

1
chown nginx:nginx -R /home/www/maccms10/template/movie

更改好模板文件所有者后,访问苹果CMS后台,系统 > 网站参数配置>基本设置的页面找到网站模板选项。下拉菜单,选择movie,测试的网站模板是自适应手机的,这里选择单域,之后点击保存。模板添加完毕!

有一些模板需要安装PHP的SG11扩展,SG11是SourceGuardian的缩写,11代表版本,SourceGuardian是一个可以对PHP进行加密的工具,因此用户可以快速安全地对PHP程序进行编码和编译。SG11扩展需要手动安装,首先下载SG11的扩展包。

点击下载SG11扩展包:SG11 WIN LINUX.ZIP

在服务器上使用 uname -a 命令查看系统版本,64位会显示x86_64。

然后在下载的扩展包中找到对应的扩展文件。例如:服务器上安装的是php7.2版本,就找 Linux x64 目录下的 ixed.7.2.lin 文件。

将 ixed.7.2.lin 文件上传到服务器上的 /usr/lib64/php 目录中。

上传完毕后,保存一下 ixed.7.2.lin 的位置,下面需要用到。 /usr/lib64/php/ixed.7.2.lin

编辑 /etc/php.ini 文件,在文件的最下面一行,添加 extension=/usr/lib64/php/ixed.7.2.lin

1
extension=/usr/lib64/php/ixed.7.2.lin

php.ini编辑完毕后,保存上传,然后重新启动PHP服务,或者reboot重新启动服务器。

验证SG11是否安装成功:

1
php --ri sourceguardian

苹果cms的模板文件已经安装完毕了,进行一些简单的设置后,前台就可以访问到Web页面了。这时候你会发现前台Web页面上空空如也。接下来是数据的采集录入。

数据采集

苹果CMS在网络上有很多的数据采集资源网站,设置好采集接口,一键采集即可导入数据。

下面是一个采集导入的例子:

首先在网络上搜索苹果CMS采集资源站,然后在苹果cms采集资源站中找到采集接口的URL链接。

天空资源网综合资源:

1
https://api.tiankongapi.com/api.php/provide/vod/at/xml/

m3u8资源:

1
https://m3u8.tiankongapi.com/api.php/provide/vod/at/xml/

在采集数据之前,需要先添加资源站的播放器,如果不添加播放器,采集数据之后没有播放地址。每个资源站都有自己对应的播放器,播放器不通用!

>点击下载天空资源站播放器

下载解压后,在苹果cms后台中导入播放器,超级控制台>视频>播放器>导入:

播放器导之后,在苹果cms后台里再进行采集接口添加,具体步骤如下:

超级控制台>采集>自定义接口>添加:

资源名称可以自定义填写,接口地址填写上面获取到的采集接口的URL链接,接口类型选择 xml,接口类型这里主要看你API接口地址的类型而定,如果你的采集接口地址是json的,在接口类型这里要选择json。资源类型选择 视频 ,数据操作选择 新增+更新,过滤地址默认 不过滤。 设置完毕后,点击保存。

在自定义接口页面,选择你要采集的资源站,在采集选项中,先点击采集当天。

在资源采集时会提示分类未绑定,跳过err。在进行采集之前,还需要绑定分类。等待当前采集任务完成后,自动跳到数据采集列表页面。

在分类后面点击绑定,这里的分类是在基础>分类管理中创建的。如果你还没有创建分类,需要按照采集站点的分类创建。

分类都创建好后,返回到自定义接口的分类绑定页面上,点击分类后面的绑定,然后选择分类,进行分类绑定。

分类绑定之后,关闭自定义接口,从新打开采集>自定义接口,进行采集。注意:分类中没有绑定的分类,不会采集未绑定分类的内容。

等待影片数据采集完成后,采集播放列表数据。

如果之前没有添加资源站的专用播放器,采集数据之后没有办法显示播放列表。需要进行播放器添加,然后再重新采集一遍数据,这样才可以添加播放列表。

超级控制台>采集>自定义接口,点击进入你所采集的资源站链接,进入资源库。在电影列表的左下方,点击采全部。

影片的播放列表已经采集入库了,接下来耐心等待就可以了。

播放器

设置苹果cmsV10自动播放下一集,那么应该如何操作呢?

增加苹果cmsV10自动播放下一集,增加记忆播放,P2P播放,但是该方法只能播放格式为m3u8的视频,首先替换一下dplayer播放器代码,替换路径为:static/player/dplayer.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
<html>
<head>
<title>dplayer播放器p2p加速+记忆播放</title>
<meta http-equiv="content-type" content="text/html;charset=UTF-8"/>
<meta http-equiv="content-language" content="zh-CN"/>
<meta http-equiv="X-UA-Compatible" content="chrome=1"/>
<meta http-equiv="pragma" content="no-cache"/>
<meta http-equiv="expires" content="0"/>
<meta name="referrer" content="never"/>
<meta name="renderer" content="webkit"/>
<meta name="msapplication-tap-highlight" content="no"/>
<meta name="HandheldFriendly" content="true"/>
<meta name="x5-page-mode" content="app"/>
<meta name="Viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=0"/>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/dplayer@latest/dist/DPlayer.min.css">
<style type="text/css">
body,html{width:100%;height:100%;background:#000;padding:0;margin:0;overflow-x:hidden;overflow-y:hidden}
*{margin:0;border:0;padding:0;text-decoration:none}
#stats{position:fixed;top:5px;left:8px;font-size:12px;color:#fdfdfd;text-shadow:1px 1px 1px #000, 1px 1px 1px #000}
#dplayer{position:inherit}
</style>
</head>
<body style="background:#000" leftmargin="0" topmargin="0" marginwidth="0" marginheight="0" oncontextmenu=window.event.returnValue=false>
<div id="dplayer"></div>
<div id="stats"></div>
<script language="Javascript">
document.oncontextmenu=new Function("event.returnValue=false");
document.onselectstart=new Function("event.returnValue=false");
</script>
<script src="https://cdn.jsdelivr.net/npm/cdnbye@latest"></script>
<script src="https://cdn.jsdelivr.net/npm/dplayer@latest"></script>
<script>
var webdata = {
set:function(key,val){
window.sessionStorage.setItem(key,val);
},
get:function(key){
return window.sessionStorage.getItem(key);
},
del:function(key){
window.sessionStorage.removeItem(key);
},
clear:function(key){
window.sessionStorage.clear();
}
};
var _peerId = '', _peerNum = 0, _totalP2PDownloaded = 0, _totalP2PUploaded = 0;
var dp = new DPlayer({
autoplay: true,
container: document.getElementById('dplayer'),
volume: 1.0,
preload: 'auto',
screenshot: true,
theme: '#28FF28',
video: {
url: parent.MacPlayer.PlayUrl,
type: 'customHls',
// pic: './loading.jpg', // 视频封面
customType: {
'customHls': function (video, player) {
const hls = new Hls({
debug: false,
// Other hlsjsConfig options provided by hls.js
p2pConfig: {
logLevel: false,
live: false, // 如果是直播设为true
// Other p2pConfig options provided by CDNBye
getStats: function (totalP2PDownloaded, totalP2PUploaded, totalHTTPDownloaded) {
console.warn(`totalP2PDownloaded ${totalP2PDownloaded} totalHTTPDownloaded ${totalHTTPDownloaded}`);
_totalP2PDownloaded = totalP2PDownloaded;
_totalP2PUploaded = totalP2PUploaded;
updateStats();
},
getPeerId: function (peerId) {
_peerId = peerId;
},
getPeersInfo: function (peers) {
_peerNum = peers.length;
updateStats();
},
}
});
hls.loadSource(video.src);
hls.attachMedia(video);
}
}
},
});
dp.seek(webdata.get('pay'+parent.MacPlayer.PlayUrl));
setInterval(function(){
webdata.set('pay'+parent.MacPlayer.PlayUrl,dp.video.currentTime);
},1000);
dp.on('ended', function (){
if(parent.MacPlayer.PlayLinkNext!=''){
top.location.href = parent.MacPlayer.PlayLinkNext;
}
});
function updateStats() {
var text = 'P2P已开启 共享' + (_totalP2PUploaded/1024).toFixed(2) + 'MB' + ' 已加速' + (_totalP2PDownloaded/1024).toFixed(2)
+ 'MB' + ' 此片有 ' + _peerNum + ' 位影迷正在观看';
document.getElementById('stats').innerText = text
}
</script>
</body>
</html>

代码修改完毕之后,还需要在后台设置播放器,超级控制台>视频>播放器>添加

添加一个新的播放器,编码不要填写错误,例如添加一个编码是tkm3u8的播放器。播放器添加完毕后,在播放器代码中填写如下代码。之后清空缓存。

1
2
MacPlayer.Html = '<iframe border="0" src="'+maccms.path+'/static/player/dplayer.html" width="100%" height="100%" marginWidth="0" frameSpacing="0" marginHeight="0" frameBorder="0" scrolling="no" vspale="0" noResize></iframe>';
MacPlayer.Show();

数据采集中遇到的问题

错误:SQLSTATE[22001]: String data, right truncated: 1406 Data too long for column 'vod_actor' at row 1

错误:SQLSTATE[22001]:字符串数据,右截断:1406 第 1 行“vod_actor”列的数据太长

错误原因:MySQL数据库中select mode(严格模式)插入字段长度超过设定的长度,
解决方法:设置sql_mode。

1
mysql -u root -p

在服务器上登录MySQL,输入MySQL的密码后,进入到mysql>命令行。

1
select @@sql_mode;

sql_mode主要是用来校验数据和合法性:ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

你可以将STRICT_TRANS_TABLES,去掉,或者清空sql_mode中的参数。

1
2
SET @@global.sql_mode='';
SET @@sql_mode='';

清空之后使用命令查询一下

1
2
select @@global.sql_mode;
select @@sql_mode;

设置完毕后,quit 退出MySQL,上面的方法如果重新启动MySQL服务的话就会失效,想永久生效,还需要更改MySQL的配置文件。

1
vi /etc/my.cnf.d/mysql-default-authentication-plugin.cnf

VI 编辑 mysql-default-authentication-plugin.cnf 配置文件,在 [mysqld] 下面添加:

1
2
3
key_buffer_size=16M
max_allowed_packet=8M
sql_mode=ANSI
  • key_buffer_size:用于指定索引缓冲区的大小
  • max_allowed_packet:设置一次消息传输的最大值
  • sql_mode:表示 SQL 模式的参数,通过这个参数可以设置检验 SQL 语句的严格程度

添加之后,保存退出VI模式,然后重新启动MySQL。

1
systemctl restart mysqld

最后查看一下,sql_mode的模式设置成功,已经变成了ANSI宽松模式。

sql_mode模式:

sql_mode 一共分为三种模式,分别是 ANSITRADITIONALSTRICT_TRANS_TABLES。 

ANSI模式:宽松模式,更改语法和行为,使其更符合标准SQL。对插入数据进行校验,如果不符合定义类型或长度,对数据类型调整或截断保存,报warning警告。对于本文开头中提到的错误,可以先把sql_mode设置为ANSI模式,这样便可以插入数据,而对于除数为0的结果的字段值,数据库将会用NULL值代替。

TRADITIONAL模式:严格模式,当向mysql数据库插入数据时,进行数据的严格校验,保证错误数据不能插入,报error错误,而不仅仅是警告。用于事物时,会进行事物的回滚。 注释:一旦发现错误立即放弃INSERT/UPDATE。如果你使用非事务存储引擎,这种方式不是你想要的,因为出现错误前进行的数据更改不会“滚动”,结果是更新“只进行了一部分”。

STRICT_TRANS_TABLES模式:严格模式,进行数据的严格校验,错误数据不能插入,报error错误。如果不能将给定的值插入到事务表中,则放弃该语句。对于非事务表,如果值出现在单行语句或多行语句的第1行,则放弃该语句。

sql_mode 详解:

ONLY_FULL_GROUP_BY
对于GROUP BY聚合操作,如果在SELECT中的列,没有在GROUP BY中出现,那么这个SQL是不合法的,因为列不在GROUP BY从句中。
NO_AUTO_VALUE_ON_ZERO
该值影响自增长列的插入。默认设置下,插入0或NULL代表生成下一个自增长值。如果用户希望插入的值为0,而该列又是自增长的,那么这个选项就有用了。
STRICT_TRANS_TABLES
如果一个值不能插入到一个事务中,则中断当前的操作,对非事务表不做限制。
NO_ZERO_IN_DATE
不允许日期和月份为零。
NO_ZERO_DATE
mysql数据库不允许插入零日期,插入零日期会抛出错误而不是警告。
ERROR_FOR_DIVISION_BY_ZERO
在insert或update过程中,如果数据被零除,则产生错误而非警告。如果未给出该模式,那么数据被零除时Mysql返回NULL。
NO_AUTO_CREATE_USER
禁止GRANT创建密码为空的用户。
NO_ENGINE_SUBSTITUTION
如果需要的存储引擎被禁用或未编译,那么抛出错误。不设置此值时,用默认的存储引擎替代,并抛出一个异常。
PIPES_AS_CONCAT
将"||"视为字符串的连接操作符而非或运算符,这和Oracle数据库是一样是,也和字符串的拼接函数Concat想类似。
ANSI_QUOTES
不能用双引号来引用字符串,因为它被解释为识别符。

订阅
提醒
guest
0 评论
内联反馈
查看所有评论