系统环境:CentOS 8 Stream
远程SSH工具:FinalShell 4.9.4
PHP版本:7.2-fpm
Discuz版本:Discuz_X3.4_SC_UTF8_20220518
1 Docker 安装
安装 yum 工具:
yum install -y -q yum-utils
添加 docker-ce 软件源:
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
更新 yum :
yum update
安装 docker:
yum install -y docker-ce
# yum install docker 默认安装 podman-docker,所以要用docker-ce
虚拟机可能自带了 podman,如果再安装 docker-ce 会报错:
Problem: package podman-2:4.0.2-1.module_el8.7.0+1106+45480ee0.x86_64 requires runc >= 1.0.0-57, but none of the providers can be installed ....
podman 与 docker 功能类似,将 docker 命令中的 docker 替换为 podman 即可正常使用,若不习惯,可以卸载 podman 和 buildah:
yum rm podman buildah
再安装docker:
yum install -y docker-ce # yum install docker 默认安装 podman-docker,所以要用docker-ce
启动 docker 服务:
systemctl start docker
2 MariaDB 安装
拉取镜像:
docker pull mariadb:latest # 此步也可不执行,直接run也会自动拉取镜像
运行容器:(命令参数顺序不对可能导致容器启动就退出)
docker run --name mymariadb -e MYSQL_ROOT_PASSWORD=你的密码 -itd mariadb
参数解释
--name mariadb
: 容器名称为 mariadb
-e MYSQL_ROOT_PASSWORD=你的密码
:设置环境变量 MYSQL_ROOT_PASSWORD
为密码
-itd
:-i
, -t
, -d
的组合,分别为以交互模式运行容器、为容器重新分配一个伪输入终端、后台运行容器,并返回容器ID
3 PHP 安装
拉取镜像:
docker pull php:7.2-fpm # 此步也可不执行,直接run也会自动拉取镜像
运行容器:(注意 link 和 name 前均为两个横杠)
docker run --name myphp -v ~/nginx/www:/www --link mymariadb:db -itd php:7.2-fpm
参数解释
--name myphp-test
: 容器名称为 myphp
-v ~/nginx/www:/www
:将主机的目录 ~/nginx/www
映射到容器的 /www
,/www
存放 php 服务器文件,文件夹会自动创建
--link mariadb:db
:连接名为 mariadb
的容器,并为其设置了别名 db
,这里别名 db 就可以代表 mymariadb 容器的 ip 地址。
--link 使容器之间可以通过容器名互相通信,而不再使用易发生变化的 ip 地址。
4 Nginx 安装
拉取镜像:
docker pull nginx # 此步也可不执行,直接run也会自动拉取镜像
运行容器:
docker run --name nginx -p 80:80 \
-v ~/nginx/www:/usr/share/nginx/html:ro \
-v ~/nginx/conf/conf.d:/etc/nginx/conf.d:ro \
--link myphp:php \
-itd nginx
参数解释
-p 80:80
: 容器内 80 端口映射主机 80 端口
-v ~/nginx/www:/usr/share/nginx/html:ro
:将主机的目录 ~/nginx/www
映射到容器的 /usr/share/nginx/html
-v ~/nginx/conf/conf.d:/etc/nginx/conf.d:ro
:将主机的目录 ~/nginx/conf/conf.d
映射到容器的 /etc/nginx/conf.d
--link myphp:php
:连接名为 myphp
的容器,并为其设置了别名 php
在自己的电脑上新建一个 php.conf,内容如下:
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html index.htm index.php;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
location ~ \.php$ {
fastcgi_pass php:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /www/$fastcgi_script_name;
include fastcgi_params;
}
}
参数解释
fastcgi_pass php:9000;
:php
与之前启动 Nginx 容器时的参数 --link myphp:php
中设置的别名 php
保持一致,即 php
代表 myphp 容器的 ip 地址。9000
为 myphp 容器中 php 服务器默认的端口号。
fastcgi_pass:Nginx本身不能处理PHP,它只是个 web 服务器,当接收到请求后,如果是 php 请求,则发给php解释器处理,并把结果返回给客户端。nginx 一般是把请求发 fastcgi 管理进程处理, fascgi 管理进程选择 cgi 子进程处理结果并返回给 Nginx。
将自己电脑上的 php.conf 利用 FinalShell 上传至服务器的 ~/nginx/conf/conf.d/
位置。
5 Discuz 安装
5.1 安装文件部署
从官网下载 Discuz 安装包,这里使用的是 Discuz_X3.4_SC_UTF8_20220518.zip,附件所在帖子链接为:https://www.dismall.com/thread-73-1-1.html。
打开路径 `~/nginx/www
cd ~/nginx/www
利用 FinalShell 将安装包上传至 ~/nginx/www
。
解压安装包:
unzip Discuz_X3.4_SC_UTF8_20220518.zip
将其 upload 文件夹的内容个复制到 ~/nginx/www
:
mv ./Discuz_X3.4_SC_UTF8_20220518/upload/* ./
删除剩余文件:
rm -rf ./Discuz_X3.4_SC_UTF8_20220518
删除安装包:
rm -f ./Discuz_X3.4_SC_UTF8_20220518.zip
给 ~/nginx/www/
赋最高权限:
chmod 777 -r ~/nginx/www/ # 无这一步,Discuz安装会报一堆权限问题
重启所有容器:
docker restart mymariadb nginx myphp
5.2 安装
使用浏览器访问服务器的 ip 地址,即 Discuz 网站,进入 Discuz 安装阶段,同意授权协议后,显示安装环境检查界面:
如果之前步骤进行正确,除如下 mysql_connect() 函数依赖问题外,其他项目均正常。
下边解决 mysql_connect() 函数依赖问题,进入启动的 myphp 容器:
docker exec -it myphp bash
进入目录 bin:
cd /usr/local/bin
安装扩展 pdo_mysql:
./docker-php-ext-install pdo_mysql
安装扩展 mysqli:
./docker-php-ext-install mysqli
退出 myphp 容器:
exit
重启所有容器:
docker restart mymariadb nginx myphp
重新访问 Discuz 网站,显示函数依赖已正常:
进入下一步,运行环境设置,笔者不太清楚两选项区别,选择了含 UCenter Server 安装,有备无患。
进入下一步,安装数据库:
参数解释
数据库服务器地址: db
,即第 3 节 PHP 安装中连接 mymariadb 容器设置的别名 db
数据库用户名:root,即默认
数据库密码:第 2 节MariaDB 安装中设置的 MYSQL_ROOT_PASSWORD 环境变量值
数据库名、数据表前缀:无特殊需要保持默认即可
其他信息根据自身情况填写即可。点击下一步之后自动安装,片刻即好,之后可进入 Discuz 网站,使用安装过程填写的管理员信息登录(初次可设置验证问题提高账户安全性)。
5.3 GD图像处理软件安装
此时网站还存在一个问题,在 Discuz 后台的全局->上传设置,点击“预览略缩图效果”,会显示如下错误:
从下图位置进入管理中心,使用管理员账号登录后台:
首页会显示如下警告:
下边安装 GD ,进入 myphp 容器:
docker exec -it myphp bash
需要将 apt-get 软件安装源替换,才能找到后边要用的安装包。
软件源替换方法如下:
备份原来的源文件:
cp /etc/apt/sources.list /etc/apt/sources.list.bak
在容器内查看系统版本:
cat /etc/os-release
显示如下信息,说明容器内的环境为 Debian buster 10。
打开清华大学镜像网站
https://mirrors.tuna.tsinghua.edu.cn/help/debian/
,找到对应版本的国内源:复制网页下方代码,Debian buster如下:
# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释 deb https://mirrors.tuna.tsinghua.edu.cn/debian/ buster main contrib non-free # deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ buster main contrib non-free deb https://mirrors.tuna.tsinghua.edu.cn/debian/ buster-updates main contrib non-free # deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ buster-updates main contrib non-free deb https://mirrors.tuna.tsinghua.edu.cn/debian/ buster-backports main contrib non-free # deb-src https://mirrors.tuna.tsinghua.edu.cn/debian/ buster-backports main contrib non-free deb https://mirrors.tuna.tsinghua.edu.cn/debian-security buster/updates main contrib non-free # deb-src https://mirrors.tuna.tsinghua.edu.cn/debian-security buster/updates main contrib non-free
在自己的电脑上新建
source.list
文件,粘贴清华源到文件里,借助 FinalShell 先将文件上传至~/nginx/www
(为了可以从容器中的/www
访问),然后移动到软件源所在位置:mv /www/sources.list /etc/apt/sources.list
更新:
apt-get update
安装依赖库:
apt install -y libwebp-dev libjpeg-dev libpng-dev libfreetype6-dev
解压源码:
docker-php-source extract
进入gd源码文件夹:
cd /usr/src/php/ext/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
编译安装:
docker-php-ext-install gd
检查扩展是否安装成功:
php -m | grep gd
显示 gd 即表示安装成功:
退出容器:
exit
重启所有容器:
docker restart mymariadb nginx myphp
重新登录 Discuz 后台后,运行环境检测显示一切正常:
略缩图预览正常:
5.4 附件上传失败问题
换比较小的文件试试,需要修改 php 最大上传大小,docker 里边不是修改 php.ini,先挖个坑,以后补方法。
5.5 域名 HTTPS SSL 配置
~/nginx/conf/conf.d
配置修改:
server {
listen 443 ssl;
server_name abc.top; # 你的域名
root /usr/share/nginx/html;
ssl_certificate /etc/nginx/conf.d/ssl/domain.cert.pem; # 证书路径
ssl_certificate_key /etc/nginx/conf.d/ssl/private.key.pem; # 秘钥路径
index index.html index.htm index.php;
location ~ \.php$ {
fastcgi_pass php:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /www/$fastcgi_script_name;
include fastcgi_params;
}
location / {
# index index.html index.htm index.php;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
server {
listen 80;
server_name abc.top; # 你的域名
rewrite ^(.*)$ https://$host$1 permanent;
}
后台配置修改:
-
在后台 – 全局 – 网站 URL 填写
https://你的网址
-
在后台 站长 – UCenter 设置 – UCenter 访问地址填写
https://你的网址/uc_server -
在后台 – UCenter – 应用管理 – 点右边的编辑 – 应用的主 URL 填写
https://你的网址
检查网址是否能正常访问,不能再进行下一步修改,否则不需要:
修改3个源文件(修改前请记得做好文件备份):
-
source/class/discuz/discuz_application.php (大概在第 190 行处)
查找:
\$_G['isHTTPS'] =
这一行直接修改为: `$_G['isHTTPS'] = true;`
-
uc_server/avatar.php(约第13行处)
查找:
define('UC_API', strtolower(($_SERVER['HTTPS'] == 'on' ? 'https' : 'http').'://'.$_SERVER['HTTP_HOST'].substr($_SERVER['PHP_SELF'], 0, strrpos($_SERVER['PHP_SELF'], '/'))));
修改为:
define('UC_API', strtolower(($_SERVER['SERVER_PORT'] == 443 || $_SERVER['HTTPS'] == 'on' ? 'https' : 'http').'://'.$_SERVER['HTTP_HOST'].substr($_SERVER['PHP_SELF'], 0, strrpos($_SERVER['PHP_SELF'], '/'))));
-
template/default/common/header.htm
查找:
http://
全部替换为:https://