
以前帮朋友搭过不少论坛从最早的ASP时代一路折腾到PHP环境最后还是觉得“LNMP环境Discuz论坛源程序”这套组合最省心。论坛不是没落了而是变成了一种沉淀内容、维护小圈子交流的稳定方式。今天我把整个搭建流程从头到尾拆开讲清楚包括环境选型、每一步操作的“为什么”、装完后必须处理的坑以及论坛跑起来之后我踩过的优化点。内容偏实战新手盯紧每一步也能把论坛拉起来。1. 搭建前先想清楚LNMP和Discuz到底是什么组合1.1 LNMP不是魔法是四个开源组件的组合LNMP这四个字母指的就是Linux Nginx MySQL或MariaDB PHP。你可以把一套网站环境想象成一个饭店Linux是后厨的地基Nginx是跑堂的迎宾和传菜员MySQL是冷藏库专门存菜谱和账本PHP是掌勺师傅客人点什么菜他就炒什么菜。不用这个组合行不行当然行比如LAMP就是把Nginx换Apache或者用Windows系统配IIS。但对论坛这种以PHP动态页面为主、同时需要处理大量并发连接的小型应用来说LNMP的优势很明显。Nginx处理静态资源时内存占用小、并发能力强扔给PHP-FPM去解释PHP文件配合起来很顺。这套组合在中小型网站上被验证了十多年资料遍地都是。你卡在哪个环节去搜一下基本都是现成答案。这一点对新手太重要了我们不做试验田要的就是能复现的路径。1.2 Discuz凭什么还能扛住一个论坛的所有需求Discuz目前依然是国内用户数量最庞大的开源论坛程序。虽然移动App时代抢走了很多流量但垂直领域、技术社群、企业内部知识库、游戏公会、校园社区这类场景里论坛的讨论结构依然比微信群和QQ群更适合沉淀内容。盖楼结构清晰可以检索发帖分类后期做SEO也比社交平台友好。Discuz的插件和模板生态非常成熟注册、发帖、私信、用户组、权限管理、积分系统基本都内置不需要自己从零写功能。后台的管理员面板功能密集熟悉之后日常管理非常方便。可能有人嫌弃它老但“老”意味着稳定社区里踩过坑的人足够多你遇到的大部分问题都能找到解决方案。1.3 准备工作服务器、域名和手抄本开工前先把三样东西备齐。第一服务器。云服务器也好、本地虚拟机也好配置不用太高。一个同时在线几十人的小论坛2核CPU、4GB内存起步就够用。系统建议选主流的Debian系或CentOS系我下面示例以Debian系为基准命令会跟CentOS系略有不同但思路一样。第二域名。如果你只是内网测试直接用IP访问就行。但要做正式站域名基本免不了。提前把域名的A记录解析到服务器IP等DNS生效再继续。不然安装向导里填域名时你就要反复纠结到底是写IP还是写域名。第三手抄本。把服务器IP、SSH登录用户和密码或者私钥、准备给数据库用的账号密码先记在本子上。后面安装Discus的时候数据库信息和管理员信息要填好几行随手可查比反复开终端翻记录舒服得多。2. LNMP环境从零到可用2.1 系统初始化先把地基夯实登录到服务器之后第一件事不是急着装软件而是把系统更新到当前状态。我是用root登录的如果你用的是带sudo权限的普通用户记得在命令前面加sudo。apt update apt upgrade -y这一步执行完之后顺手装几个后面会用到的工具比如wget、unzip、curl。避免等会儿下载Discuz或者解压文件时发现工具缺失。apt install -y wget unzip curl这里多说一句生产环境服务器不要用公网弱密码SSH尽量改成禁止root密码登录、只允许密钥登录。论坛上线之后暴露在公网上扫描和爆破是家常便饭不要在这件事上偷懒。2.2 安装Nginx让用户先找到门Nginx是入口层负责接收用户请求。安装很简单apt install -y nginx装完之后启动并设为开机自启systemctl enable nginx systemctl start nginx此时在浏览器输入服务器IP应该能看到Nginx的默认欢迎页。如果看不到先确认服务器安全组或防火墙是否放行了80端口。这个坑我不知道遇过多少次本地怎么调都不通最后发现是云控制台的端口没有开。2.3 安装MariaDB把数据仓库立起来数据库我优先用MariaDB因为它是MySQL的开源分支兼容性好安装省事。Discuz这类老程序对MySQL标准接口支持很完善用postgresql反而会出现兼容问题没必要。apt install -y mariadb-server安装完成后执行安全初始化命令mysql_secure_installation这个脚本会引导你设置数据库root密码、移除匿名用户、禁止root远程登录、删除测试库。按提示一路确认就行。其中“是否禁止root远程登录”强烈建议选Yes论坛程序跑在本机根本不需要远程连接数据库。初始化完登录数据库并创建一个专用账号mysql -u root -p在MySQL提示符下执行CREATE DATABASE discuz DEFAULT CHARACTER SET utf8mb4; CREATE USER forum_userlocalhost IDENTIFIED BY 你的强密码; GRANT ALL PRIVILEGES ON discuz.* TO forum_userlocalhost; FLUSH PRIVILEGES; EXIT;提前建库建账号后面Discuz安装向导里就能少一项搬运工作。字符集我用utf8mb4可以在支持中文的同时兼容emoji不要再用老旧的utf8了。2.4 安装PHP-FPM让动态内容跑起来论坛是PHP程序所以PHP-FPM必须装。另外还要带上一堆常用扩展缺哪一个都可能出现诡异问题。我的习惯是直接装全套常用扩展apt install -y php-fpm php-mysql php-gd php-xml php-mbstring php-curl php-zip php-json php-redis这里逐个说一下常用扩展的作用。php-mysql负责和数据库通信php-gd是图片处理库Discuz的验证码、头像缩略图都靠它。php-xml和php-mbstring处理文档和中文编码缺了会出现页面乱码或者XML报错。php-curl让论坛可以抓取外部数据。php-zip用来在后台解压插件和模板。php-redis后面做缓存用得着提前装好。安装完成后编辑PHP配置文件一般路径是/etc/php/版本号/fpm/php.ini。至少调两个参数upload_max_filesize 50M post_max_size 50M memory_limit 256M这是为后面用户上传图片、附件留出空间。默认值太小传个大图就直接报错。2.5 关键一步让Nginx与PHP握手Nginx自己是不懂PHP的它拿到一个以.php结尾的请求时必须转交给PHP-FPM处理。这一步通过Nginx配置文件里的location块实现。我习惯把站点配置单独放在/etc/nginx/sites-available/目录下然后建一个软链到sites-enabled/。配置文件内容大概是这样server { listen 80; server_name forum.example.com; root /var/www/forum; 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/php7.4-fpm.sock; } location ~ /\.(?!well-known).* { deny all; } }注意两点。server_name要换成你自己的域名如果你是拿IP测试这里也可以直接填IP。fastcgi_pass后面的socket路径取决于你安装的PHP版本先看下/run/php/目录下实际文件名写错了会502。检查配置文法并重载nginx -t systemctl reload nginx2.6 用一行PHP验证链路是否打通在网站根目录建一个测试文件mkdir -p /var/www/forum echo ?php phpinfo(); ? /var/www/forum/test.php浏览器访问http://你的域名或IP/test.php如果能看到PHP信息页说明Nginx、PHP-FPM已经联动成功。这一步是整个环境安装的验收节点宁可在这里多花五分钟也不要急急忙忙去装Discuz最后出了问题还要折回来排查环境。确认没问题后删掉这个测试文件rm /var/www/forum/test.php对一定要删。phpinfo页面会暴露服务器详细配置留着等于给扫描器送信息。3. Discuz论坛源程序的安装与初始化3.1 获取Discuz源程序别下错了文件Discuz官方发布的安装包分好几个版本常见的是带SC_UTF8字样的简体中文UTF-8版。下载时尽量去官方发布页或者靠谱的源码镜像站不要随便从不明网站拿包这种开源程序最怕被人塞后门安全第一。下载和解压的命令大概是cd /var/www/forum wget 下载地址/discuz.zip unzip discuz.zip解压出来通常会看到一个upload目录所有Discuz程序文件都在里面。注意别急着直接把整个upload文件夹拷贝到网站根目录我们需要的不是upload这个目录本身而是它里面的文件。3.2 部署文件上传、解压、权限一次搞定把upload目录里的所有文件移到网站根目录cd /var/www/forum/upload cp -r . /var/www/forum/ cd /var/www/forum rm -rf upload然后设置Linux对网站目录的读权限chown -R www-data:www-data /var/www/forum chmod -R 755 /var/www/forum这还没完Discuz在运行时要写入几个特殊目录分别是data、config、uc_server/data。这几个目录在安装阶段必须允许PHP进程写入否则前端页面会提示“无法写入文件”直接卡死。chmod -R 777 /var/www/forum/data chmod -R 777 /var/www/forum/config chmod -R 777 /var/www/forum/uc_server/data看到777别慌。安装完成后我会建议你收紧权限这是后话。现在先保证能装上否则你会在权限问题里绕一晚上。3.3 安装向导四张表填完论坛就地起跑浏览器访问http://你的域名/install/进入Discuz安装向导。整个安装过程我记得要过四个阶段分别是许可协议、环境检测、数据库配置、管理员配置。第一阶段同意许可协议。这没什么好说的看完点下一步。第二阶段环境检测。页面上会列出一堆PHP函数和目录的可写性检查正常环境下应该全是绿色的可写。如果这里有红叉优先处理。常见的问题是php-gd没装、data目录没给777、某个PHP函数被云镜像默认禁用了比如putenv和popen需要去php.ini里解除禁用。第三阶段数据库配置。这里需要填之前创建的数据库名、数据库用户名和密码还有数据表前缀。默认前缀是pre_新手不要乱改保持默认最省心。服务器地址填localhost端口留空或填3306。第四阶段管理员账号配置。设置论坛管理员的用户名、密码和邮箱。这个管理员的权限极高密码一定要复杂不要和你服务器SSH密码重复。填完这些点击安装程序会创建数据库表、生成confing文件大概十几秒就完成了。看到“安装成功”的提示后页面一般会自动跳转到论坛首页。3.4 安装之后立刻要做的三件事第一删除install目录。安装完成后install目录如果不删Discuz会每隔一段时间提示你删除。更重要的是它存在系统就会被别人当作可重新安装的目标利用。rm -rf /var/www/forum/install第二收紧目录权限。论坛能正常跑起来之后之前设的777就显得太开放了。如果后续不需要在后台直接用文件管理器修改模板和插件就把权限收回来chmod -R 755 /var/www/forum chmod -R 666 /var/www/forum/data/update/ (如果确认需要可以保留data可写)我一般是保留data目录和config目录的读写权限毕竟缓存和配置还要用但是我已经禁止PHP执行常见的危险函数所以权限放宽一点也能接受。第三登录后台把后台入口改掉。Discuz默认后台地址是/admin.php这个太公开了放着等扫描器来撞吗在后台全局设置里的“站点URL”旁边找到管理员入口设置给它换一个长字符串路径。4. 论坛跑起来之后常见问题与优化实录4.1 伪静态规则应该直接写在Nginx里Discuz默认的动态URL长这样forum.php?modviewthreadtid1。搜索引擎友好度和阅读体验都一般所以很多论坛都会开伪静态。开之前要在后台的前台“全局-搜索引擎优化”里勾选“全站开启伪静态”然后还要在Nginx配置里补上对应的rewrite规则。如果你少了Nginx那一段伪静态规则后台一开启全站链接直接变成404。以下是Discuz官方常用的Nginx规则我直接写在location /里location / { try_files $uri $uri/ /index.php?$query_string; rewrite ^([^\.]*)/topic-(.)\.html$ $1/forum.php?modtopictopic$2 last; rewrite ^([^\.]*)/article-([0-9])-(.)\.html$ $1/portal.php?modviewaid$2page$3 last; rewrite ^([^\.]*)/forum-(\w)-([0-9])\.html$ $1/forum.php?modforumfid$2page$3 last; rewrite ^([^\.]*)/thread-([0-9])-([0-9])-([0-9])\.html$ $1/forum.php?modviewthreadtid$2extrapage%3D$4page$3 last; rewrite ^([^\.]*)/group-([0-9])-([0-9])\.html$ $1/forum.php?modgroupfid$2page$3 last; rewrite ^([^\.]*)/space-uid-([0-9])\.html$ $1/home.php?modspaceuid$2 last; rewrite ^([^\.]*)/blog-([0-9])\.html$ $1/home.php?modspaceuid$2doblogid$3 last; }改完配置后nginx -t检查并systemctl reload nginx再刷新页面看URL是否变成html形式。4.2 安全加固论坛最容易被打的点论坛是UGC应用攻击面比一般展示型网站大得多安全优先级我这样排第一PHP危险函数禁用。打开php.ini在disable_functions那一行加上exec,shell_exec,popen,proc_open,passthru,system。Discuz正常运行基本不依赖这些函数但很多GETSHELL的攻击载荷会指望它们。加完记得重启PHP-FPM。第二后台登录验证码不能省。在Discuz后台“全局-安全”里开启登录验证码并且启用“异常登录防护”。论坛注册开放的话必须开启注册验证码和发送欢迎邮件时的人工审核配置不然机器人一小时能给你塞几千条垃圾主题叫兽帖子。第三配置SSL证书。搜索引擎和浏览器都更信任HTTPS站点。现在免费证书很容易申请申请完之后在Nginx配置里把它加上并把80端口的请求统统301到443。这一步对论坛来说不只是好看更重要是防止用户密码在明文链路里被截获。第四定期更新Discuz补丁。Discuz的老版本经常被爆出漏洞官方每次补丁发布后我都在本地测试环境升级完再上生产不能图省事一直拖着。4.3 备份不是可选项而是必选项我给朋友维护的论坛最怕的不是爆栈而是有人手误清空了数据或者服务器磁盘损坏。一套靠谱的备份方案比任何性能优化都重要。我习惯用crontab做每日备份内容分两部分数据库和网站文件。数据库用mysqldump导成SQL网站文件用tar打包统一扔到独立目录再推送到对象存储或另一台服务器。备份脚本类似这样#!/bin/bash DB_NAMEdiscuz DB_USERforum_user DB_PASS你的数据库密码 BACKUP_DIR/backup/forum DATE$(date %F) mysqldump -u$DB_USER -p$DB_PASS $DB_NAME $BACKUP_DIR/discuz_$DATE.sql tar czf $BACKUP_DIR/forum_$DATE.tar.gz /var/www/forum find $BACKUP_DIR -mtime 30 -name *.sql -delete find $BACKUP_DIR -mtime 30 -name *.tar.gz -delete给脚本加执行权限然后写入crontabcrontab -e 0 3 * * * /usr/local/bin/backup_forum.sh /dev/null 21备份这件事等出了问题再想就晚了。免费账号群聊记录都能丢论坛数据更不能开玩笑。4.4 性能优化从慢到快的三次操作论坛访问量从几十人涨到千把人的时候LNMP默认配置可能开始吃力。我的做法是分三步逐步加手法。第一步开PHP Opcache。在php.ini里确认opcache.enable1并把opcache.memory_consumption设为128。Opcode缓存能省去每次请求重新编译PHP代码的开销效果立竿见影。第二步上Redis或Memcached给Discuz做内存缓存。在Discuz后台“全局-性能优化”里选择Redis或Memcached填好服务器地址和端口。数据表缓存、热帖缓存从磁盘搬到内存读多写少的论坛场景下这一下能省大量数据库查询。第三步动静分离。把js、css、图片这几类静态资源交给Nginx直接托管不做PHP解析。如果站点更大还可以考虑给这些静态资源加一层CDN。论坛本身是动态内容为主静态资源做到浏览器缓存就够用不用过度设计。别一上来就砸服务器配置。先观察慢到底慢在哪是用cpu爆掉、数据库慢查询、还是带宽打满有针对性得解决。4.5 常见问题速查表整理一下我搭建过程中遇到的和帮别人处理过的高频问题做成一个速查表。症状可能原因解决办法浏览器直接下载PHP文件Nginx未正确配置PHP解析检查location ~ \.php$和fastcgi_pass配置页面报502 Bad GatewayPHP-FPM未启动或socket路径不对systemctl status php*-fpm检查Nginx里的socket路径安装时提示“无法写入”目录权限不足给data、config目录临时设置777连接数据库失败数据库名、账号密码填错回到安装向导重新填写或用命令行测试mysql -u forum_user -p验证码不显示PHP-GD扩展未安装apt install php-gd重启PHP-FPM图片上传提示失败upload_max_filesize或目录权限不足调大php.ini的上传限制检查data目录可写性开启伪静态后全部404Nginx缺少rewrite规则补上Discuz伪静态rewrite规则后重载Nginx后台无法登录登录验证码错误、密码泄露通过数据库重置管理员密码并开启验证码这些坑如果提前知道能省掉好几个晚上的排查时间。真遇到也没关系照着表一项项看大部分都能快速定位。5. 写在多次搭建之后每次搭完一个论坛我都习惯把整个流程在笔记本上再走一遍心里盘算下一次哪里能优化。论坛项目最迷人的地方不在于安装那几十分钟而是它跑起来之后每一次备份、每一次升级、每一次用户发帖带来的成就感。我个人特别想强调两件事。第一不要过度追求最新版。Discuz的稳定版如果确认刚好就不要盲目追新除非有明确的安全更新或功能需求。稳定压倒一切这是论坛运营的共识。第二权限设置永远要留一手。你一定会遇到“后台无法更新缓存”这种问题到时候就是权限没留够。我一般会在data目录保留可写权限而不是彻底锁死。如果你也准备用LNMP环境Discuz论坛源程序搭一个属于自己的论坛建议先按这套流程在一台测试机器上完整跑一遍再来部署生产环境。一次跑通之后后面日常运营和维护你会越来越顺手。希望这篇还原了我踩坑过程的文章能让你少走几步弯路。