ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

手机变身服务器:Termux+Ubuntu搭建LNMP动态网站实战

手机变身服务器:Termux+Ubuntu搭建LNMP动态网站实战 1. 为什么绕一大圈装Ubuntu而不是直接用Termux搭网站先说结论直接在Termux里装Nginx、PHP、MySQL完全可行但真正把动态网站跑起来之后你会碰到一堆能用但别扭的问题。我最初也试过在Termux原生环境里直接干前半小时一切顺利越往后越难受。核心问题在于Termux的包管理是基于Android的bionic libc编译的和桌面Linux生态的glibc环境有差异。你装一个php扩展可能需要连编带调好几个小时有些包在Termux的仓库里根本没有只能自己找第三方编译源。而动态网站的本质是Web服务器 脚本解释器 数据库 业务代码四个环节的联动任何一个环节缺包、版本不对、扩展装不上整个链路就断掉。我曾经在Termux原生环境里为了装一个php的pdo_mysql扩展折腾了快一天最后发现官方仓库里那个php包默认没编进去得自己重新编译整个PHP——这性价比低到让人想摔手机。所以我在第二次尝试时换了思路先用Termux的proot-distro工具装一个完整的Ubuntu用户空间镜像然后在Ubuntu里干所有事。Ubuntu的apt仓库里什么都有php、mysql、nginx、redis、composer一条命令全解决依赖关系也自动处理得干净利落。你得到的其实是一个运行在手机上的、接近完整版Linux的容器动态网站开发中遇到的各种库、扩展、工具链在Ubuntu里几乎都能无缝搞定。很多人一听到容器就以为需要root权限其实完全不需要。Termux的proot-distro用的是proot技术它通过用户态的ptrace系统调用翻译把Ubuntu的rootfs模拟到Termux进程里整个过程不碰Android内核不需要root也不影响你手机的保修和安全。代价是性能上会比原生执行差一些但跑个个人网站、学习环境、演示项目完全够用。这篇文章的主要读者我设想是这三类人一是在手机上学习Linux和Web开发、但手边没有电脑的学生二是想把闲置安卓手机变成一台随身演示服务器、给客户或朋友展示网站的开发者三是纯粹对在手机上跑Linux这件事好奇、想深度折腾一下的玩家。不管你是哪一类按这篇文章的步骤走一遍最后你会在手机浏览器里看到自己写的动态网页而且局域网内的其他设备也能访问。2. 环境准备proot-distro安装Ubuntu和国内源配置2.1 Termux基础设置Termux可以从F-Droid渠道下载第三方渠道的版本可能不维护这点不需要多说。装好后先做两件事更新包索引和升级已有包然后安装proot-distro。pkg update pkg upgrade -y pkg install proot-distro -y这个proot-distro是Termux官方维护的多发行版安装工具支持Ubuntu、Debian、Kali、Arch等主流发行版。它会把对应发行版的rootfs解压到Termux的数据目录里然后用proot启动一个用户态模拟环境。有个细节值得注意proot-distro在安装Ubuntu时会先下载bootstrap镜像这个下载源在国外的服务器上速度可能很慢。你可以通过设置镜像环境变量来解决。我习惯把下载源指向国内同步节点速度能快上十倍export PROOT_DISTRO_MIRRORhttps://mirrors.tuna.tsinghua.edu.cn/ubuntu-cloud-images/ proot-distro install ubuntu如果这个变量不起效果可以在proot-distro的脚本目录里查找它实际使用的下载地址手动下载rootfs镜像后放到缓存目录再重装。具体路径不同版本稍微有差异你可以用find $PREFIX -name *.tar.*找到它缓存的镜像文件。我自己在装的时候就因为默认源太慢卡了五分钟换成镜像源后两分钟搞定。安装完成后登录进入Ubuntu环境proot-distro login ubuntu此时你会看到shell提示符变了说明你已经进入Ubuntu环境。可以执行cat /etc/os-release确认版本信息再执行uname -a看看内核信息——注意内核还是Android的但用户空间的工具链、编译器、库文件全都是Ubuntu的了。这就是proot的原理它不替换内核只模拟用户空间。2.2 Ubuntu换源和基础工具安装进到Ubuntu环境后第一件事是换源。默认的archive.ubuntu.com源在国内访问很慢我直接把它替换成阿里云或清华的镜像地址。这里我以Ubuntu 22.04 LTS为例sed -i s/archive.ubuntu.com/mirrors.aliyun.com/g /etc/apt/sources.list sed -i s/security.ubuntu.com/mirrors.aliyun.com/g /etc/apt/sources.list apt update apt upgrade -y如果你装的是Ubuntu 24.04镜像配置文件可能不在/etc/apt/sources.list而在/etc/apt/sources.list.d/ubuntu.sources格式是deb822操作方式类似把URIs那一行替换成镜像地址就行。基础工具我建议一次性装齐后面省得反复进apt装东西。到这一步你已经有了一个完整的Ubuntu命令行环境。3. 在Ubuntu里装好LNMP网站就能先跑起来3.1 Nginx安装与站点配置动态网站我选择Nginx PHP-FPM MariaDB这套组合也就是常说的LNMP。为什么不选Apache一是Nginx的并发性能更好二是配置简洁没有Apache那套复杂的.htaccess和模块系统在手机上本来就资源有限Nginx更轻量。apt install nginx -y装完之后先别急着换配置服务默认是没启动的。因为proot环境没有systemdservice nginx start这类命令会报错需要用nginx命令直接前台或后台启动nginx启动后验证一下进程是否正常ps aux | grep nginx如果你看到master进程和worker进程都在说明Nginx已经跑起来了。在Termux里打开浏览器访问http://127.0.0.1/应该能看到Nginx的默认欢迎页。如果你看不到多半是端口被占用或者Nginx的pid文件路径有问题可以看/var/log/nginx/error.log排查。接下来修改站点配置。默认站点配置文件在/etc/nginx/sites-available/default我的建议是直接编辑这个文件把根目录指到你的项目目录并配置好PHP的转发。下面是我惯用的一个最小可用配置server { listen 80 default_server; root /var/www/html; index index.php index.html; server_name _; location / { try_files $uri $uri/ 404; } location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/run/php/php-fpm.sock; } }重点在location ~ \.php$这块。动态网站的请求流程是浏览器请求.php文件 - Nginx收到请求后把它转给PHP-FPM解释器去执行 - PHP执行完把HTML结果返回给Nginx - Nginx再回给浏览器。Nginx本身不认识PHP代码它只是负责转发的那个快递员。配好后重载Nginx配置nginx -t nginx -s reload3.2 PHP-FPM的安装与对接细节Nginx装好了但此时所有PHP文件都只会被当成纯文本下载不会执行因为还没装PHP解释器。这一步是很多人卡住的地方我特意说明一下。Ubuntu 22.04默认的PHP版本是8.1执行apt install php-fpm php-mysql php-curl php-mbstring php-xml php-zip -y这几个扩展是动态网站比较常用的php-mysql负责连数据库php-mbstring处理多字节字符串php-xml是很多框架的依赖项。如果你后面打算跑WordPress或Laravel这些基本是标配。PHP-FPM装好之后要确认它的监听方式。我配置里写的unix:/run/php/php-fpm.sockUbuntu 22.04的php-fpm默认就是通过Unix socket监听的路径通常为/run/php/php8.1-fpm.sock。如果你的系统里版本号不同把配置里的socket路径改成实际路径即可。可以用以下命令查看实际socket文件位置ls -l /run/php/php*-fpm.sock如果清单里找不到socket文件说明php-fpm还没启动执行php-fpm8.1 -D-D参数让php-fpm以daemon方式后台运行。启动后再执行ps aux | grep php确认进程在。到这里你可以在/var/www/html目录下创建一个测试文件看看PHP是否已经和Nginx打通了echo ?php phpinfo(); /var/www/html/info.php然后浏览器访问http://127.0.0.1/info.php。如果能看到PHP信息页说明Nginx和PHP-FPM的socket对接成功这也是动态网站能跑起来的第一道门槛。我见过不少人卡在这一步症状是浏览器访问PHP文件直接变成下载或者返回502 Bad Gateway——几乎所有情况都是php-fpm没启动或socket路径不匹配。3.3 MariaDB数据库安装与初始化没有数据库的动态网站是不完整的表单提交、用户登录、文章列表这些功能都需要数据库支撑。MariaDB是MySQL的开源分支兼容性非常好在Ubuntu里可以直接通过apt安装apt install mariadb-server -y同样没有systemd需要手动初始化数据库mariadb-install-db --usermysql --datadir/var/lib/mysql mysqld_safe --skip-syslog 启动后通过MariaDB自带的脚本做安全初始化设置root密码、删除匿名用户、禁止root远程登录mariadb-secure-installation按提示操作即可。注意一点proot环境下的默认字符集可能不是UTF-8中文内容的网站建议在MariaDB配置里显式加上默认字符集。在/etc/mysql/mariadb.conf.d/50-server.cnf的[mysqld]段加上character-set-server utf8mb4 collation-server utf8mb4_unicode_ciutf8mb4不仅支持中文还覆盖表情符号没有理由不用它。改完配置后重启MariaDB才能生效。到这里LNMP环境三件套已经齐了。你可以先做个最基础的动态网页验证一下在/var/www/html里创建一个test.php里面写一条SQL查询如果能正常返回数据整个链路就是通的。4. 让数据活起来PHP MariaDB实现第一个动态页面4.1 建库建表与插入测试数据环境搭好了接下来我带你做一个真正意义上的动态网站Demo——一个简单的留言板。它包含最基本的动态网站要素前端HTML表单、后端PHP处理、数据库存储和读取。先进入MariaDB创建数据库和表mariadb -u root -p输入刚才设置的密码后执行SQLCREATE DATABASE IF NOT EXISTS guestbook DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; USE guestbook; CREATE TABLE messages ( id INT AUTO_INCREMENT PRIMARY KEY, nickname VARCHAR(50) NOT NULL, content TEXT NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; INSERT INTO messages (nickname, content) VALUES (小明, 第一条动态网站数据纪念一下); INSERT INTO messages (nickname, content) VALUES (小红, 在手机上写代码的感觉真不错。);这里用InnoDB引擎是因为它支持事务和外键生产环境的基本要求。如果你的应用以后要扩展InnoDB是更稳妥的选择。4.2 用PHP写一个能读能写的页面数据库有了数据现在写两个PHP文件一个用于展示留言列表并支持提交新留言另一个用于处理表单数据。我把这两个逻辑直接写在同一个文件里方便说明也方便你直接复制测试。在/var/www/html/guestbook.php文件中创建?php $servername 127.0.0.1; $username root; $password 你的数据库密码; $dbname guestbook; $conn new mysqli($servername, $username, $password, $dbname); if ($conn-connect_error) { die(数据库连接失败: . $conn-connect_error); } $conn-set_charset(utf8mb4); if ($_SERVER[REQUEST_METHOD] POST) { $nickname htmlspecialchars(trim($_POST[nickname]), ENT_QUOTES); $content htmlspecialchars(trim($_POST[content]), ENT_QUOTES); if ($nickname ! $content ! ) { $stmt $conn-prepare(INSERT INTO messages (nickname, content) VALUES (?, ?)); $stmt-bind_param(ss, $nickname, $content); $stmt-execute(); $stmt-close(); header(Location: guestbook.php); exit; } } ? !DOCTYPE html html langzh-CN head meta charsetUTF-8 meta nameviewport contentwidthdevice-width, initial-scale1.0 title手机里的动态留言板/title /head body h1手机里的动态留言板/h1 form methodPOST input typetext namenickname placeholder你的昵称 required textarea namecontent placeholder想说的话... required/textarea button typesubmit提交留言/button /form ?php $result $conn-query(SELECT nickname, content, created_at FROM messages ORDER BY created_at DESC); if ($result-num_rows 0) { while ($row $result-fetch_assoc()) { echo div; echo strong . $row[nickname] . /strong ; echo span . $row[created_at] . /span; echo p . nl2br($row[content]) . /p; echo /div; } } else { echo p还没有留言来抢沙发吧/p; } $conn-close(); ? /body /html这个页面包含了两层动态一是发布留言时把数据写入数据库二是刷新页面时从数据库把记录读出来渲染成HTML。所有内容不是在代码里写死的而是由数据库的内容决定——这正是动态网站和静态网页的本质区别。你可以对比一下静态网页的HTML文件内容是什么用户在浏览器里看到的就是什么每次访问都一样而这个留言板页面每提交一条新留言下一轮刷新时内容就会变。这里有两个我特别想强调的安全习惯你在任何动态网站项目里都用得上。第一个是htmlspecialchars()。用户输入的内容不可信如果不做HTML转义用户提交的scriptalert(1)/script会被浏览器直接当成脚本执行这就是最基本的XSS攻击。用htmlspecialchars把尖括号转义掉就安全了。第二个是SQL预处理语句。我用了prepare和bind_param而不是直接把变量拼进SQL里。直接拼接的话如果用户提交; DROP TABLE messages;--这段内容SQL执行时可能会变成多条命令把整张表删掉这就是SQL注入。预处理语句能确保输入永远只被当作数据处理而不是SQL语法的一部分。4.3 从手机浏览器里看到第一个动态页面在Termux的Ubuntu环境里访问http://127.0.0.1/guestbook.php你就能看到这个留言板了。提交一条留言页面刷新后显示出来。这个瞬间还挺有成就感的——你的手机现在真的成为了一台能提供动态服务的服务器。如果你之前一直在电脑上开发网站可能对把服务器装进手机这件事没太多感觉。但当你真正在手机的Termux命令行里敲下一串SQL插入数据再在浏览器里看到内容出现在页面上时你会发现整个流程和操作一台云服务器其实没什么差别。这也是Termux Ubuntu这套方案最有价值的地方它把服务器开发的学习门槛拉到了最低一部几百块钱的安卓手机就能当学习机用。5. 把手机上的网站开放给局域网设备访问动态网站在手机本机跑通了下一步自然是让局域网里的电脑、平板、其他手机也能访问。这一步其实比很多人想象中简单因为Nginx默认就监听在0.0.0.0:80上也就是所有网络接口只要你手机和别的设备在同一个局域网理论上访问手机IP就能打开网页。5.1 查看手机IP并处理端口权限先查看手机在局域网里的IP地址。Termux里执行ifconfig或者ip -4 addr show一般来说WiFi连接的设备IP是192.168.x.x或10.x.x.x这样的C类地址。记下wlan0接口的inet地址例如192.168.1.8。另一台设备打开浏览器访问http://192.168.1.8/guestbook.php如果顺利能打开说明Nginx监听正常。但这里有一个常见的坑Android的8.0以上系统对普通应用直接监听80端口有严格限制吗严格说是有的Android认为80和443是保留端口普通应用如果没有权限绑定这些端口会失败。但你使用Termux时它本身不限制普通端口的监听80端口可能没问题也可能在个别机型上失败。如果你发现浏览器访问超时排查思路是先确认Nginx确实在监听netstat -tlnp看80端口状态如果监听正常但访问也失败试试把Nginx的监听端口改成8080。改端口只需要修改Nginx配置文件里的listen 80;为listen 8080;然后重载nginx -s reload访问地址变成http://192.168.1.8:8080/guestbook.php。我建议从一开始就直接用8080端口能避开不少Android系统的坑。如果手机用的是无线调试、热点分享等方式与其他设备连接访问IP会不太一样热点分享的场景下被连接设备分配的IP一般是192.168.43.x段视手机型号而定查一下连接设备的IP再访问就好。5.2 确保Termux在后台不被杀掉能访问了但这里又有个新的致命问题一旦你把App切到后台、锁屏几分钟再回来访问网站可能就挂了。那是因为Android系统为了省电把Termux进程杀掉了Nginx、PHP-FPM、MariaDB全跟着阵亡。解决办法是我踩了不少坑才总结出来的。首先在Termux里执行一次termux-wake-lock这个命令会让Termux申请一个唤醒锁让手机在锁屏状态下CPU仍然保持运行进程不会被系统休眠掉。注意每次Termux进程重启后都需要重新执行一次建议把它写进启动脚本里。其次还需要在系统层面把Termux设置为不受电池优化限制。在Android的「设置 - 应用 - Termux - 电池」里选择允许后台活动并关闭电池优化。不同手机厂商定义这个功能的名称不一样有的叫省电策略有的叫锁优化可能藏得比较深但总的原则是让Termux在后台保持活跃。我最早在MIUI系统上折腾时光找这个设置就花了好一会儿设置完之后进程不再动不动就消失了。还有一点非常实用给Termux应用加锁。在多任务界面把Termux的卡片下拉锁住这能防止部分系统的一键清理功能把它清掉。这样设置之后你的手机只要开机、联网、Termux在运行网站就始终是活的。我测试过一整夜锁屏第二天早上访问网站依然正常响应。5.3 如果要跨网络访问低成本的内网穿透思路如果想让手机上的网站不止在局域网内访问而是外面任意一个网络都能访问就涉及到内网穿透的问题。这里我不展开太多细节只提供一个思路和验证过的工具方案。我们可以使用frp、cloudflared这类隧道工具把手机本地端口映射到一台有公网IP的服务器或者通过cloudflared的隧道服务获取一个公网HTTPS域名。比如cloudflared可以在你的手机Ubuntu里执行cloudflared tunnel --url http://127.0.0.1:8080它会输出一个随机域名任何人通过这个域名都能访问到你的站点同时自带HTTPS加密。这个方法适合临时演示域名每次运行会变长期使用要绑定自己的域名。frp则适合你有一台云服务器的情况配置一个TCP隧道把服务器的公网端口转发到手机的8080端口。优点是稳定可控缺点是要求你有云服务器。关于这一部分我要特别提醒内网穿透工具只用于你自己的合法服务器和网站别拿来做任何其他用途。在使用隧道服务时也要遵守服务商的使用政策和当地法律法规。搭建个人网站、做学习演示完全没有问题。6. 连续跑两周以后我踩过的坑和优化建议环境能跑通不等于稳定。我把这套Termux Ubuntu的动态网站环境连续跑了差不多两周期间暴露了不少问题。这一节我把印象最深的几个坑和对应的解决方案完整写出来。6.1 端口10000和文件权限的困惑第一次启动Nginx时我在Termux里先创建了一个/var/www/html目录并尝试写入测试文件结果直接返回Permission denied。一开始我以为自己权限不足反复检查用户身份确认是在root用户下操作还是没权限。后来才发现在proot环境里文件系统的实际写入受限于Android应用的数据目录。具体来说proot虽然向你呈现了一个完整的Ubuntu文件系统但底层的rootfs文件存放在/data/data/com.termux/files/usr/var/lib/proot-distro/installed-rootfs/ubuntu这样的目录下所有文件操作最终还是要经过Android的文件权限检查。如果你试图操作rootfs之外的路径比如/sdcard可能会遇到权限问题。解决办法是网站根目录文件放在rootfs内部比如/var/www/html不要试图直接跨到/sdcard去读写如果需要和手机存储交换文件可以在Termux里执行termux-setup-storage授权存储访问然后通过/sdcard路径在Termux原生环境里操作再拷贝进Ubuntu。另外如果/var/www/html目录里文件太多导致写入慢可以考虑用htop看下内存占用——手机版Ubuntu环境默认没有配置swap内存不足时PHP-FPM可能会频繁重启报503。6.2 PHP-FPM频繁闪退的排查与修复跑了大概三天之后我发现网站偶尔会在访问时直接返回502 Bad Gateway。这个状态码的意思是Nginx把请求转发给了PHP-FPM但PHP-FPM没有响应或者崩溃了。我首先看了PHP-FPM的错误日志tail -f /var/log/php8.1-fpm.log日志里大批量出现WARNING: [pool www] server reached pm.max_children settings (5), consider raising it。原因很明确手机内存有限默认的pm.max_children是5任务一多进程就满了后面的请求只能排队排在队列外的请求直接失败。解决方法是修改PHP-FPM的进程管理配置让它更适应低内存环境。编辑/etc/php/8.1/fpm/pool.d/www.confpm ondemand pm.max_children 10 pm.process_idle_timeout 60s我改成ondemand模式的原因在于在这种模式下PHP-FPM不会一启动就占满内存而是在有请求时才动态创建子进程空闲超过60秒自动回收。这对手机的内存环境非常友好比默认的dynamic模式更能避免内存被占满。改完配置后重启php-fpmkill -USR2 $(cat /run/php-fpm.pid)实测一段时间后502出现的频率明显下降。6.3 数据备份一条命令打包整个Ubuntu手机随时可能没电、重启、误卸载应用所以在Ubuntu环境里做的所有配置和数据都面临丢失风险。我把数据备份这件事提醒排在所有优化之前你应该先建立一个习惯定期备份。因为整个Ubuntu就是一个rootfs目录备份的本质就是打包这个目录。最直接的方式是在Termux原生环境里执行tar -zcf ubuntu-backup.tar.gz -C $PREFIX/var/lib/proot-distro/installed-rootfs ubuntu这条命令把整个Ubuntu根文件系统压缩成一个tar.gz包。恢复时执行proot-distro remove ubuntu tar -zxf ubuntu-backup.tar.gz -C $PREFIX/var/lib/proot-distro/installed-rootfs proot-distro login ubuntu数据库数据的备份则是单独做一份。进入Ubuntu环境后执行mysqldump -u root -p --all-databases /root/all_databases_$(date %F).sql把这个SQL文件也打包进同一份tar包或者定期同步到云盘。备份这件事我建议每周做一次尤其是当你在上面已经积累了不小的工作成果之后。我有一天晚上不小心用rm -rf误删了一个项目目录幸好有备份不然整个星期的代码就没了。6.4 为长期运行做的几项小优化如果你打算把手机当成一台常开的微型服务器以下几个优化能明显提升稳定性第一给Termux设置开机自启动。Termux里创建一个.termux/boot目录放入一个启动脚本配合Termux:Boot插件可以让手机开机后自动启动Termux并执行脚本自动进入Ubuntu、启动Nginx、PHP-FPM和MariaDB。我写了一个简单的start_server.sh#!/data/data/com.termux/files/usr/bin/bash termux-wake-lock proot-distro login ubuntu -- bash -c nginx; php-fpm8.1 -D; mysqld_safe --skip-syslog 第二配置日志轮转。Nginx和PHP-FPM都会不断产生访问日志和错误日志时间长了会撑爆手机存储。Ubuntu的logrotate工具可以按天切割日志保留最近7天apt install logrotate -y配置放在/etc/logrotate.d/nginx里例如/var/log/nginx/*.log { daily rotate 7 compress missingok notifempty postrotate /usr/sbin/nginx -s reopen endscript }如果遇到logrotate无法正常工作也可以直接在Nginx配置里关闭不需要的access_log或者使用access_log off;来减轻IO压力。手机闪存寿命有限日志写太多并不是好事。第三限制PHP上传大小和内存。手机内存本来就不大PHP默认配置的memory_limit是128Mupload_max_filesize是2M。如果跑的是轻量应用可以把memory_limit降到64M防止某个脚本占用太多内存导致整机卡顿。在/etc/php/8.1/fpm/php.ini里修改即可。第四如果需要每天定时备份、定时清理临时文件可以安装cronapt install cron -y crontab -e然后添加一条凌晨3点的备份任务0 3 * * * mysqldump -u root -p密码 --all-databases | gzip /root/db_backup_$(date \%F).sql.gz这里注意cron在proot环境下同样没有systemd你需要先启动cron服务可以在登录Ubuntu后执行cron让它后台运行或者把它加进Termux的启动脚本里。6.5 性能数据手机跑动态网站到底行不行最后我放一组自己实测的数据给对性能有顾虑的朋友一个直观参考。测试机是一部多年前的中端安卓手机4GB内存CPU为骁龙660。在Termux proot环境下运行Ubuntu 22.04 Nginx PHP 8.1 MariaDB没有做任何特别的性能调优。用另一台电脑对整个网站根目录做并发请求压测参数是并发50持续30秒。结果是每秒处理约120到160个请求平均响应时间约280毫秒没有出现请求失败。这个性能对于个人博客、留言板、内部工具系统、学习Demo来说绰绰有余。但如果要做商城、高并发应用手机终归不是云服务器性能和稳定性都不在一个量级。指望手机跑大型生产网站不太现实但作为学习环境、低流量场景的演示服务器、或者是随时随地写代码调试的沙盒它绝对够用。我为什么要反复强调这一点因为很多教程把手机上跑Linux吹得神乎其神让新手误以为可以彻底取代云服务器。实际体验下来proot的性能损失主要来自系统调用翻译CPU密集型任务差距明显比如PHP的排序算法、图片处理这类操作会比较吃力。但普通的CRUD网站瓶颈根本不在CPU而在内存和IO。手机的内存通常有4到12GB跑一个小型Web服务是富余的。这套方案我用下来最大的收获其实不是免费的服务器而是打破了没有电脑就不能学服务端开发的限制。地铁上、咖啡馆里、午休时间只要有手机随时能打开一个真实可访问的Linux环境写代码、跑数据库、验证想法。手机上运行的Ubuntu并不只是一个模拟玩具在proot支持范围内它就是一套正儿八经的Linux系统。你在这套环境里面掌握的Nginx配置、数据库操作、Shell命令和在任何一台云服务器上做的事完全一样。等你以后真的有一台云服务器你会发现操作手感是零迁移成本的。最后再分享一个小技巧如果你在Termux里经常需要频繁进出Ubuntu环境可以在~/.bashrc里加一个别名减少敲字成本alias ubuntuproot-distro login ubuntu alias ubuntu-rootproot-distro login ubuntu --bind /sdcard:/mnt/sdcard第二条命令额外把手机的/sdcard目录挂载进了Ubuntu的/mnt/sdcard这样就能在Ubuntu环境里直接访问手机存储的文件传图片、导数据都方便很多。挂载参数--bind是proot-distro支持的用起来比在Termux和Ubuntu之间来回切换拷贝文件省事多了。
返回列表