手上有个闲置的服务器不知道拿来干啥,仔细思考一圈后,决定搭建一个影视网研究一下原理,顺便记录一下,防丢失。最后着重说明:本文仅作技术交流,解答我之前内心的疑惑,请不要私自建站放到公网,从而造成法律纠纷,针对看本文搭建成功而造成法律纠纷的与作者无关,请尊重版权观看正版。
先说说配置吧
Ubuntu:22.04
硬件:1核1G
带宽:1GBS
硬盘:64G 高速SSD
想必聪明的朋友已经看出来是哪家服务器了,我不多说,这方面的知识本文不会加以赘述
新机到手,先弄好搭建环境
因为maccms是采用PHP+MYSQL的,所以先要确定版本,测试下来踩了那么多坑,最终无坑完美解决的还是如下版本
mysql 5.7.41 + php 7.2-fpm
注意嗷注意,PHP版本真的是个大雷,博主是没有什么PHP开发经验的,如果你跟我一样是个小白的话,最好听劝,不要换版本,因为maccms基本上都是二开,能找到的免费模板源码,全是采用低版本的PHP做的。有两个分水岭,一个是7.2≤,这个版本没啥问题,而且支持的模板很多;另一个是8.0>7.x>7.2,7.2之后有很多参数和命令写法都不一样了,你可能需要改模板的源码改个爽,你愿意折腾也没事,可以用。8.0以上纯纯大雷了,版本太高,要改的地方太多了,所以最后试下来还是PHP7.2最顺手。
本文的搭建方式是基于docker部署的
相信我,配置低的机器,docker部署永远是最好的玩法,只有在部署的过程中吃CPU,后面运行起来基本只吃内存。另外利用docker搭建本文的写法不能说是最好的,但绝对能算得上是最实用,最简洁方便,也是最安全的。
好了,闲话不多说了,现在开始搭建
搭建基础环境
#安装iptables,下载软件包
apt-get install iptables-persistent
#查看iptables状态
systemctl status iptables
#关闭服务
systemctl stop iptables
#重启iptables
systemctl start iptables
#开启自启动iptables
systemctl enable iptables
#查看网卡信息,查看内网网段
ip addr
#启动 Docker 并设置开机自启(因为docker会影响防火墙,所以要先开防火墙)
systemctl start docker
systemctl enable docker
#设置docker只在本机内网上运行,此时网段需和前面ip addr查看到的做区分,例如查看到内网地址是172.17.0.0/24,那我们就用172.18.0.0/24
docker network create --driver bridge --subnet 172.18.0.0/24 --gateway 172.18.0.1 mynetwork
设置docker只在本机ip上运行(docker-ce下载请自行下载,本文不做教学)
docker network create --driver bridge --subnet 172.18.0.0/24 --gateway 172.18.0.1 mynetwork
安装MYSQL
#创建并进入即将要pull镜像的目录
mkdir -p /application/mysql && cd /application/mysql
# 运行空的MySQL容器
docker run --name mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7.41
# 将容器内的文件拷贝出来,防止运行容器后文件被覆盖的问题,同时也更方便管理与备份
docker cp mysql:/etc/mysql /application/mysql
mv mysql conf
docker cp mysql:/var/lib/mysql /application/mysql
mv mysql data
# 删除后重新启动一个容器(重新启动时ROOT_PASSWORD请自行修改)
docker rm -f mysql
docker run --name mysql \
-e TZ=Asia/Shanghai \
--network=mynetwork \
--ip 172.18.0.2\
--restart always \
-v /application/mysql/data:/var/lib/mysql \
-v /application/mysql/logs:/var/log/mysql \
-v /application/mysql/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql:5.7.41
MySQL这样就算完成了
开始nginx的配置
#返回到上级目录
cd ../
#创建nginx的目录并进入
mkdir -p /application/nginx && cd /application/nginx
#运行空的Nginx容器(这里用的是大佬的镜像,内置了certbot证书申请,不用自己费心费神的去做SSL)
docker run -d --name nginx anqiqii/nginx-certbot
# 将容器内的文件拷贝出来,防止运行容器后文件被覆盖的问题,同时也更方便管理与备份
docker cp nginx:/etc/nginx /application/nginx
mv nginx conf
docker cp nginx:/usr/share/nginx /application/nginx
mv nginx webs
# 删除后重新启动一个容器
docker rm -f nginx
docker run --name nginx \
-e TZ=Asia/Shanghai \
--network=mynetwork \
--ip 172.18.0.15\
-p 80:80 \
-p 443:443 \
--restart always \
-v /application/nginx/conf/:/etc/nginx \
-v /application/nginx/webs/:/usr/share/nginx \
-v /application/nginx/logs/:/var/log/nginx \
-d anqiqii/nginx-certbot
Nginx的也弄完了
处理最坑的PHP
#返回到上级目录
cd ../
#创建PHP的目录并进入nginx
mkdir -p /application/php && cd /application/php
#运行空的PHP容器
docker run -d --name php php:7.2-fpm
# 将容器内的文件拷贝出来,防止运行容器后文件被覆盖的问题,同时也更方便管理与备份
docker cp php:/usr/local/etc/php /application/php
mv /application/php/php/ /application/php/conf
# 删除后重新启动一个容器
docker rm -f php
docker run --name php \
-e TZ=Asia/Shanghai \
--network=mynetwork \
--ip 172.18.0.3\
--restart always \
-v /application/nginx/webs:/var/www/html \
-v /application/php/conf:/usr/local/etc/php \
-d php:7.2-fpm
好,装是装完了,下面是麻烦点了
# 进入容器
docker exec -it php /bin/bash
# 首次进入容器,先更新一下源,防止接下来下载时找不到依赖
apt update
# 首先安装zip扩展,先将ZIP需要的依赖库安装一下
apt install -y --no-install-recommends zlib1g-dev && apt-get install -y --no-install-recommends libzip-dev
# 安装zip扩展,这个扩展不安装无法安装程序
docker-php-ext-install zip
# 接下来安装GD扩展,先将GD需要的依赖库安装一下
apt install -y libwebp-dev libjpeg-dev libpng-dev libfreetype6-dev
# PHP镜像的制作者已经将扩展都继承到镜像中了,这里执行命令解压扩展包
docker-php-source extract
# 移动到GD源码目录
cd /usr/src/php/ext/gd
# 编译GD源码
docker-php-ext-configure gd --with-webp-dir=/usr/include/webp --with-jpeg-dir=/usr/include --with-png-dir=/usr/include --with-freetype-dir=/usr/include/freetype2
# 安装GD扩展,这个扩展不安装图形验证码无法加载
docker-php-ext-install gd
# 最后安装pdo_mysql扩展,这个扩展直接安装即可,不安装该扩展将无法访问数据库
docker-php-ext-install pdo_mysql
#如果出问题了,提示/usr/local/bin/docker-php-ext-enable: cannot create /usr/local/etc/php/conf.d/docker-php-ext-pdo_mysql.ini: Directory nonexistent
#我们直接在/usr/local/etc/php目录下面新建 conf.d(不要退出bash)然后从zip扩展重新开始安装
cd /usr/local/etc/php
mkdir conf.d
touch 'extension=pdo_mysql.so' > conf.d
# 退出容器,并重启PHP容器
exit
docker restart php
docker ps查看运行状态,可以很精准的看到,我们只有Nginx的端口是映射到公网的,就只有80和443,其他的端口都只是在内网端口上运行,减少了被挂马的几率。
基础环境这样就算搭建完成了,接下来开始maccms的配置
开搞MACCMS
把Maccms程序文件上传到服务器的/application/nginx/webs目录
文件上传完成后解压文件,并做一些处理
# 作者提供的压缩文件为.zip格式,如果你的服务器没有安装对应的依赖需要安装一下
apt install -y unzip
#移动到目标目录(/application/nginx/webs),并解压文件到该目录
cd /application/nginx/webs
unzip maccms10.zip
# PHP需要放开文件权限,这里权限直接给到777
chmod -R 777 maccms
配置Nginx
# 移动到Nginx配置文件目录下
cd /application/nginx/conf/conf.d
#每个项目都单独写个配置文件,这里创建maccms.conf
vim maccms.conf
#把Nginx自带的配置文件先关闭
mv default.conf default.conf.bak
配置文件内容(这里先写个最简单的,能正常访问到就好)
server {
listen 80;
server_name IP or HOST;
root /usr/share/nginx/maccms;#网站根目录
index index.html index.htm index.php;
location ~ .php$ {
fastcgi_pass 172.18.0.3:9000;#PHP运行地址和端口
fastcgi_index index.php;
fastcgi_split_path_info ^(.+.php)(/.+)$;
fastcgi_param SCRIPT_FILENAME /var/www/html/maccms/$fastcgi_script_name;
include fastcgi_params;
}
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;
}
}
}
#保存配置并退出
wq!
#查看此配置文件nginx是否能够正确运行
docker exec -it nginx nginx -t
#重新加载conf文件
docker exec -it nginx nginx -s reload
ok打开我们的IP地址或者HOST地址,就会自动跳转到安装界面了,跟着向导安装就行了,这里不再教学,都挺简单的
MACCMS安装完成后处理
安装好后会提示我们,由于安全原因管理页面会拒绝访问,要修改admin.php的名字,那我们改改就行
# 移动到Maccms程序目录
cd /application/nginx/webs/maccms
# 给admin.php重命名为xxx.php(xxx为任意,这里用test做演示)
mv admin.php test.php
# 编辑Nginx配置文件,将配置文件中的admin.php修改为刚刚设置的test.php
# 一共有两处需要修改,两处都在同一行
vim /opt/docker/nginx/conf/conf.d/maccms.conf
#修改admin --> test
#保存并退出
wq!
#重新加载conf文件
docker exec -it nginx nginx -s reload
再次打开IP或者HOST,后面加上/test.php
成功进入。
模板晚点再写