
1. 先说结论手机跑Discuz并不是天方夜谭拿一台旧手机当Web服务器装一个Discuz论坛还要公网能访问。这个想法我实际搭过结论是能跑但预期必须放低。手机处理器的性能再怎么样也打不过同价位的入门服务器所以它更适合做三件事个人论坛、内网知识库、临时测试站点。如果你指望它扛住几十上百人的同时在线那是给自己找麻烦。把这篇文章当一份折腾记录看里面的步骤和坑足够让你少走一晚上弯路。1.1 为什么我会想到用手机当Web服务器家里有台闲置安卓机扔掉可惜卖二手不值钱。它自带电池和Wi-Fi其实是一台自带UPS的微型电脑。今天的中端手机处理器你去看手机处理器天梯图随便一颗中端芯片都比十年前的电脑强跑一个PHP论坛完全不成问题真正的瓶颈根本不是性能而是软件环境和电源管理。只要解决了“在手机上跑Linux”和“别让系统把后台杀掉”这两件事手机就能变成一台长期开机的低功耗服务器。另一个动机是省钱。很多朋友想学Linux运维、想搭个论坛练手服务器月费却是一笔开销。手机方案虽然不专业但零成本入门还能逼你熟悉命令行、网络和数据库。这个过程学到的东西比看十篇教程都实在。1.2 三条路线参考别一上来就选重方案我实际考虑过三种方案各有优劣方案是否需要root性能表现定制性适合谁Termux proot-distro不需要中等proot会有一点性能损失极高命令可控大多数普通用户、新手Linux Deploychroot需要root较好接近原生较高但配置复杂有root玩家追求性能KSWEB / AndroPHP 集成App不需要一般开箱即用低目录和配置受限只想快速跑PHP不想敲命令我最后选了Termux proot-distro原因有三个第一免root现在手机root越来越麻烦我不太愿意为此放弃保修第二Termux的proot-distro维护活跃Ubuntu、Debian等发行版都能直接装命令生态跟服务器完全一致第三个原因更实际Linux Deploy在部分新安卓内核上会碰壁而Termux基本没这种兼容性问题。损失一点性能换来更省事的折腾过程划算。还有一点必须说在前头手机端环境里不要装桌面环境只装必要的Nginx、PHP、MariaDB就够了。桌面图形界面会吃几百兆内存对一台只有2到4GB内存的手机来说太奢侈了。2. 在手机上把Linux轻量环境跑起来这一步是整个项目的地基。很多人失败在Termux装到一半就放弃因为Android后台机制太烦人。先把Termux调教好后面的Linux环境才不会被系统莫名其妙杀掉。2.1 Termux获取与初始化F-Droid版最省心不要从酷安或某些市场随便下载Termux同一个名字的包可能被二次打包里面塞了什么你根本不知道。我建议去F-Droid或GitHub Releases下载最新版这是Termux作者明确推荐的渠道。装完以后先执行基础更新pkg update -y pkg upgrade -y然后安装基础工具pkg install -y proot-distro termux-api wget unzip有一个容易忽略的步骤输入termux-setup-storage把手机存储权限打开。后面下载Discuz压缩包、解压文件时直接操作 /sdcard 会方便很多。但要注意你真正跑网站的文件应该放在Termux的Linux环境里不要直接放在SD卡上因为Linux环境对FAT32的SD卡权限支持很别扭。2.2 用proot-distro安装Ubuntu而不是直接硬装在系统里proot-distro是Termux官方方案原理是通过用户态模拟根目录让你在不用root的情况下运行完整的Linux发行版。性能会有损耗但对PHP论坛这种轻度负载完全够用。安装Ubuntuproot-distro install ubuntuinstall过程会下载文件时长取决于网络。装好后用这句进入Linux环境proot-distro login ubuntu进入之后你会看到提示符变成rootlocalhost。此时你有了root身份但内核还是Android的所以systemctl、iptables这类需要systemd和内核模块的命令是不能直接用的。解决办法是服务用service或直接跑命令行进程防火墙用软件层方案。这个限制不用太担心因为我们用Nginx、PHP-FPM和MariaDB都是用户态进程。进入Ubuntu后第一件事是换软件源。默认源慢到怀疑人生建议改成国内镜像具体镜像地址自己选一个手顺的。执行apt update apt install -y vim curl wget sudo然后安装运行环境apt install -y nginx php-fpm php-mysql php-gd php-curl php-zip php-xml php-mbstring mariadb-server注意PHP的扩展名可能因版本不同稍有差异比如在Ubuntu为php8.1-fpm时php-mysql就是现成的。安装完以后先用php -v和nginx -v验证一下。2.3 Nginx PHP-FPM MariaDB安装与基础配置为什么不选Apache因为手机内存太小Apache通常是进程/线程模型C10K时代的老架构占资源比Nginx高不少。Nginx配合PHP-FPM一个PHP请求只经过一个FastCGI进程整个流程很轻。这一步选型直接决定了手机能否长期稳定运行。Nginx主配置文件在/etc/nginx/sites-available/default我们需要让它能解析PHP。打开这个文件找到server块把root改为root /var/www/html; index index.php index.html index.htm;再取消或新增一段PHP的location配置location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/run/php/php8.1-fpm.sock; }然后测试配置并重载nginx -t nginx -s reloadPHP-FPM的配置在/etc/php/8.1/fpm/pool.d/www.conf建议把内存限制和并发调低memory_limit 128M pm.max_children 4 pm.start_servers 1 pm.min_spare_servers 1 pm.max_spare_servers 2MariaDB配置方面先初始化数据库安全设置mysql_secure_installation过程中设置root密码然后创建Discuz专用库和用户CREATE DATABASE discuz DEFAULT CHARACTER SET utf8mb4; CREATE USER discuzlocalhost IDENTIFIED BY 你自己的密码; GRANT ALL PRIVILEGES ON discuz.* TO discuzlocalhost; FLUSH PRIVILEGES;这一步做好之后先别急着装Discuz。用一条PHP探针测试环境是否联通echo ?php phpinfo(); ? /var/www/html/test.php然后在你电脑浏览器里访问http://手机局域网IP/test.php如果看到PHP信息页面说明PHP-FPM和Nginx已经通了可以删除test.php开始装Discuz。手机局域网IP可以用hostname -I查看。3. 把Discuz! X3.5塞进手机并完成安装Discuz目前主流版本是X3.5正好对应你标题里的“discuz3”。别去下载那些乱七八糟的旧版源码包安全补丁都没有纯属给自己挖坑。X3.5对PHP 8兼容性做得不错跑在PHP 8.1上没大问题。3.1 下载、解压、权限调整从Discuz官方渠道下载UTF-8版本压缩包。把压缩包放到手机内置存储然后拷到Linux环境里或者在Linux环境里直接wget。更稳妥的方式是在电脑下载再通过局域网传到手机避免Termux里wget到老旧页面。假设压缩包在/sdcard/Download下先拷贝cp /sdcard/Download/Discuz_X3.5_SC_UTF8.zip /root/ unzip Discuz_X3.5_SC_UTF8.zip -d /var/www/html/解压出来的目录里会有upload子目录其实站点文件都在里面。把upload里的内容移到html根目录mv /var/www/html/upload/* /var/www/html/ mv /var/www/html/upload/.* /var/www/html/ 2/dev/null然后调整所有者这一步很关键。Nginx和PHP-FPM都跑在www-data用户下所以chown -R www-data:www-data /var/www/html chmod -R 755 /var/www/htmlDiscuz在安装过程中需要写 config、data、uc_client 等目录。如果后面安装时报“无法写入”不要偷懒改777查一下这几个目录是否确实是www-data所有。手机环境通常就你一个人用权限收紧点更安全。3.2 Web安装向导与数据库初始化电脑浏览器打开http://手机局域网IP/install/index.php进入Discuz安装向导。这里要注意你访问手机时如果用http://手机局域网IP/install/会显示安装页面。数据库地址填localhost数据库名填discuz用户和密码用你刚在MariaDB里创建的那个。管理员账号、密码、邮箱自己设置好。安装过程中会检测目录权限、PHP函数支持。如果某个函数未开启比如putenv、proc_open在部分主机商环境禁用会卡住。在手机终端环境中默认通常是开启的不用太担心。装完之后务必删除安装目录rm -rf /var/www/html/install这个install目录不删不光是安全问题还会让你下次访问时被强制跳去安装页非常尴尬。3.3 手机端专属优化伪静态、缓存与定时维护装完的Discuz默认用的是动态链接长这样/forum.php?modviewthreadtid1不仅丑还徒增CPU负担。手机性能有限建议开启伪静态。Discuz官网后台有nginx规则典型配置是if (!-e $request_filename) { rewrite ^([^.]*)$ /index.php?$1 last; }把它加进Nginx的server块然后nginx -s reload再到Discuz后台开启“静态URL”相关选项。缓存方面别在手机环境里硬撑Redis或Memcached。虽然Discuz支持但额外进程会消耗几十兆内存。小流量站点直接依赖PHP自带文件缓存就够了。MySQL层注意把InnoDB缓冲池调小默认128M都偏大[mysqld] innodb_buffer_pool_size 64M max_connections 20这里给max_connections设为20足够个人论坛使用。连接数太高反而容易触发MySQL OOM。还有一个容易被忽略的维护点Discuz会产生大量缓存文件通过访问后台或者定期清理。在Termux环境里可以写一个简单cron脚本但我个人经验是一周手动清一次比自动清理更可控。手机环境别额外跑一个定时器进程免得又占内存又容易被系统杀。4. 打通外网访问DDNS、内网穿透与安全加固“加外网访问”是整个项目里最折腾的一环。大多数人家里没有公网IPv4或者宽带运营商不给你公网IP导致手机只能在内网访问。这条路能不能走通先别急着买云服务器按下面的顺序判断。4.1 判断你到底有没有公网IP进路由器后台看WAN口IP地址然后在你电脑上访问一个在线IP查询页面看出口IP。两个IP一致且不是100.64.x.x这种运营商级NAT段说明你有公网IP。如果IP不一致基本可以确定你处在多重NAT后面这种情况下面提到的frp内网穿透更适合你。另一种情况是你有IPv6地址而且路由器能正常下发IPv6那公网访问就简单多了直接映射IPv6端口即可。但国内家庭网络环境参差不齐拿IPv4玩是最稳的。4.2 无公网IP方案frp内网穿透全流程frp全称Fast Reverse Proxy是一款成熟的內网穿透工具。它需要一个有公网IP的服务器用来做中转。手机上的frpc主动连接到云端frps并建立隧道外部访问云服务器端口就能转发到手机的Nginx服务。云服务器端安装frpswget https://github.com/fatedier/frp/releases/download/v0.52.3/frp_0.52.3_linux_amd64.tar.gz tar xf frp_0.52.3_linux_amd64.tar.gz mv frp_0.52.3_linux_amd64/frps /usr/local/bin/frps配置文件/etc/frp/frps.toml新版本用tomlbindPort 7000 auth.token 这一段要改成你自己的长随机字符串 webServer.port 7500 webServer.user admin webServer.password 改掉默认密码启动frps后手机端安装frpc。手机终端是ARM架构注意下载对应版本wget https://github.com/fatedier/frp/releases/download/v0.52.3/frp_0.52.3_linux_arm64.tar.gz tar xf frp_0.52.3_linux_arm64.tar.gz mv frp_0.52.3_linux_arm64/frpc /usr/local/bin/frpc配置文件serverAddr 你的云服务器IP serverPort 7000 auth.token 和frps一样的长随机字符串 [[proxies]] name discuz-web type tcp localIP 127.0.0.1 localPort 80 remotePort 8080启动frpc -c /etc/frp/frpc.toml此时外网访问http://你的服务器IP:8080就能到达手机上的Nginx。如果你有域名解析到服务器IP也能直接用域名访问。这里有个小建议用服务器IP访问还是不够稳定建议把frpc设置为开机自启。Termux没有systemd可以用cron或者直接写一个start_frp.sh配合Termux服务。我后面会细说怎么保活。4.3 有公网IP方案路由器端口映射 DDNS如果你有公网IP其实比frp还省事。在路由器后台把“端口映射”或“虚拟服务器”功能打开把外部端口8080映射到手机的局域网IP的80端口。注意多数运营商屏蔽了80、8080、443等常规端口所以外网端口建议选8443、9000这种不常用的。然后配置DDNS目的是解决家庭宽带IP动态变化的问题。很多路由器自带花生壳或阿里云DDNS绑定域名后外网就能用你的域名:端口访问。CMD手机端不需要额外进程比frp更省资源。但代价是依赖路由器的稳定性。DDNS更新有延迟万一公网IP变更外网访问可能断几个小时。4.4 三个外网访问必备的安全加固既然暴露到公网就别裸奔。我用过的加强配置有以下几条按优先级排序第一隐藏数据库和后台。Nginx不要把3306端口映射出去frp也只转发80端口Discuz后台地址不要用默认admincp建议安装后修改admin目录。第二加访问门槛。Nginx层限制IP或加HTTP Basic认证Discuz后台开启验证码登录把登录失败的频率限制打开。手机作为主机防不了DDoS但能做到不让别人轻易爆破。第三全站HTTPS。用frp或路由器做转发时外网明文传输很不安全。建议在云服务器上叠一层Nginx或Caddy实现HTTPS终止再转发到frps端口。Caddy配置最省事example.com { reverse_proxy 127.0.0.1:8080 }Caddy自动申请证书手机端仍然是普通HTTP这样外部链路是加密的内网流量即使被嗅探风险也小很多。5. 实战两天遇到的坑与排查速查这部分是我最想写的。表面看步骤不难但真正跑两天各种诡异问题全出来了。下面几条你迟早会遇到提前打预防针。5.1 手机一锁屏网站就断怎么办第一天晚上我把手机锁屏丢桌上第二天早上域名已经打不开了。Termux进程被Android杀得一干二净。解决思路不是“阻止系统杀进程”而是让Termux变成长驻前台应用。具体做法分三步把Termux加入系统电池优化白名单手机设置里“电池”-“后台限制”选择不限制在最近任务界面把Termux卡片锁定防止多任务清理时被关闭安装Termux:Boot或Termux:API用termux-wakelock保持CPU唤醒。但就算这样某些激进ROM还是会清后台。此时需要一个看门狗脚本比如每5分钟检查frpc和nginx是否存在如果挂了就拉起来#!/data/data/com.termux/files/usr/bin/bash if ! pgrep -x frpc /dev/null; then frpc -c /etc/frp/frpc.toml fi配合cron或Termux定时任务运行。这个方案实测能抗住隔夜运行。5.2 MariaDB频繁挂掉给数据库“限流”手机内存只有3GB时跑一会MariaDB就会突然挂掉打mysql命令提示Cant connect to local MySQL server。查看系统日志才发现是Out of MemoryAndroid杀掉了MySQL进程。原因很简单默认配置里InnoDB缓冲池和连接数太少恰恰相反默认配置是按普通服务器调的对手机来说太大了。解决办法是压内存把我前面提到的innodb_buffer_pool_size64M和max_connections20写进/etc/mysql/mariadb.conf.d/50-server.cnf重启MariaDBservice mariadb restart另外给系统增加swap也能缓解。Termux环境下可以在内部存储创建swapfile然后swapon但Android内核可能不允许所以最靠谱的还是一开始就把数据库配置压低。如果内存只有2GB建议连PHP-FPM的pm.max_children改成2。5.3 外网访问慢或直接超时第一反应怀疑frp带宽于是我去测云服务器速度结果很快。后来发现DNS解析到旧IP上因为之前配置过DDNS解析记录还没更新。如果你是frp方案外网访问慢还有可能是手机上行带宽不够家庭宽带上行只有30Mbps是常态建议开启Gzip压缩Discuz后台开启页面压缩减少传输体积。如果外网打不开但本地访问正常大概率是frpc进程被系统杀了或者端口被运营商拦了。逐个排查先看frpc进程还在不在再看云服务器端口是否被防火墙拦截最后检查外网端口是不是常规端口——是的话换一个非常规端口再试。5.4 常见问题速查表现象可能原因解决方法锁屏后打不开Termux被系统清理电池白名单、锁定后台、wakelockMySQL服务消失内存不足被OOM调低innodb_buffer和连接数外网打不开frpc进程挂掉看门狗脚本自动拉起外网访问是默认页Nginx root指向错误检查default配置里root路径安装时目录不可写权限归属错误chown www-data访问域名跳转安装页install目录未删除删除web目录install文件夹外网响应极慢手机上行带宽低开启Gzip、压缩页面资源6. 我保留的一点私货建议折腾了两天虽然中间无数次想放弃但最后看到外网能访问论坛的那一刻成就感还是很大的。这台旧手机从电子垃圾变成了一个可以随时访问的站点整个过程比买一台云服务器有意思得多。6.1 这台手机到底适合干嘛我现在把它当内网知识库用挂着Discuz几个同事朋友通过Tailscale一款组网工具也都能访问。外网访问虽然是通的但只在小范围内分享不打算当公开论坛跑。手机硬件再可靠也经不起99.99%可用性的要求。你想长期公开运行最好还是云服务器。手机方案适合学习、测试、临时给朋友展示或者当一个“私有云笔记”这些都是它擅长的场景。6.2 还能怎么扩展如果你觉得只跑Discuz太无聊这台手机还能顺带干很多事情装一个phpMyAdmin管理数据库挂一个syncthing做文件同步甚至加个nextcloud当私有网盘。不过要记住每开一个服务内存和耗电都会成倍上涨。我个人的建议是一个手机只做一个主业务别贪心。当初我想在手机上同时跑三个服务结果两天内死机两次后来砍掉其他服务只保留Discuz才稳定下来。还有一个小技巧给手机配上智能插座设置在凌晨定时断电重启能在一定程度上清理内存碎片比手动一周重启一次省事。配合Termux Boot脚本重启后自动进入Ubuntu、启动nginx和frpc整个系统就像一台小服务器一样自我恢复。这个项目做到这一步才算真正闭环了。