旧安卓机你一般怎么处理?抽屉里吃灰、当遥控器、偶尔充个电看看视频,最多就是给小孩当玩具。我选择了让它重新上岗:当一台个人博客服务器。组合很简单——KSWEB 负责在安卓系统上跑起完整的 Web 运行环境(Apache/Nginx + PHP + MySQL),cpolar 负责把手机上的服务映射到公网,这样一来,我走到哪儿都能用浏览器打开这台旧手机上的博客。整个过程不需要 root,不需要买云服务器,电费几乎可以忽略不计。如果你手里正好有一台闲置安卓机,或者单纯想低成本折腾一个属于自己的独立博客,这篇文章就是给你准备的。
1. 为什么偏偏是 KSWEB + cpolar:这台旧手机的选型逻辑
1.1 旧安卓机最合理的归宿是服务器
先别急着扔手机,想想一台闲置安卓机还能干什么。放在客厅当日历、变成遥控器、做监控摄像头,这都是常见玩法,但大多数方案都需要额外配件,而且最后还是会吃灰。我个人试过一圈之后发现,把它变成一台 7×24 小时常开的个人服务器,是性价比最高、最不需要额外投入的方向。
理由很简单:手机本身就是一台完整的计算机,有 CPU、内存、存储、WiFi 模块,功耗却只有几瓦。相比之下,一台迷你主机至少三五十瓦,云服务器每月也要几十块钱。旧手机做服务器,安静、省电、不占地方,插上充电器往书桌角落一放,就没人管了。
当然,手机做服务器有一个绕不开的坎:你家里的宽带通常是 NAT 内网环境,没有公网 IP,别人在外面根本访问不到你这台手机。这就引出了第二个问题——穿透。
1.2 KSWEB:安卓上最省心的 Web 环境
安卓上跑 Web 服务器,方案其实不少。有人用 Termux 装全套 Linux 环境,然后编译 Nginx、装 PHP、装 MariaDB,自由度最高,但配置过程非常劝退,光是一个 PHP-FPM 和 Nginx 的 socket 通信就能卡住大半天。也有人用 UserLAnd 跑 Ubuntu 容器,但旧手机的 CPU 和内存往往撑不住容器开销。
KSWEB 是另一条路:它把 Apache/Nginx、PHP、MySQL、phpMyAdmin 全部打包成一个安卓 App,用图形界面管理。你只需要装一个 App,在界面里点几下,Web 服务器就起来了,再通过可视化界面添加虚拟主机、修改 PHP 版本、管理数据库,完全不用碰命令行。对绝大多数只是想搭个博客的人来说,这才是真正能落地的方案。
1.3 穿透工具为什么选了 cpolar
手机上的服务起来了,接下来就是外网访问问题。常见方案里,ngrok 是国外服务,免费版速度和稳定性在国内都不太理想;花生壳配置简单但有带宽和流量限制;frp 自建穿透需要一台有公网 IP 的 VPS,这对“零成本”需求来说等于没解决。
cpolar 是国产工具,支持 HTTP/HTTPS/TCP 隧道,免费版就能满足个人博客的基本访问需求,还带一个 Web 控制台,可以实时查看隧道状态、流量、在线设备。安装和配置的学习曲线也比较平缓,和 KSWEB 的“图形化”风格一致,适合不想折腾的人。
选型结论:旧安卓机 + KSWEB + cpolar,这个组合在“成本、上手难度、可维护性”三者之间找到了一个非常平衡的点。硬要跟云服务器比性能和稳定性肯定比不过,但作为自建博客、个人项目展示、内网服务的入口,已经足够了。
1.4 博客程序选型:Typecho 还是 WordPress
服务器环境搭好之后,还得决定跑什么博客程序。WordPress 功能强大,生态丰富,但本身就比较吃资源,在 2GB 内存的旧手机上跑起来会明显吃力,后台编辑文章时能感受到卡顿。Typecho 是国产轻量级博客系统,PHP 写就,安装包才几百 KB,对 PHP 版本要求低,数据库用 MySQL 或 SQLite 都行。在低配设备上,Typecho 的响应速度和资源占用几乎是最优解。
我自己最终选了 Typecho + MySQL 的组合。Typecho 负责前台和后台,MySQL 存文章和评论,这套结构虽然比 SQLite 多一层依赖,但后面备份、迁移、扩展都更方便。
2. KSWEB 安装与博客环境搭建全过程
2.1 装 KSWEB 之前的硬件与系统检查
不是随便一台手机都能胜任服务器角色,建议先做好这几项检查:
- 系统版本 Android 7 以上,低于这个版本的兼容性会差一些
- 内存至少 2GB,4GB 体验才会比较舒服,1GB 的话跑 MySQL 加 Typecho 会很勉强
- 存储剩余空间 1GB 以上,博客程序和数据库文件虽然不大,但系统缓存和日志会慢慢涨
- 最好能一直插着电源,手机做服务器不能指望电池续航
动手前,把手机恢复一次出厂设置,卸载所有不用的 App,关闭后台应用自启动。这一步很多人会跳过,但旧手机通常装了一堆杂七杂八的应用,后台偷偷跑着各种服务,直接影响 Web 服务器的稳定性。
另外,进入系统设置,把休眠时间改成“永不”,关闭锁屏密码或者设置一个简单的滑动解锁。原因后面会细说——锁屏和休眠是安卓手机当服务器最隐蔽的两个坑。
2.2 下载安装 KSWEB 与首次启动
KSWEB 可以直接在官网下载 APK,也可以在一些应用市场搜索安装。装好后打开,主界面会列出几个核心组件:Apache、Nginx、PHP、MySQL,以及一个“进程”列表和“虚拟主机”管理入口。
首次启动时,建议先进入设置,把“网站根目录”确认好。KSWEB 默认的目录一般在手机内部存储下的htdocs文件夹,这个路径在安卓的存储权限机制下比较特殊,如果 KSWEB 提示存储权限不足,需要在系统的应用权限设置里,手动授予“存储空间”权限。
我自己遇到过的一个情况是:装了 App 之后,系统弹窗给的是“仅在使用中允许”,KSWEB 作为后台服务,需要的是“始终允许”。没改这个权限之前,虚拟主机配置能打开,但一访问网站就 403,查了半天才发现是权限问题。
2.3 启动 Web 服务并配置虚拟主机
KSWEB 主界面上,Apache 和 Nginx 二选一启动就可以。我选的是 Nginx,理由很直接:Nginx 在高并发下的内存占用比 Apache 更低,对低配设备更友好。Typecho 在 Nginx 下配置伪静态规则也不麻烦,后面会讲到。
启动服务后,进入“虚拟主机”管理,添加一个新主机,填写以下关键信息:
- 主机名:先用本机地址
localhost或局域网 IP(比如192.168.1.100),后面配好穿透再改 - 端口:默认 80 或 8080。注意很多安卓系统端口 80 会被系统占用,我直接用了 8080
- 根目录:指向刚才在存储目录下创建的博客文件夹,比如
/storage/emulated/0/htdocs/blog - PHP 版本:KSWEB 通常内置多个 PHP 版本,选 PHP 7.4 或 8.0 都可以,Typecho 兼容性没问题
配完后,在手机浏览器访问http://localhost:8080,能看到目录索引或欢迎页,说明 Web 服务已经正常工作了。
2.4 部署 Typecho 到手机
接下来把 Typecho 装进去。先从官网下载最新版压缩包,传到手机,在文件管理器里解压到刚才配置的博客根目录。
这里有个实操细节:解压后不要直接把build目录整个丢进去,而是把压缩包里的index.php、install.php、var、usr等文件直接放在根目录下。如果目录结构不对,后面访问install.php会一直报“安装程序未找到”。
文件就位后,手机浏览器打开:
http://localhost:8080/install.php正常情况下会进入 Typecho 的安装向导。这一步会要求填数据库信息,先把向导放在这里,因为数据库还没准备好,我们直接进入下一节把 MySQL 配置完,再回头继续装。
3. MySQL 数据库配置是博客能否跑起来的关键
3.1 启动 MySQL 与 phpMyAdmin
KSWEB 主界面里,把 MySQL 开关打开。第一次启动 MySQL 时,KSWEB 会生成默认的 root 账号,密码通常是空或者初始化的默认值,不同版本有差异。为了安全,需要尽快通过 KSWEB 自带的 phpMyAdmin 登录并修改 root 密码。
phpMyAdmin 的访问地址一般在 KSWEB 的数据库管理面板里可以一键跳转,默认路径类似:
http://localhost:8080/phpmyadmin/登录之后,第一步就是修改 root 密码。改成强密码并记录好,后面 Typecho 安装时要填。
3.2 创建博客专用数据库和账号
不建议博客程序直接使用 root 账号,这是很多新手会踩的坑。root 权限过大,一旦博客程序有 SQL 注入漏洞,整个数据库都会被拖走。正确做法是创建一个专用账号,只授予当前博客库的权限。
在 phpMyAdmin 的 SQL 标签页里,依次执行:
CREATE DATABASE typecho DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE USER 'bloguser'@'localhost' IDENTIFIED BY '这里改成你自己的强密码'; GRANT ALL PRIVILEGES ON typecho.* TO 'bloguser'@'localhost'; FLUSH PRIVILEGES;utf8mb4 这个字符集必须强调一下。它支持完整的 Unicode 字符,包括四字节的 emoji 表情。如果库建成了默认的 utf8,后面文章里一旦出现 emoji 或生僻字,就会变成乱码甚至直接报错。
数据库名typecho、用户名bloguser、密码,这三样后面安装向导里都要用,可以先抄在备忘录里。
3.3 Typecho 安装向导的数据库参数填写
回到刚才的 Typecho 安装页面,数据库部分的填写规则:
- 数据库驱动:选 MySQL 原生
- 数据库主机:
localhost,不要填 IP。因为 KSWEB 的 MySQL 和 PHP 在同一台设备上,走 socket 连接更稳,填localhost能避免 TCP 连接超时的问题 - 数据库端口:默认 3306。如果之前发生过端口冲突改过端口,就填实际端口
- 数据库名:
typecho,和创建时一致 - 用户名:
bloguser - 密码:创建账号时设置的密码
- 数据库前缀:默认
typecho_就行,一个库里只跑一个博客不需要改 - 管理员账号:自己设置一个,不要用 admin,避免被暴力破解
填完提交,Typecho 如果提示“数据库连接成功”,说明前面所有配置都没问题,接着设置好管理员账号,博客就基本建成了。之后浏览器访问http://localhost:8080/index.php,就能看到博客首页。
3.4 数据库配置阶段常见报错
我自己装的时候,在数据库这一步反复折腾过几次,把典型的报错列一下:
- 提示“数据库主机错误”或“连接超时”:先把数据库主机里的
localhost改成127.0.0.1试试,如果立即可用,说明是 PHP 和 MySQL 的 socket 通信没配对,需要在 KSWEB 的 PHP 配置里检查 socket 路径 - 提示“Access denied for user”:用户名或密码不对,回 phpMyAdmin 重新执行一遍
ALTER USER或重置密码 - 页面乱码:多半是数据库字符集不是 utf8mb4,回 SQL 里把库和表全部转成 utf8mb4
- 启动 MySQL 失败:常见原因是 3306 端口被占,在 KSWEB 数据库设置里改一个端口,比如 3307,同时把 Typecho 安装向导里的端口改成对应值
这些坑都很具体,核心思路是:先确认进程能不能起来,再确认端口通不通,最后查账号权限,一步步缩小范围。
4. cpolar 内网穿透:从本机到公网的最后一公里
4.1 内网穿透到底做了什么
博客已经在手机本地上跑通了,但你的手机处于家里的局域网里,外部访问不到。内网穿透的思路是:在手机和 cpolar 的服务器之间建立一条加密隧道,外部用户访问 cpolar 分配给你的公网域名时,cpolar 服务器把请求通过隧道转发到你手机上的 Nginx 服务,响应再原路返回。
使用户感知上,就像你的博客真的跑在一台有公网 IP 的服务器上一样。这个机制下,手机不需要公网 IP,不需要在路由器上做端口映射,甚至不需要有固定 IP,只要手机能联网,隧道就能建立。
4.2 在安卓上安装 cpolar 客户端
cpolar 官方提供 Windows、macOS、Linux 等平台客户端,安卓上没有原生图形版 App,常见的做法是在 Termux 里运行 Linux ARM 版客户端。Termux 是一个安卓上的终端模拟器,不需要 root 就能安装大部分 Linux 软件包。
安装流程分三步。先在官网注册一个账号,获取专属的认证令牌(authtoken),这个令牌用来把当前的客户端设备绑定到你的账号下。
然后在 Termux 里更新软件源并下载 cpolar 的 ARM 版压缩包:
pkg update pkg install wget unzip # 下载 ARM 版 cpolar,具体版本号以官网下载页为准 wget https://www.cpolar.cn/static/downloads/releases/cpolar-stable-linux-arm.zip unzip cpolar-stable-linux-arm.zip chmod +x cpolar ./cpolar version一定要选 ARM 版,别下成 x86 版,安卓手机基本都是 ARM 架构。看到正常输出版本号后,用令牌初始化:
./cpolar authtoken 你账号里的认证令牌这一步只需要执行一次,令牌会写入配置文件,以后启动隧道不用再重复认证。
4.3 创建 HTTP 隧道并访问博客
最简单的启动方式,是直接指定要穿透的本地端口:
./cpolar http 8080其中 8080 就是前面 KSWEB 配置的 Nginx 端口。启动成功后,终端会输出一个公网 URL,比如https://xxxxxx.cpolar.top,这就是你博客的公网地址,拿到任何设备上访问,都能打开手机里的 Typecho。
不过我不建议每次都命令行手动启,因为参数多、容易忘。更稳的做法是编辑 cpolar 的配置文件,把隧道定义写死:
tunnels: blog: proto: http addr: 8080保存后启动:
./cpolar start blog这样隧道名、端口、协议都在配置里,启动一条命令就够了,重启手机后恢复也方便。
4.4 免费版的限制和应对思路
用免费版 cpolar 时,有几个限制要知道。第一,随机域名每次启动隧道可能会变,想固定域名需要购买套餐;第二,免费版的带宽和连接数有限制,个人博客一天几百个 PV 完全没问题,但别指望它能抗住突发流量;第三,隧道在断网重连后需要重新建立,Termux 进程如果被系统杀掉,隧道就断了。
应对思路也简单:如果只是自己用、写写文章,免费版随机域名也能接受,把新域名存在书签里就行;如果想把博客正式分享给朋友,建议买个基础套餐把域名固定下来,或者绑定自己的域名,具体做法在下一章展开。
5. 绑定自定义域名与 HTTPS:访问体验的进阶打磨
5.1 绑定自定义域名,告别随机地址
每次重启隧道域名就变,不仅烦,也没法告诉朋友“这是我博客,你有空打开看看”。解决这个问题有两个方向:一是买 cpolar 的固定域名套餐,分配一个稳定的二级域名;二是绑定自己注册的域名。
绑定自定义域名时,进入 cpolar 后台,添加你的域名作为访问入口,然后按提示完成域名所有权验证。验证方式通常是给域名加一条 CNAME 解析记录或 TXT 记录,指向 cpolar 服务器。DNS 解析生效后,把 cpolar 隧道配置里的 host 改成你的域名,保存重启,就能用自己的域名访问博客了。
这里有个实操细节:域名解析生效不是即时的,快则几分钟,慢则几小时。我遇到过配置完等了大半天还是打不开的情况,结果用在线 DNS 查询工具一查,发现是解析服务商那边缓存没刷新。所以在验证域名生效之前,别急着干等,先查解析记录。
5.2 把博客切成 HTTPS
现在浏览器对 HTTP 站点越来越不友好,地址栏直接标“不安全”,所以 HTTPS 基本是必须的。cpolar 自带 SSL 证书支持,免费版用户在创建 HTTP 隧道时,可以勾选启用 HTTPS 访问;绑定自定义域名后,就可以为域名申请或上传证书。
我是给自定义域名申请了免费证书,然后在 cpolar 后台把证书配置进去,隧道里同时开启 HTTPS。完成后,用https://你的域名访问博客,地址栏出现小锁标记,整个过程就舒服了。
有一点要提醒:如果博客程序里写死了站点地址,切换成 HTTPS 后要同步把 Typecho 后台的“站点地址”改成https://你的域名,否则页面里的资源链接还会从 HTTP 加载,浏览器照样报警。
5.3 手机端访问速度的优化
博客上线后,访问速度是体验的核心。手机性能有限,需要在前端和后端两头做优化。
Nginx 开启 gzip 压缩:在 KSWEB 的 Nginx 配置里加上 gzip 相关指令,让传输的 HTML、CSS、JS 体积减小,这对窄带和弱网用户提升明显。
Typecho 安装缓存插件:Typecho 官方应用商店里有静态缓存插件,可以把动态生成的页面缓存成静态 HTML,访客命中缓存时,PHP 和 MySQL 都不用参与,响应时间能从几百毫秒降到几十毫秒。
图片压缩和懒加载:手机上的博客如果用了大量原图,页面会非常卡。文章中插入图片之前,先用工具压缩到宽度不超过 800px、体积控制在 200KB 以内,再加懒加载,移动端的浏览体验会好非常多。
这些优化做完之后,一台 4GB 内存的旧手机跑 Typecho,响应速度基本和一台低配云服务器差不多,个人使用是感觉不出差别的。
6. 实测性能、踩坑记录与长期运行经验
6.1 一台骁龙 660 手机跑博客的真实表现
我用一台骁龙 660、4GB 内存、Android 9 的旧手机做了完整测试,系统里同时运行着 KSWEB(Nginx + PHP 7.4 + MySQL)和 Termux 里的 cpolar 隧道,插着充电器,放在书桌角落。
用压力测试大概测了一下,数据如下:
| 场景 | 响应时间(平均值) | CPU 占用 | 内存占用 | 表现 |
|---|---|---|---|---|
| 单用户打开首页 | 200ms 左右 | 30% | 1.2GB | 流畅,无感知 |
| 5 个并发请求 | 500ms 左右 | 60% | 1.4GB | 能跑,首屏略慢 |
| 10 个并发请求 | 1.2s 左右 | 90% | 1.6GB | 有压力,但仍可访问 |
| 后台编辑文章 | 300ms 左右 | 40% | 1.3GB | 顺畅,无卡顿 |
结论很明确:个人博客这种低并发场景,旧手机完全扛得住。如果访问量再大,瓶颈主要在内存和 cpolar 免费带宽上,而不是 CPU。建议在 KSWEB 的 PHP 配置里把最大子进程数调低一点,比如 4 个,避免突发流量把内存撑爆导致整机卡死。
6.2 我在这个项目里踩过的几个坑
这个项目整体不复杂,但实际运行中坑不少,挑几个影响最大的说。
坑一:手机休眠导致服务“假死”。这是最隐蔽的。手机锁屏一段时间后,安卓系统会自动休眠,网络连接被挂起,Nginx 进程虽然还在,但外部访问已经超时。解决办法是:系统设置里把休眠时间设为“永不”,并在开发者选项里打开“屏幕常亮”或保持充电时不休眠。如果你不想让屏幕一直亮着,至少要把 WiFi 设置为“永不休眠”。
坑二:KSWEB 和 cpolar 被系统杀掉。安卓系统为了省电,会把长时间后台运行的进程杀掉,尤其是 Termux 这种普通应用。我在电池优化设置里把 KSWEB、Termux 都加入了“不受限制”白名单,另外在系统应用启动管理里允许它们自启动、关联启动和后台运行,这才基本稳定下来。
坑三:重启后隧道失效。路由器重启或网络切换后,cpolar 会自动尝试重连,但有时终端直接报错退出了。后来我写了一个简单的脚本放在 Termux 里,检测到隧道进程不存在就自动重启隧道,并用 Termux 的定时任务每 5 分钟检查一次。这个小脚本让博客的可用性从“经常断”变成了“基本稳定”。
坑四:端口被系统应用抢占。有一次博客突然打不开,排查发现是系统某个应用把 8080 端口占了。后来我干脆把 Nginx 端口改成 8088,并在 KSWEB 和 Typecho 站点设置里同步修改,就再没冲突过。
6.3 长期运行的散热、续航与自动恢复
手机 7×24 小时跑服务,散热和电池是绕不开的话题。
散热方面,旧手机跑博客的负载不高,实测机身温度稳定在 35~40℃,仅温手不烫手。如果你手头的机器负载较高,最简单的散热方案是把它立起来用支架垫高,增加空气流通,或者贴一个半导体散热背夹,几十块钱,温度能再降 5℃ 以上。千万别把它闷在抽屉里跑,那才是真正的煎蛋。
电池方面,长期插电会让电池鼓包,这是锂电的物理特性。我有两个处理办法:一是用带智能断电功能的充电器,电量到了 80% 就停止充电;二是如果手机系统支持电池保养模式(部分国产系统有类似功能),打开它就能把充电上限限制在 80%。如果实在没有这些功能,那就接受电池健康度逐年下降的事实——反正本来也是旧手机。
自动恢复方面,建议把服务做成“开机即起”。KSWEB 本身有开机自启动开关,在应用设置里打开就行。Termux 的开机自启稍微麻烦一点,需要借助 Tasker 或者 Termux 的termux-boot插件,开机后自动执行启动 cpolar 隧道的脚本。这套配置弄好之后,手机就算断电重启了,也能自己把博客重新拉起来。
6.4 备份方案与安全加固
最后聊两句长期运维的底线问题:备份和安全。
备份我用的是最土但最可靠的方法:每天凌晨用手机上的自动化脚本,把 MySQL 数据库导出成 SQL 文件,连同网站根目录一起打包成 tar.gz,然后上传到网盘或另一台设备。数据库几百 KB,网站代码加起来也就几 MB,备份成本几乎为零,但能在手机存储坏了或者系统崩溃时救回整年的文章。
安全方面,几个基本动作别忘了:Typecho 后台的管理员密码要用强密码,别用默认的 admin 用户名;cpolar 后台开启账号两步验证;如果不需要通过公网访问 phpMyAdmin,就在 KSWEB 配置里把 phpMyAdmin 的虚拟主机只绑定到localhost,外部访问一律 403。
整体折腾下来,我的体会是:旧安卓机当服务器不是玩具,只要把休眠、后台限制、穿透稳定性这几个问题处理好,它完全可以承担一个真实博客的日常运行。如果你手头正好有一台闲置安卓机,与其让它继续在抽屉里吃灰,不如花一下午照着这篇文章的步骤把它变成一台随时能被访问的博客服务器。等你用手机浏览器在咖啡厅里打开自己博客的那一刻,会觉得这次折腾非常值。