旧手机改造成web服务器并实现内网穿透

前几天由于gitee的审核引擎一通乱杀,使得gitee pages停止提供服务,心生更换服务器或者其他pages托管的想法,看了看价格感人的云服务器以及空空的钱包,这时,脑子有个奇怪的想法飘过,自己搞一个服务器,忽然想起来,我有一台root的旧手机,刚好拿来做测试

前期准备

需要的工具:一台旧安卓手机(能获取root权限),能联网的电脑,并装有Git

需要安装的软件:Linux Deploy,BusyBox,JuiceSSH (可选),KSWEB (可选)

JuiceSSH执行命令速度比电脑快,不过是手机操作,可能需要外接键盘
以下操作全在电脑端操作,不演示JuiceSSH与Linux Deploy的连接 (教程见文末第三个链接)

需要的经验:部署过hexo博客,有一定git (或linux)基础,灵活运用关键字搜索,vim编辑器的使用语法

旧手机的基本信息

  • 手机型号:Redmi 3
  • Android版本:5.1.1
  • Linux发行版:CentOS 7 (AltArch) [running via Linux Deploy]
  • RAM:2.0GiB
  • CPU:8核1.5GHz
  • 储存空间:10GiB,可用4GiB

旧手机改造成web服务器并实现内网穿透

配置Linux环境

首先打开BusyBox,点击安装 (需要root权限)

然后打开Linux Deploy,点击右下方的配置,设置系统相关信息,容器类型选chroot,发行版选CentOS,如果选其他发行版,架构一定要选对,不然会安装出错,或者无法使用,安装之前一定要知道手机CPU的架构;源地址建议切换为国内源,这里放上中科大的镜像源 http://mirrors.ustc.edu.cn/centos-altarch/ ,国内还有其他源可选择,例如清华源,阿里源等

旧手机改造成web服务器并实现内网穿透

旧手机改造成web服务器并实现内网穿透

这里的设置很重要,一定要启用ssh,后面的步骤会用到 (SSH默认端口是22,此端口用于JuiceSSH连接)

旧手机改造成web服务器并实现内网穿透

然后返回主界面,点击左上,打开设置,建议前三个选项都勾上,往下滑,看到 PATH变量,输入 /system/xbin,再往下拉,把 调试模式 也勾上

旧手机改造成web服务器并实现内网穿透

再回到主界面,点击右上角,开始安装,大约要半小时

旧手机改造成web服务器并实现内网穿透

a few thousand years later……

旧手机改造成web服务器并实现内网穿透

看到手机输出 <<<deploy< code>&#x65F6;&#x8BF4;&#x660E;&#x5B89;&#x88C5;&#x5B8C;&#x6210;&#xFF0C;&#x542F;&#x52A8;&#x524D;&#x5148;&#x70B9;&#x51FB;&#x4E00;&#x6B21;&#x505C;&#x6B62;&#x6309;&#x94AE;&#xFF0C;&#x770B;&#x89C1;<code><<<stop< code>&#x65F6;&#x518D;&#x70B9;&#x51FB;&#x542F;&#x52A8;&#xFF0C;&#x770B;&#x89C1;&#x8F93;&#x51FA;&#x5982;&#x56FE;&#x5185;&#x5BB9;&#x65F6;&#x5373;&#x6210;&#x529F;&#x542F;&#x52A8;&#x3002;</stop<></code></deploy<>

旧手机改造成web服务器并实现内网穿透

然后打开KSWEB,查看当前手机的局域网ip,例如我手机的ip是192.168.101.10

旧手机改造成web服务器并实现内网穿透

然后打开电脑终端(cmd,git,wsl都可),输入 ssh admin@192.168.101.10,按照要求输入密码(前面的Linux Deploy配置里有密码的选项),如下图所示即成功连接手机

旧手机改造成web服务器并实现内网穿透

在服务器上部署

配置git

在服务器端安装git和node.js

yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel perl-devel
yum install -y git
curl -sL https://rpm.nodesource.com/setup_12.x | bash -
yum -y install nodejs

如果出现没做任何操作,下载自行终止并出现 Exiting on user cancel,可尝试输入

yum clean metadata
yum clean all
yum upgrade

如果出现 Failed to set locale, defaulting to C.UTF-8,是没有正确设置语言环境或者没安装相关语言包导致的,可尝试用两种解决方法

echo "export LC_ALL=en_US.UTF-8" >> /etc/profile
source /etc/profile

执行完后 重新登陆再试安装,若还出现这个情况,安装相应语言包

yum install glibc-langpack-zh //中文包

//英文包
dnf install glibc-langpack-en 或
dnf install langpacks-en glibc-all-langpacks -y

创建用户并配置其仓库

useradd git
passwd git // 设置密码
su git // 这步很重要,不切换用户后面会很麻烦
cd /home/git/
mkdir -p projects/blog // 项目存在的真实目录
mkdir repos && cd repos
git init --bare blog.git // 创建一个裸露的仓库
cd blog.git/hooks
vi post-receive // 创建 hook 钩子函数,输入了内容如下
#!/bin/sh
git --work-tree=/home/git/projects/blog --git-dir=/home/git/repos/blog.git checkout -f

添加完毕修改权限

chmod +x post-receive
exit // 退出到 root 登录
chown -R git:git /home/git/repos/blog.git // 添加权限

测试 git&#x4ED3;&#x5E93;是否可用,另找空白文件夹,在电脑端右键git bash here,输入

git clone git@server_ip:/home/git/repos/blog.git

旧手机改造成web服务器并实现内网穿透

如果能clone空仓库,说明git仓库搭建成功

建立ssh信任关系,在电脑输入以下命令

ssh-copy-id -i C:/Users/yourname/.ssh/id_rsa.pub git@server_ip
//如果用户名有空格,路径用引号括起来
ssh git@server_ip // 测试能否登录

注:此时的 ssh 登录 git 用户不需要密码!否则就有错,请仔细重复步骤 3-5

旧手机改造成web服务器并实现内网穿透

如图即成功添加信任

为了安全起见禁用 git 用户的 shell 登录权限,从而只能用 git clone,git push

cat /etc/shells // 查看 git-shell 是否在登录方式里面
which git-shell // 查看是否安装
vi /etc/shells
添加上2步显示出来的路劲,通常在 /usr/bin/git-shell

修改 /etc/passwd中的权限

// 将原来的
git:x:1000:1000::/home/git:/bin/bash

// 修改为
git:x:1000:1000:,,,:/home/git:/usr/bin/git-shell

旧手机改造成web服务器并实现内网穿透

需修改的内容一般在最后一行,数字不用改,只需添加半角逗号和改路径即可

搭建nginx服务器

下载并安装nginx

cd /usr/local/src
wget http://nginx.org/download/nginx-1.15.2.tar.gz
tar xzvf nginx-1.15.2.tar.gz
cd nginx-1.15.2

// 执行之前先检查是否有安装gcc gdb gcc-c++ make wget这五个软件,没有的话不能进行下一步,可直接用yum命令安装

./configure // 如果后面还想要配置 SSL 协议,就执行后面一句!
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-file-aio --with-http_realip_module
make && make install
alias nginx='/usr/local/nginx/sbin/nginx' // 为 nginx 取别名,后面可直接用,重新登陆后失效

配置nginx文件

先启动是否安装成功

nginx // 直接来!浏览器查看 server_ip,默认是 80 端口

修改配置文件

nginx -s stop // 先停止nginx
cd /usr/local/nginx/conf
vi nginx.conf
修改 root 解析路径,如下图
同时将 user 改为 root 如下图,不然nginx无法访问 /home/git/projects/blog
nginx -s reload

旧手机改造成web服务器并实现内网穿透

需要修改第一个箭头所指的nobody,第二个箭头所指的是会产生bug的文件

旧手机改造成web服务器并实现内网穿透

需要修改root的路径为博客位置,例如我之前设置的位置是 /home/git/projects/blog,就把这个路径替换进去,注意不要漏了句尾的分号

在修改配置文件这里目测有坑,会出现 /usr/local/nginx/logs/nginx.pid failed这样的字眼,打开 /usr/local/nginx/logs,输入 ls -al,没看见有 nginx.pid,我的解决方法是输入这个
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf,再输入 ls -al,发现 nginx.pid出现了,再次运行 nginx -s reload,没有报错。

在这里,可以测试下部署在服务器的网页,不过只能实现局域网查。注意上图中有一个 listen 80,这是一个设置在localhost的端口,可尝试在浏览器打开预览,不过建议换成其他端口,避免端口被占用无法预览,这里我换成800,可成功预览

⚠️

别忘了启动nginx,不然不能预览页面

在手机浏览器输入 127.0.0.1:800192.168.101.10:800可以预览

旧手机改造成web服务器并实现内网穿透
在同一局域网的电脑输入 192.168.101.10:800即可预览

旧手机改造成web服务器并实现内网穿透

发布

配置 _config.yml 文件

编辑deploy属性

旧手机改造成web服务器并实现内网穿透

repo是推送到的目的地地址

推送到服务器

使用 hexo d -ghexo g- d均可,如图即成功推送

旧手机改造成web服务器并实现内网穿透

内网穿透

内网穿透有很多工具,常见的有花生壳,FRP,ngork。由于花生壳的价格过于感人,FRP需要另一台有公网ip的服务器,这里使用基于ngork的natapp

官网:https://natapp.cn (快来打钱doge)

这里需要在Linux安装,安装方法用wget + Linux安装包,由于我不知道wget会保存到哪里,所以我在wget后加了一个指定路径

wget -P /home/git/ https://cdn.natapp.cn/assets/downloads/clients/2_3_9/natapp_linux_arm64/natapp?version=20190730

下载之后对安装包重命名

mv natapp?version=20190730 natapp

在root下先给予执行权限再执行

chmod a+x natapp
./natapp

直接运行 ./natapp还不能运行程序,这里需要加上创建的隧道的authtoken参数才能打开

./natapp -authtoken=

运行程序后,图中的网址已穿透内网,可对外访问 (这是个临时链接)

旧手机改造成web服务器并实现内网穿透

旧手机改造成web服务器并实现内网穿透

到这里,一个web私人服务器就搭好了。

另外,关于穿透的网址,natapp有一个付费隧道可以绑定自定义域名,每个月9¥,而花生壳那边的价格比较感人 (还花了6¥开启https穿透的认证,发现没什么luan用,我*&%@),最终还是选择了natapp

不过,我还是选择GitHub Pages + Netlify 来配置我的网站,私人服务器跑网页,需要让服务器24h保持运作状态 (感觉也废不了什么电费),毕竟通过隧道来访问网站的速度和直接托管在GitHub Pages差不多,干脆直接用GitHub Pages比较省事

除了网页服务器,旧手机理论上也可以建一个私人网盘 (感觉也没时间整了)

参考链接

原文出处旧手机改造成web服务器并实现内网穿透 | Jayden’s Blog

旧手机搭建网站以及内网穿透 – Dark’s blog (ii.do)

带你跳过各种坑,一次性把 Hexo 博客部署到自己的服务器_jeffery5461的博客-CSDN博客_

使用Linux Deploy将闲置的安卓手机改造简易服务器 – sw-code – 博客园 (cnblogs.com)

超详细Hexo+Github Page搭建技术博客教程【持续更新】 – SegmentFault 思否

[解决nginx: [error] open() "/usr/local/nginx/logs/nginx.pid" failed错误_三也先生的博客-CSDN博客]

centos 7 升级后yum install出现Exiting on user cancel-阿里云开发者社区 (aliyun.com)

Failed to set locale, defaulting to C.UTF-8 – 天军 – 博客园 (cnblogs.com)

把hexo博客部署到服务器 | MX (mx142.cn)

Original: https://www.cnblogs.com/jaydenchang/p/15192605.html
Author: JaydenChang
Title: 旧手机改造成web服务器并实现内网穿透

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/585166/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • JVM集合之开篇点题

    大家在平时的开发过程中是否遇到过 StackOverflowError、 OutOfMemoryError等类似的内存溢出错误呢?大家又是怎么解决这个问题的?再来,大家在面试过程中…

    Java 2023年6月5日
    086
  • 一、mybatis入门案例

    今天学习了mybatis框架,简单记录一下mybatis第一个入门案例,目标是使用Mybatis作为持久层框架,执行查询数据的SQL语句并且获取结果集 基本步骤: 物理建模 逻辑建…

    Java 2023年6月16日
    098
  • 低版本spring-cloud-sleuth的TraceableExecutorService一个坑,注意绕行

    我们知道Java 线程池提交任务有两种: 1,submit 会抛出异常,会有异常日志 2,execute 没有抛出异常,需要执行返回值Future的get方法触发抛出异常 exec…

    Java 2023年6月14日
    0101
  • 空闲时间研究一个小功能:winform桌面程序如何实现动态更换桌面图标

    今天休息在家,由于天气热再加上疫情原因,就在家里呆着,空闲时想着,在很早以前(约3年前),产品人员跟我提了一个需求,那就是winform桌面程序的图标能否根据节日动态更换,这种需求…

    Java 2023年6月9日
    0111
  • Spring Boot:整合Spring Security

    综合概述 Spring Security 是 Spring 社区的一个顶级项目,也是 Spring Boot 官方推荐使用的安全框架。除了常规的认证(Authentication)…

    Java 2023年5月30日
    083
  • Java开发学习(九)—-IOC之核心容器

    这里所说的核心容器,大家可以把它简单的理解为 ApplicationContext,前面虽然已经用到过,但是并没有系统的介绍过,接下来咱们从以下几个问题入手来下容器的相关知识: 如…

    Java 2023年5月29日
    070
  • 最简单的设计模式——单例模式的演进和推荐写法(Java 版)

    前言 如下是之前总结的 C++ 版的;软件开发常用设计模式—单例模式总结(c++版),对比发现 Java 实现的单例模式和 C++ 的在线程安全上还是有些区别的。 概念不多说,没意…

    Java 2023年5月29日
    099
  • synchronized

    线程锁 1.1synchronized的认识 1.1.1synchronized的介绍 在多线程并发编程中,synchronized关键字是重量级锁的代名词。但是,随着JDK的发展…

    Java 2023年6月7日
    080
  • Kafka 基础概念及架构

    一、Kafka 介绍 Kafka是⼀个分布式、分区的、多副本的、多⽣产者、多订阅者,基于zookeeper协调的分布式⽇志系统(也可以当做MQ系统),常⻅可以⽤于web/nginx…

    Java 2023年6月5日
    091
  • Pydantic如何分离field和alias

    即假如需要返回的是: { "isStar": ture } 在python中一般不使用 isStar这种命名方式, 所以我们需要使用别名定义模型: class …

    Java 2023年6月7日
    072
  • Swagger以及knife4j的基本使用

    Swagger 介绍: Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化RESTful风格的 Web 服务 RESTful是一种架构的规范与约束、原则,符合这种…

    Java 2023年6月14日
    069
  • Linux 用户及组相关命令

    与用户相关的配置文件:/etc/passwd: #用户的配置文件, 保存用户账户的基本信息/etc/shadow #用户影子口令文件 一、用户帐号文件——passwd 1.&#82…

    Java 2023年6月7日
    066
  • java实现冒泡排序-通俗易懂

    自己写的笔记可能有不对的地方,希望大佬指正!先说思路假设有一个数组是 arr = [24, 69, 80, 57, 13],分别对应的下标是 [0, 1, 2, 3, 4]现在需要…

    Java 2023年6月13日
    045
  • 如果Controller里有私有的方法,能成功访问吗?

    背景 原因 cglib代理的锅 换成JDK动态代理呢 参考 背景 写代码的时候,复制粘贴的时候,没注意到方法的属性,就导致了Controller里有了一个私有的方法,然后访问这个接…

    Java 2023年6月8日
    093
  • 根据子类查询父类

    1.如果改子类有父类,则把父类加入子类的父ID中 private static List breadthParentFirst(List rootTree) { if (Colle…

    Java 2023年6月16日
    057
  • springboot如何使用自定义配置文件

    从前边《springboot竟然有5种默认的加载路径,你未必都知道》我们知道,springboot会默认加载application.properties/application.y…

    Java 2023年6月9日
    088
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球