一、官方环境要求确认
根据 Discuz! X5.0 正式版官方说明:
PHP 版本:≥8.0,推荐 8.1-8.5(本方案使用 8.3 稳定版)
MySQL 版本:≥5.7,推荐 8.0(本方案使用 8.0 LTS)
必需 PHP 扩展:mysqli、pdo_mysql、gd、curl、mbstring、zip、xml、json、opcache、redis
数据库字符集:必须使用 utf8mb4(支持 emoji 和所有中文)
二、更新后的目录结构
/opt/discuz-x5/
├── docker-compose.yml # 核心编排文件
├── Dockerfile-php # 定制PHP镜像(含所有必需扩展)
├── nginx/
│ └── conf/
│ └── default.conf # Discuz!专用Nginx配置
├── php/
│ └── conf/
│ └── php.ini # PHP优化配置
├── mysql/
│ ├── data/ # MySQL数据持久化
│ └── conf/
│ └── my.cnf # MySQL优化配置
└── www/ # Discuz!源码目录
创建命令:
运行
mkdir -p /opt/discuz-x5 && cd /opt/discuz-x5
mkdir -p nginx/conf php/conf mysql/data mysql/conf www
三、更新后的配置文件
1. docker-compose.yml(核心文件)
services:
# Nginx 1.25(稳定版,支持HTTP/3)
nginx:
image: nginx:1.25-alpine
container_name: discuz-nginx
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx/conf:/etc/nginx/conf.d
- ./nginx/logs:/var/log/nginx
- ./www:/var/www/html
depends_on:
- php
networks:
- discuz-net
restart: always
environment:
TZ: Asia/Shanghai
# PHP 8.3-fpm
php:
# 直接使用官方预构建的 PHP 8.3 镜像(已包含大部分扩展)
image: php:8.3-fpm-alpine
container_name: discuz-php
volumes:
- ./www:/var/www/html
- ./php/conf:/usr/local/etc/php/conf.d
networks:
- discuz-net
restart: always
environment:
TZ: Asia/Shanghai
# MySQL 8.0(优化配置,utf8mb4默认字符集)
mysql:
image: mysql:8.0
container_name: discuz-mysql
ports:
- "3306:3306" # 如需本地工具连接可保留,生产环境建议注释
volumes:
- ./mysql/data:/var/lib/mysql
- ./mysql/conf:/etc/mysql/conf.d
environment:
MYSQL_ROOT_PASSWORD: DiscuzRoot2026! # 请务必修改!
MYSQL_DATABASE: discuz_db # 自动创建Discuz数据库
MYSQL_USER: discuz_user # 自动创建专用数据库用户
MYSQL_PASSWORD: DiscuzUser2026! # 请务必修改!
TZ: Asia/Shanghai
command: --default-authentication-plugin=mysql_native_password # 兼容旧版PHP连接
networks:
- discuz-net
restart: always
# 自定义隔离网络
networks:
discuz-net:
driver: bridge
2. Dockerfile-php(定制 PHP 镜像)
包含 Discuz! X5 所有必需扩展,无需后续手动安装:
dockerfile
FROM php:8.3-fpm-alpine
# 设置时区
RUN apk add --no-cache tzdata
ENV TZ=Asia/Shanghai
# 安装系统依赖和PHP扩展
RUN apk add --no-cache \
autoconf \
g++ \
make \
libpng-dev \
libjpeg-turbo-dev \
freetype-dev \
libzip-dev \
curl-dev \
libxml2-dev \
oniguruma-dev \
&& docker-php-ext-configure gd --with-freetype --with-jpeg \
&& docker-php-ext-install -j$(nproc) \
mysqli \
pdo_mysql \
gd \
curl \
mbstring \
zip \
xml \
json \
opcache \
&& pecl install redis \
&& docker-php-ext-enable redis \
&& apk del autoconf g++ make \
&& rm -rf /tmp/pear /var/cache/apk/*
# 创建www-data用户(与Nginx用户一致)
RUN addgroup -g 82 -S www-data \
&& adduser -u 82 -D -S -G www-data www-data
# 设置工作目录
WORKDIR /var/www/html3. nginx/conf/default.conf(Discuz! 专用配置)
内置完整伪静态规则和上传优化:
nginx
server {
listen 80;
server_name localhost; # 安装完成后改为你的域名
root /var/www/html;
index index.php index.html index.htm;
# 日志
access_log /var/log/nginx/discuz.access.log;
error_log /var/log/nginx/discuz.error.log;
# 最大上传大小(与PHP配置一致)
client_max_body_size 100M;
# 静态资源缓存
location ~* \.(gif|jpg|jpeg|png|bmp|swf|ico)$ {
expires 30d;
access_log off;
}
location ~* \.(js|css)$ {
expires 12h;
access_log off;
}
# Discuz! 完整伪静态规则
location / {
if (!-e $request_filename) {
rewrite ^(.*)$ /index.php?$1 last;
}
}
# PHP解析配置
location ~ \.php$ {
fastcgi_pass php:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
# 超时设置
fastcgi_connect_timeout 60s;
fastcgi_send_timeout 60s;
fastcgi_read_timeout 60s;
}
# 安全配置:禁止访问敏感文件
location ~ /\. {
deny all;
}
location ~* \.(sql|tar|gz|zip|rar|7z|bak)$ {
deny all;
}
# 安装完成后请注释以下location块,禁止访问install目录
# location ~ /install/ {
# allow all;
# }
}
4. php/conf/php.ini(PHP 优化配置)
; 基础配置
date.timezone = Asia/Shanghai
memory_limit = 256M
max_execution_time = 60
max_input_time = 60
; 上传配置(与Nginx一致)
upload_max_filesize = 100M
post_max_size = 100M
max_file_uploads = 20
; 错误配置(生产环境改为Off)
display_errors = On
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
; Opcache优化(大幅提升Discuz!性能)
opcache.enable = 1
opcache.enable_cli = 1
opcache.memory_consumption = 128
opcache.interned_strings_buffer = 8
opcache.max_accelerated_files = 10000
opcache.revalidate_freq = 60
opcache.save_comments = 1
opcache.fast_shutdown = 1
; 安全配置
expose_php = Off
allow_url_fopen = On
allow_url_include = Off
5. mysql/conf/my.cnf(MySQL 优化配置)
[mysqld]
# 字符集配置(必须,支持emoji)
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect = 'SET NAMES utf8mb4'
# 性能优化
max_allowed_packet = 64M # 支持大附件上传
innodb_buffer_pool_size = 256M # 建议设为服务器内存的50%-70%
innodb_log_file_size = 64M
innodb_flush_log_at_trx_commit = 2
#query_cache_type = 0 # MySQL8.0不可用
#query_cache_size = 0 # MySQL8.0不可用
# 兼容配置
# default-authentication-plugin = mysql_native_password # MySQL8.0不可用
sql_mode = NO_ENGINE_SUBSTITUTION
[client]
default-character-set = utf8mb4
四、启动服务并安装 Discuz! X5
1. 构建并启动所有服务
运行
cd /opt/discuz-x5
sudo docker compose up -d --build
首次启动会自动构建 PHP 镜像并拉取其他镜像,耐心等待 1-2 分钟。
2. 下载 Discuz! X5 源码
运行
# 下载最新版Discuz! X5(官方Gitee仓库)
git clone https://gitee.com/Discuz/DiscuzX.git
cp -r DiscuzX/upload/* www/
rm -rf DiscuzX
3. 设置正确的目录权限
这是 Discuz! 安装成功的关键步骤:
运行
# 设置文件属主为www-data(PHP运行用户)
chown -R 82:82 www/
# 设置必需目录的可写权限
chmod -R 755 www/
chmod -R 777 www/config/
chmod -R 777 www/data/
# chmod -R 777 www/uc_client/data/ #Discuz!X5没有该目录
# chmod -R 777 www/uc_server/data/ #Discuz!X5没有该目录
4. 开始安装 Discuz! X5
浏览器访问:
http://你的服务器IP/install按照安装向导操作,数据库信息填写:
数据库服务器:
mysql(容器名,无需填 IP)数据库名:
discuz_db数据库用户名:
discuz_user数据库密码:
DiscuzUser2026!(你在 docker-compose.yml 中设置的)表前缀:默认
pre_即可
安装完成后,立即执行安全操作:
运行
# 删除安装目录 rm -rf www/install/ # 恢复config目录权限为只读 chmod -R 755 www/config/
详细页面操作过程如下:
1.选择安装的语言

2.产品说明,开始安装

3.同意协议内容

4.检查安装环境

5.设置运行环境

6.创建数据库

7.安装完成

五、Discuz! X5 专属优化
1. 开启 Redis 缓存(大幅提升性能)
在
docker-compose.yml中添加 Redis 服务:yaml
redis: image: redis:7-alpine container_name: discuz-redis volumes: - ./redis/data:/data networks: - discuz-net restart: always environment: TZ: Asia/Shanghai重启服务:
docker-compose up -d进入 Discuz! 后台 → 全局 → 性能优化 → 内存缓存,选择 Redis,服务器地址填
redis:6379
2. 配置 HTTPS
将你的 SSL 证书文件放在
nginx/conf/ssl/目录下修改
nginx/conf/default.conf,添加 HTTPS server 块:nginx
server { listen 443 ssl http2; server_name yourdomain.com; root /var/www/html; index index.php index.html index.htm; ssl_certificate /etc/nginx/conf.d/ssl/yourdomain.crt; ssl_certificate_key /etc/nginx/conf.d/ssl/yourdomain.key; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512; ssl_prefer_server_ciphers on; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; # 其他配置与HTTP块相同 } # HTTP自动跳转HTTPS server { listen 80; server_name yourdomain.com; return 301 https://$server_name$request_uri; }重启 Nginx:
docker compose restart nginx
六、常见问题排查
安装时提示目录不可写:
重新执行权限设置命令,确保
www目录及其子目录的属主是82:82数据库连接失败:
确认数据库服务器地址填的是
mysql(容器名),不是localhost或127.0.0.1确认
docker-compose.yml中的数据库密码与安装时填写的一致
伪静态不生效:
确认 Nginx 配置文件中已添加完整的伪静态规则,并且重启了 Nginx 服务
上传大附件失败:
同时修改
php.ini和nginx.conf中的upload_max_filesize和client_max_body_size参数,保持一致Overlay2 存储驱动与ARM64服务器系统内核 / 架构严重不兼容
修改修改 Docker 配置文件,强制使用 vfs 驱动
# 创建或编辑 daemon.json sudo cat > /etc/docker/daemon.json << 'EOF' { "storage-driver": "vfs", "log-driver": "json-file", "log-opts": { "max-size": "10m", "max-file": "3" }, "registry-mirrors": [ "https://docker.mirrors.ustc.edu.cn", "https://hub-mirror.c.163.com" ] } EOF安装缺失的 PHP 扩展
如果 Discuz! 安装时提示缺少
gd、curl等扩展,我们再手动进入容器安装(用 Alpine 包管理器安装预编译的扩展,不自己编译):(1) 进入 PHP 容器
运行
sudo docker exec -it discuz-php sh(2)使用 Alpine 包管理器安装预编译扩展(更快更稳定)
运行
# 更新包索引 apk update # 安装 Discuz! 必需的扩展(使用预编译包,不编译) apk add --no-cache \ php83-gd \ php83-curl \ php83-mbstring \ php83-zip \ php83-mysqli \ php83-pdo_mysql # 退出容器 exit(3)重启 PHP 容器
运行
sudo docker compose restart php
七、常用维护命令
运行
# 查看服务状态
sudo docker ps
# 查看日志(如PHP错误)
sudo docker compose logs -f php
# 重启所有服务
sudo docker compose restart
# 停止并删除所有服务(保留数据)
sudo docker compose down
# 备份数据库
sudo docker exec discuz-mysql mysqldump -uroot -pDiscuzRoot2026! discuz_db > discuz_backup_$(date +%Y%m%d).sql原文链接
欢迎访问 小易撩挨踢