# Debian 部署 Discuz! 论坛:Nginx、PHP 与 MariaDB 配置
1. 服务介绍
Discuz! 是基于 PHP 和数据库的论坛系统,适合搭建技术交流社区、用户问答区和内容讨论平台。一次完整部署通常包含 Web 服务器、PHP 运行环境、MariaDB 数据库、站点文件和目录权限五个部分。本文以 Debian 10 实验环境为基础,完成 Discuz! 文件部署、数据库准备、Web 站点配置、安装向导和后台验证。
2. 准备运行环境
• 操作系统:Debian 10 实验环境;PHP、Web 服务器和 Discuz! 程序包版本保持兼容。
• 操作账号:root,或具备 sudo 权限的管理员账号。
• Web 服务:本实验以 Nginx + PHP-FPM 为例;若原环境使用 Apache,只保留一种 Web 服务并按对应配置验证。
• 数据库:MariaDB 服务正常运行,准备独立的 Discuz! 数据库和应用账号,不直接使用数据库 root 账号连接论坛。
• PHP 扩展:准备 PHP-FPM、MySQL 驱动、XML、GD、CURL、ZIP、MBstring 等 Discuz! 运行所需扩展;具体扩展以程序包安装检查结果为准。
• 域名解析:将 www.rj.com 解析到 Web 服务器地址;实验中也可以使用 hosts 临时解析。
• 网络要求:客户端能访问 Web 服务器,防火墙允许 HTTP/HTTPS;服务器可访问 apt 软件源和程序包文件。
• 文件准备:准备来源可信、版本匹配的 Discuz! 程序包;保存压缩包校验值和原始配置备份。
3. 相关知识
• Discuz! 请求链路通常是"浏览器 → Nginx/Apache → PHP-FPM → MariaDB";出现 502、空白页或数据库错误时按链路分层排查。
• Web 根目录、PHP-FPM 运行用户和站点文件权限必须匹配;安装期间需要写入的目录,安装完成后应收紧权限,避免长期使用 777。
• PHP 扩展缺失会导致安装向导报错或部分功能不可用;用 php -m 和 PHP-FPM 日志确认实际加载的扩展。
• 数据库应使用独立库和最小权限账号;数据库字符集建议使用 utf8mb4,避免中文和表情符号存储异常。
• 站点域名、论坛访问 URL、反向代理头和 HTTPS 配置要一致,否则可能出现登录跳转、Cookie 域名或后台地址异常。
• 部署前备份程序包、数据库和配置文件;升级前先在副本环境验证,不直接覆盖线上站点。
4. 实验步骤
4.1 安装 Web、PHP 和 MariaDB 组件
先确认 Debian 版本和软件源,再安装基础组件。不同 Debian 仓库的 PHP 版本可能不同,先用 apt-cache policy 确认可用版本,不要强行混装多个 PHP 大版本。
bash
cat /etc/os-release
apt update
apt-cache policy nginx php-fpm mariadb-server
apt install -y nginx mariadb-server mariadb-client php-fpm php-mysql php-xml php-gd php-curl php-zip php-mbstring unzip
php -v
php -m | grep -E 'mysqli|pdo_mysql|xml|gd|curl|zip|mbstring'
启用并检查服务:
bash
systemctl enable --now nginx mariadb
systemctl status nginx mariadb --no-pager
systemctl list-units --type=service | grep -E 'php.*fpm'
4.2 创建 Discuz! 数据库和应用账号
先执行 MariaDB 安全初始化,再使用独立账号连接论坛。下面口令是占位符,真实口令只在交互式终端或安全变量中输入,不写入文章和配置截图:
bash
mariadb-secure-installation
mariadb -u root -p
在 MariaDB 客户端中执行:
sql
CREATE DATABASE discuz CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'discuz_app'@'localhost' IDENTIFIED BY 'DB_APP_PASSWORD';
GRANT ALL PRIVILEGES ON discuz.* TO 'discuz_app'@'localhost';
FLUSH PRIVILEGES;
SHOW DATABASES;
EXIT;
验证应用账号只能访问目标数据库:
bash
mariadb -u discuz_app -p -e 'SHOW DATABASES;'
4.3 部署 Discuz! 程序文件
-
将经过校验的 Discuz! 程序包上传到服务器临时目录。
-
创建站点目录,例如
/var/www/discuz。 -
解压程序包;如果实验包包含
update目录,按程序包说明将update中的站点文件放入 Web 根目录,不要把压缩包目录层级错误地套在站点根目录下。 -
检查入口文件、安装目录和程序版本。
示例命令:
bash
install -d -o www-data -g www-data /var/www/discuz
unzip -q /tmp/discuz-package.zip -d /tmp/discuz-unpack
find /tmp/discuz-unpack -maxdepth 2 -type f -name 'index.php' -o -name 'install.php'
cp -a /tmp/discuz-unpack/. /var/www/discuz/
find /var/www/discuz -maxdepth 2 -type f | head -n 30
安装阶段只给程序要求写入的目录临时写权限;安装完成后恢复合理的目录和文件权限:
bash
chown -R www-data:www-data /var/www/discuz
find /var/www/discuz -type d -exec chmod 755 {} \;
find /var/www/discuz -type f -exec chmod 644 {} \;
4.4 配置 Nginx 和 PHP-FPM
确认 PHP-FPM socket:
bash
find /run/php -maxdepth 1 -type s -name 'php*-fpm.sock'
创建站点配置 /etc/nginx/sites-available/discuz,将 php8.2-fpm.sock 替换为实际 socket:
nginx
server {
listen 80;
server_name www.rj.com rj.com;
root /var/www/discuz;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
}
location ~ /\.ht {
deny all;
}
}
启用站点、检查配置并重载:
bash
ln -s /etc/nginx/sites-available/discuz /etc/nginx/sites-enabled/discuz
nginx -t
systemctl reload nginx
如果实验环境选择 Apache,则使用 Apache 虚拟主机和 PHP 模块完成同等配置,不要同时让 Nginx 和 Apache 占用 80 端口。
4.5 执行 Discuz! 安装向导
-
客户端解析
www.rj.com到 Web 服务器。 -
浏览器访问
http://www.rj.com/discuz/;如果程序部署在站点根目录,则访问http://www.rj.com/。 -
在安装向导中填写数据库地址、数据库名
discuz、数据库用户discuz_app和对应口令。 -
设置论坛管理员账号;管理员口令不要写入 Markdown、截图或 Git 仓库。
-
安装完成后访问论坛首页和后台,查看站点系统信息、PHP 版本、数据库连接和程序版本。


5. 验证结果
5.1 Web 和 PHP-FPM 验证
bash
nginx -t
systemctl status nginx --no-pager
systemctl list-units --type=service | grep -E 'php.*fpm'
ss -lntp | grep -E ':(80|443)\b'
curl -I http://127.0.0.1/
curl -I -H 'Host: www.rj.com' http://127.0.0.1/
检查 HTTP 状态码、Server 响应、PHP-FPM 状态和 Nginx 错误日志:
bash
journalctl -u nginx -u php*-fpm --since '-10 min' --no-pager
tail -n 50 /var/log/nginx/error.log
5.2 MariaDB 验证
bash
systemctl status mariadb --no-pager
mariadb -u discuz_app -p -e 'USE discuz; SHOW TABLES;'
mariadb -u root -p -e "SELECT User,Host FROM mysql.user WHERE User='discuz_app';"
安装完成后,discuz 数据库应出现程序表;如果表为空,检查安装向导数据库参数和 PHP MySQL 扩展。
5.3 Discuz! 页面和后台验证
在客户端验证:
-
论坛首页能够打开,HTTP 状态正常。
-
注册、登录、退出流程正常;管理员能够进入后台。
-
创建测试版块和测试主题,确认页面写入数据库。
-
上传测试图片,确认上传目录权限和 PHP 上传限制满足要求。
-
刷新页面、重新登录,确认 Cookie、域名和数据库数据保持正常。
5.4 故障定位命令
bash
curl -I http://www.rj.com/discuz/
ls -ld /var/www/discuz
find /var/www/discuz -maxdepth 2 -type d -printf '%M %u:%g %p\\n' | head -n 30
journalctl -u mariadb -n 50 --no-pager
journalctl -u nginx -n 50 --no-pager
6. 注意事项
• 文章只使用数据库口令和管理员口令占位符,不保存真实凭据。
• PHP-FPM socket 版本必须与实际安装版本一致;Nginx 配置中写错 socket 会导致 502。
• Nginx 和 Apache 不要同时监听同一端口;切换 Web 服务前先查看 ss -lntp。
• 程序目录不建议长期使用 777;安装完成后恢复目录 755、文件 644,并按程序实际需求开放少数写入目录。
• Discuz! 安装目录、配置文件、上传目录和后台入口属于重点保护对象;安装完成后按官方说明处理安装目录和访问控制。
• 备份至少包含数据库、站点文件、Nginx/PHP-FPM 配置和域名解析记录;恢复时先在隔离环境验证。