系统环境: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() 函数依赖问题外,其他项目均正常。

image-20220630125917495

下边解决 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 网站,显示函数依赖已正常:

image-20220630130226812

进入下一步,运行环境设置,笔者不太清楚两选项区别,选择了含 UCenter Server 安装,有备无患。

image-20220630130257792

进入下一步,安装数据库:

image-20220630130842881

参数解释

数据库服务器地址: db ,即第 3 节 PHP 安装中连接 mymariadb 容器设置的别名 db

数据库用户名:root,即默认

数据库密码:第 2 节MariaDB 安装中设置的 MYSQL_ROOT_PASSWORD 环境变量值

数据库名、数据表前缀:无特殊需要保持默认即可

其他信息根据自身情况填写即可。点击下一步之后自动安装,片刻即好,之后可进入 Discuz 网站,使用安装过程填写的管理员信息登录(初次可设置验证问题提高账户安全性)。

5.3 GD图像处理软件安装

此时网站还存在一个问题,在 Discuz 后台的全局->上传设置,点击“预览略缩图效果”,会显示如下错误:

服务器缺少处理图片所需的功能,无法处理

从下图位置进入管理中心,使用管理员账号登录后台:

image-20220630131611138

首页会显示如下警告:

image-20220630131811313

下边安装 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。

image-20220630132536956

打开清华大学镜像网站https://mirrors.tuna.tsinghua.edu.cn/help/debian/,找到对应版本的国内源:

image-20220630132642952

复制网页下方代码,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 即表示安装成功:

image-20220630134151984

退出容器:

exit

重启所有容器:

docker restart mymariadb nginx myphp

重新登录 Discuz 后台后,运行环境检测显示一切正常:

image-20220630134340548

略缩图预览正常:

image-20220630134647408

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://