MENU

将手机内网穿透当作服务器并运行了几个项目

September 24, 2020 • Read: 291 • 杂谈

几个月没发新文章了,主要是因为我将大量精力投入了《Edge使用文档》的维护之中,修改了大概几百次了吧。与此同时我也玩了很多新的项目,积累了很多新的东西,现在可以发出来了。

一、背景介绍

这篇文章记录了我折腾这些项目的过程及经验,主要是为了方便自己阅读,属于实际应用层面,需要对Linux和termux有基础了解。所以对大佬来说过于基础,对于小白来说又可能看不懂。
我并非一口气就能折腾这么多东西的,而是发现一个东西捣鼓一段时间后,又发现新的东西,而新的又与旧的有联系,新旧滚雪球似的联系到了一起。
现在来记一笔流水账:

  • 最初的起源是捣鼓租的云服务器搭博客网站;
  • 然后发现了在手机上利用ksweb和SakuraFrp进行内网穿透搭网站的教程;
  • 接着发现了白嫖office365 E5全局管理员账号及利用github actions自动执行python续期脚本的教程;
  • 又接着尝试了一些自建网盘程序,比如Oneindex、OneManager、PyOne、cloudreve、可道云……等等;
  • 然后又发现了在安卓手机上利用termux安装Linux及搭建网站的教程;

…………

所以本文的内容庞杂无比,没有接触过相关项目可能一头雾水。
由于ksweb经常被杀后台,即使赋予全部权限、忽略电池优化、加入手机管家白名单、允许自启,仍然动不动就挂了,甚至在亮屏状态都能被杀掉,而termux在后台运行稳定,我忍无可忍,尽可能的把这些东西往termux上搬,目前已经实现了以下项目:

  • Centos子系统,用来启动每个网站的内网穿透客户端及cloudreve客户端;
  • 定时执行的计划任务机制及进程崩溃后自动重启的进程守护机制;
  • WordPress博客网站,不过变成了导航站,挂了手机上搭的一些小工具网站,这些小网站放在WordPress安装目录因此通过同一个域名就可以进入;
  • 可道云网盘,专门用来读取termux安装目录下的文件,修改配置什么的很方便,而且有webdav功能;
  • cloudreve网盘程序,用来挂载onedrive,稍微鸡肋了点,只能读取经过它上传到onedrive的文件,即在它的数据库中有记录的文件,也看中它的webdav功能,目前用来同步纯纯写作的文章,数据在本地和onedrive都有备份,不太容易丢失;
  • 定时执行用来玄学续期office365 E5的python脚本;

实现的项目

手机是老掉牙的华为畅享6,买了近4年了,屏幕高频率闪烁大概离坏掉不远了。我对于手机刷机是没什么经验的,到目前为止只是解了BL锁,在淘宝问了一圈能不能root都说搞不了╮( ̄▽ ̄")╭ ,而手机不能root意味着1024及以下端口全都用不了,不然我还能搞更多的东西出来。其实我也尝试过装宝塔面板来着,都装上了而且内网穿透之后能远程访问了,而nginx启动不了各种报错。

二、前提条件

这是我目前的情况:

  • 一个高速的代理工具,如果没有代理工具而且系统不换源,那么在线安装Linux软件寸步难行,安装国外来源的软件必须得开启代理,当然可以配置PAC模式自动代理;
  • SakuraFrp上注册并实名认证,创建相应的网站隧道。这是目前最实惠的内网穿透服务平台,在用户信息菜单中获取自己的访问秘钥,任何情况下都不能泄露访问秘钥,通过签到获得服务器流量,没有备案的域名只能使用国外节点服务器,速度难顶;
  • 一个域名,并非必须备案,但备案后可以很方便的使用各种云服务,将域名解析到SakuraFrp中创建的隧道域名或ip上;
  • mix文件管理器,获取文件路径、编辑配置文件很方便,在文件属性中点击文件路径一键复制文件路径,用代码编辑器编辑文件方便缩进,还可以挂载onedrive、webdav等,很多特性足以写一篇很长的说明文章;
  • termux下载地址:Google PlayF-Droid酷安。其中酷安的已停更很久。以及了解termux的基本操作:Termux 高级终端安装使用配置教程

三、termux文件体系

如果在termux里面安装了linux子系统,那么termux文件体系包含三个方面:termux本身文件体系手机储存文件体系linux子系统文件体系
termux本身文件体系也就是termux安装目录。按照数学集合关系解释的话,termux本身文件体系手机储存文件体系互相独立,linux子系统文件体系termux本身文件体系的子集。
termux可以很顺利的读取这三个文件系统,但在手机储存文件体系中执行任务受限,如解压。
linux子系统无法或者不方便读取termux本身文件体系中除自己的的文件、手机储存文件体系。就像虚拟机中的系统读取真机的文件,很麻烦。
所以在termux中直接安装软件的配置文件放在手机储存中方便处理一些,而在linux子系统中安装软件的配置文件最好就放在linux子系统home目录中。
以Centos为例,启动termux后新建centos文件夹并在这个文件夹中安装centos,那么在可道云中,从termux读取到Centos子系统root目录的路径就是:

/home/centos/centos-fs/root

即启动termux后所在的路径为termux的home文件夹,在termux中启动Centos后的路径就是Centos的root文件夹。

赋予termux读取手机储存权限:手动在手机应用管理界面开启,或执行以下命令后允许提示:

termux-setup-storage

直接cd在文件管理器中复制的路径就可以读取手机储存种的文件。
首次打开termux后的界面、或直接执行cd命令,使用pwd命令查看当前目录结构:

/data/data/com.termux/files/home

对于整个安卓环境而言,/data/data/com.termux为termux安装路径,
对于termux而言,/home为其根目录,首次打开termux并创建的文件存放于此处,相当于Linux的/root/文件夹。
执行cd $PREFIX,使用pwd命令查看当前目录结构:

/data/data/com.termux/files/usr

即为termux的/usr目录,相当于Linux的/usr/目录。
执行ls命令显示当前目录存在的文件及文件夹,执行ls -lh显示文件及文件夹的详细信息。

四、配置网站环境

1、换源

非必要步骤,将软件源换为国内能提高软件安装速度,但可能存在兼容性问题。执行以下命令换为清华源:

sed -i 's@^\(deb.*stable main\)$@#\1\ndeb https://mirrors.tuna.tsinghua.edu.cn/termux/termux-packages-24 stable main@' $PREFIX/etc/apt/sources.list

sed -i 's@^\(deb.*games stable\)$@#\1\ndeb https://mirrors.tuna.tsinghua.edu.cn/termux/game-packages-24 games stable@' $PREFIX/etc/apt/sources.list.d/game.list

sed -i 's@^\(deb.*science stable\)$@#\1\ndeb https://mirrors.tuna.tsinghua.edu.cn/termux/science-packages-24 science stable@' $PREFIX/etc/apt/sources.list.d/science.list

pkg update

若换源后出现软件安装报错等情况,那么就是软件或者手机存在兼容性问题,清空软件数据后老老实实的的从内置源安装软件。我的华为畅享6就是这种情况,系统为安卓6,无法安装最新版的termux所以从酷安下载的旧版本,而我的另一台realmeX换源后可正常安装软件,系统为安卓10,从Google Play安装的最新版termux。

2、安装三件套

安装LNMP三件套及常用组件,执行pkg install命令安装:

pkg install nginx -y &&
pkg install mariadb -y &&
pkg install php -y &&
pkg install php-fpm -y &&
pkg install vim -y

3、配置nginx

进入nginx配置文件存放目录:

cd $PREFIX/etc/nginx/

备份nginx配置文件,复制并重命名:

cp nginx.conf bnginx.conf

为了方便编辑将整个配置转移到手机储存且可道云可以读取的目录,用txt文件作为配置文件而不再使用conf文件,这样使用可道云或文件管理器都可以编辑。
在mix文件管理器中创建相应文件夹及nginx.txt文件后,根据备份的bnginx.conf填写配置:

nginx配置文件

worker_processes  1;
events {
    worker_connections  1024;
}

######http段开始######
http {
    include      mime.types;
    default_type application/octet-stream;
    sendfile     on;
    keepalive_timeout 65;

######可道云开始######
    server {
        listen 8080 ssl;    
        server_name  kod.chirmyram.top;
        ssl_certificate      /storage/3461-3833/htdocs/kod/files/ssl/crt.pem;
        ssl_certificate_key  /storage/3461-3833/htdocs/kod/files/ssl/key.pem;
        ssl_session_cache  
        shared:SSL:1m;          
        ssl_session_timeout  5m;
        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;

        location / {
            root   /storage/3461-3833/htdocs/kod;
            index  index.html index.htm index.php;
            ######可道云伪静态
            if (!-e $request_filename){
            rewrite  ^(.*)$  /index.php?s=$1  last;   break;
            } 
        }
        
        location ~ \.php$ {
            root html;
            fastcgi_pass   127.0.0.1:9000;      
            fastcgi_index  index.php;         
            fastcgi_param  SCRIPT_FILENAME  /storage/3461-3833/htdocs/kod$fastcgi_script_name;    
            include fastcgi_params;   
            }
        }
######可道云结束######

######博客网站开始######
    server {
        listen 8089;  
        server_name sj.chirmyram.top;
        rewrite ^(.*) https://$server_name$1 permanent; 
        }
           
    server {
        listen 8090 ssl;    
        server_name  sj.chirmyram.top;
        ssl_certificate  /storage/3461-3833/htdocs/kod/files/ssl/crt.pem;
        ssl_certificate_key  /storage/3461-3833/htdocs/kod/files/ssl/key.pem;
        ssl_session_cache  
        shared:SSL:1m;          
        ssl_session_timeout  5m;
        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;
        ######原链接重定向
        rewrite /archives/sitelist https://sj.chirmyram.top/$1 permanent;


        location / {
            root  /storage/3461-3833/htdocs/sjweb;
            index  index.html index.htm index.php;
            ######WordPress伪静态
            try_files $uri $uri/ /index.php?$args;
            }
            ######WordPress后台伪静态
            rewrite /wp-admin$ $scheme://$host$uri/ permanent;

        location ~ \.php$ {
            root html;
            fastcgi_pass   127.0.0.1:9000;      
            fastcgi_index  index.php;         
            fastcgi_param  SCRIPT_FILENAME  /storage/3461-3833/htdocs/sjweb$fastcgi_script_name;    
            include  fastcgi_params;   
            }
        }
######博客网站结束######

######cloudreve网盘开始######
    server {
        listen 4999;  
        server_name cd.chirmyram.top;
        rewrite ^(.*) https://$server_name$1 permanent;
        }
        
    server {
        listen 5000 ssl;
        server_name cd.chirmyram.top;
        ssl_certificate /storage/3461-3833/htdocs/kod/files/ssl/crt.pem;
        ssl_certificate_key /storage/3461-3833/htdocs/kod/files/ssl/key.pem;
        ssl_session_cache  
        shared:SSL:1m;          
        ssl_session_timeout  5m;
        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;
        access_log off;

        location / {
            proxy_pass http://127.0.0.1:5001;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            }
        }
######cloudreve网盘结束######

######守护进程开始######
    server {
        listen 3999;
        server_name su.chirmyram.top;
        rewrite ^(.*) https://$server_name$1 permanent; 
        }

    server {
        listen 4000 ssl;
        server_name su.chirmyram.top;
        ssl_certificate /storage/3461-3833/htdocs/kod/files/ssl/crt.pem;
        ssl_certificate_key /storage/3461-3833/htdocs/kod/files/ssl/key.pem;
        ssl_session_cache  
        shared:SSL:1m;          
        ssl_session_timeout  5m;
        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;
        access_log off;

        location / {
            proxy_pass http://127.0.0.1:4001;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            }
        }
######进程守护结束######
       
}
######http段结束######

配置文件主要包含三部分,http、server、location,依次向下包含,注意花括号{}的配对数量一定要对。
查看nginx.txt的属性并复制其路径,回到termux中,由于vim编辑器不方便全选删除,为方便编辑所以利用rm命令删除原nginx配置文件,利用touch命令新建一个,再利用vim编辑:

rm nginx.conf
touch nginx.conf
vim nginx.conf

调出输入法键盘按i进入编辑模式,利用include读取手机储存配置文件,输入include和空格后粘贴刚刚复制的nginx.txt路径,注意最后输入英文分号结尾:

include /storage/3461-3833/htdocs/kod/files/nginx.txt;

ESC退出编辑模式,执行:wq保存更改内容并退出。
重载nginx配置:

nginx -s reload

4、配置mariadb

登录mariadb:

mysql -u $(whoami)

修改root用户的密码:

use mysql;
set password for 'root'@'localhost' = password('你的密码');

刷新权限并退出:

flush privileges;
quit;

5、配置nginx解析php

进入php-fpm配置目录修改配置文件:

cd $PREFIX/etc/php-fpm.d
vim www.conf

在第36行,不同版本可能不同,将listen后面的路径改为本地9000端口:

listen = /data/data/com.termux/files/usr/var/run/php-fpm.sock
to:
listen = 127.0.0.1:9000

6、启动三件套

执行以下命令:

nginx
php-fpm
nohup mysqld &

至此搭建网站的环境配置完毕。

五、安装Linux

termux虽然能模拟Linux终端,却并不兼容所有Linux软件,所以想要以更好的兼容性运行Linux软件还是得安装Linux子系统,但由于手机性能原因,安装的Linux依然是精简的。我选择安装Centos是因为它的软件源丰富,能够满足基本使用,而其他系统换源又很麻烦,也可能导致兼容性问题。
避免文件散乱难以整理,使用mkdir命令新建一个名为centos的文件夹:

mkdir centos

1、安装Centos

选择AnLinux这款软件提供的脚本安装,因为启动很简单。
AnLinux软件下载:Google PlayF-Droid.选择系统后复制脚本命令到termux执行:

pkg install wget openssl-tool proot tar -y && hash -r && wget https://raw.githubusercontent.com/EXALAB/AnLinux-Resources/master/Scripts/Installer/CentOS/centos.sh && bash centos.sh

使用./命令执行启动脚本,启动Centos:

./start-centos.sh

Centos默认时区的时间比北京时间晚8小时,试了很多方法改时区但重启后都会失效,不得已只能在启动命令后再加上更改时区的命令:

export TZ='Asia/Shanghai'

安装自己所需组件:

yum -y install sudo wget vim python3 cronie
pip3 install requests

精简的Centos连sudo命令都没有,这个命令很常用当然得安上,wget用于下载文件,vim用于编辑文档,python用于执行脚本,cronie用于执行定时任务。我想要执行的python脚本还需要requests库,再安装requests。
由于linux版的frp客户端老是自己掉线,掉线了还得手动启动,就很麻烦,被这玩意儿折磨惨了,于是想着加个进程守护让它崩溃后自动重启,而且可以一次性启动多个客户端,不用在termux里面开多个会话窗口单独启动各个任务,大幅降低内存占用。稍微瞄了一眼supervisor手动配置,看起来好麻烦的样子,想装宝塔面板再装supervisor,我太依赖图形界面了,但因兼容问题宝塔安装出错,而且过于小题大做了,最后实在没办法了还是硬着头皮还是手动配置supervisor,果然强烈的需求才是进步的动力∠( ᐛ 」∠)_。
yum list命令可以看到精简版Centos仓库源没有supervisor,解决办法为安装epel软件库:

yum install epel-release -y
yum install supervisor

为方便管理将所有客户端及配置文件放到home目录,在home目录建立supervisor文件夹并生成配置文件:

mkdir /home/supervisor
echo_supervisord_conf > /home/supervisor/supervisord.conf

直接运行echo_supervisord_conf会在/etc目录中生成配置文件。
编辑配置文件一度让我头大,运行的客户端命令不是./而是文件路径,蒙了好久,看了有关cloudereve设置宝塔进程守护的教程才明白该怎么设置。
编辑好的配置文件:

supervisor配置文件

[inet_http_server]
port=0.0.0.0:4001  ;默认配置只能本地访问,配置成0.0.0.0可以通过外部查看监控界面
username=账户名字
password=账户密码

[supervisord]
logfile=/home/supervisor/supervisord.log  ; (main log file;default $CWD/supervisord.log)
logfile_maxbytes=10KB       ; (max main logfile bytes b4 rotation;default 50MB)
logfile_backups=10          ; (num of main logfile rotation backups;default 10)
loglevel=info               ; (log level;default info; others: debug,warn,trace)
pidfile=/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
nodaemon=false              ; (start in foreground if true;default false)
minfds=1024                 ; (min. avail startup file descriptors;default 1024)
minprocs=200                ; (min. avail process descriptors;default 200)

[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

[supervisorctl]
serverurl=unix:///run/supervisor/supervisor.sock ; use a unix:// URL  for a unix socket
serverurl=http://127.0.0.1:4001
username=账户名字              ; should be same as http_username if set
password=账户密码                ; should be same as http_password if set

[program:sjweb]     ;进程名
command = /home/sjweb/frpc ;运行的命令
directory = /home/sjweb/   ;运行命令所在的文件夹
stdout_logfile = /home/sjweb/frpc.log  ;日志打印文件位置
autostart = true   ;是否设置启动后自动启进程
startsecs = 5 ;设置启动后几秒开始启进程
autorestart = true  ;是否自动重启
startretries = 9999999     ;重启次数
stdout_logfile_maxbytes = 10KB   ;日志最大容量,达到后新建一个日志文件

[program:kod]
command = /home/kod/frpc
directory = /home/kod/
stdout_logfile = /home/kod/frpc.log
autostart = true
startsecs = 5
autorestart = true
startretries = 9999999
stdout_logfile_maxbytes = 10KB

[program:cd]
command = /home/cd/frp/frpc
directory = /home/cd/frp/
stdout_logfile = /home/cd/frp/frpc.log
autostart = true
startsecs = 5
autorestart = true
startretries = 9999999
stdout_logfile_maxbytes = 10KB

[program:cloudreve]
command = /home/cd/cd/cloudreve
directory = /home/cd/cd/
stdout_logfile = /home/cd/cd/cloudereve.log
autostart = true
startsecs = 5
autorestart = true
startretries = 9999999
stdout_logfile_maxbytes = 10KB

[program:super]
command = /home/super/frpc
directory = /home/super/
stdout_logfile = /home/super/frpc.log
autostart = true
startsecs = 5
autorestart = true
startretries = 9999999
stdout_logfile_maxbytes = 10KB

启动supervisor:

supervisord -c /home/supervisor/supervisord.conf

supervisor有web管理界面,默认端口为9001,设置登入账户及密码,配置nginx反向代理就可以用个域名实现网页端图形可视化管理。
supervisor

2、内网穿透

为避免文件混乱,依然用mkdir为每个网站的frp客户端新建一个文件夹,下载SakuraFrp的客户端并赋予执行权限,为方便启动将客户端重命名为frpc,最后启动。下好第一个赋予执行权限后复制到其他文件夹不再需要赋予执行权限。

mkdir /home/sjweb
cd /home/sjweb
wget https://qianqu.me/frp/frpc_linux_arm64 && chmod -R 777 frpc_linux_arm64
mv frpc_linux_arm64 frpc
./frpc

启动客户端后显示UI界面,点击Token后面的输入框,粘贴从SakuraFrp用户信息里面获取的访问秘钥,点击Login即可显示已经创建的隧道,点击单个隧道选中后字体变为绿色,按Ctrl+C启动隧道。如果同一个节点地区有多条隧道,点击地区名可同时选中多条隧道并同时启动。
SakuraFrp客户端启动后,会自动在当前目录生成名为客户端名.ini的配置文件,二次启动客户端时会直接读取配置文件启动。若需更换隧道,按Ctrl+C终止当前客户端,编辑配置文件重新启动,当然来的更快的就是直接删掉配置文件重新登录客户端。
由于网络环境不稳定等原因,二次启动客户端时可能失败,可多次尝试。

3、计划任务

按照原项目AutoApi的习惯,在Centos根目录下创建了一个名为1的文件夹,进入1文件夹,创建1.txt文件将获取的refresh _token填进去。
修改python脚本1.py第12行和第14行填入自己的应用ID和秘钥:

python脚本

# -*- coding: UTF-8 -*-
import requests as req
import json,sys,time
#先注册azure应用,确保应用有以下权限:
#files:    Files.Read.All、Files.ReadWrite.All、Sites.Read.All、Sites.ReadWrite.All
#user:    User.Read.All、User.ReadWrite.All、Directory.Read.All、Directory.ReadWrite.All
#mail:  Mail.Read、Mail.ReadWrite、MailboxSettings.Read、MailboxSettings.ReadWrite
#注册后一定要再点代表xxx授予管理员同意,否则outlook api无法调用

###################################################################
#把下方单引号内的内容改为你的应用id                                         #
id=r'你的id'                         
#把下方单引号内的内容改为你的应用机密                                       #
secret=r'你的机密'                                           
###################################################################

path=sys.path[0]+r'/1.txt'
num1 = 0

def gettoken(refresh_token):
    headers={'Content-Type':'application/x-www-form-urlencoded'
            }
    data={'grant_type': 'refresh_token',
          'refresh_token': refresh_token,
          'client_id':id,
          'client_secret':secret,
          'redirect_uri':'http://localhost:53682/'
         }
    html = req.post('https://login.microsoftonline.com/common/oauth2/v2.0/token',data=data,headers=headers)
    jsontxt = json.loads(html.text)
    refresh_token = jsontxt['refresh_token']
    access_token = jsontxt['access_token']
    with open(path, 'w+') as f:
        f.write(refresh_token)
    return access_token
def main():
    fo = open(path, "r+")
    refresh_token = fo.read()
    fo.close()
    global num1
    access_token=gettoken(refresh_token)
    headers={
    'Authorization':access_token,
    'Content-Type':'application/json'
    }
    try:
        if req.get(r'https://graph.microsoft.com/v1.0/me/drive/root',headers=headers).status_code == 200:
            num1+=1
            print("1调用成功"+str(num1)+'次')
        if req.get(r'https://graph.microsoft.com/v1.0/me/drive',headers=headers).status_code == 200:
            num1+=1
            print("2调用成功"+str(num1)+'次')
        if req.get(r'https://graph.microsoft.com/v1.0/drive/root',headers=headers).status_code == 200:
            num1+=1
            print('3调用成功'+str(num1)+'次')
        if req.get(r'https://graph.microsoft.com/v1.0/users ',headers=headers).status_code == 200:
            num1+=1
            print('4调用成功'+str(num1)+'次')
        if req.get(r'https://graph.microsoft.com/v1.0/me/messages',headers=headers).status_code == 200:
            num1+=1
            print('5调用成功'+str(num1)+'次')    
        if req.get(r'https://graph.microsoft.com/v1.0/me/mailFolders/inbox/messageRules',headers=headers).status_code == 200:
            num1+=1
            print('6调用成功'+str(num1)+'次')    
        if req.get(r'https://graph.microsoft.com/v1.0/me/mailFolders/inbox/messageRules',headers=headers).status_code == 200:
            num1+=1
            print('7调用成功'+str(num1)+'次')
        if req.get(r'https://graph.microsoft.com/v1.0/me/drive/root/children',headers=headers).status_code == 200:
            num1+=1
            print('8调用成功'+str(num1)+'次')
        if req.get(r'https://api.powerbi.com/v1.0/myorg/apps',headers=headers).status_code == 200:
            num1+=1
            print('8调用成功'+str(num1)+'次') 
        if req.get(r'https://graph.microsoft.com/v1.0/me/mailFolders',headers=headers).status_code == 200:
            num1+=1
            print('9调用成功'+str(num1)+'次')
        if req.get(r'https://graph.microsoft.com/v1.0/me/outlook/masterCategories',headers=headers).status_code == 200:
            num1+=1
            print('10调用成功'+str(num1)+'次')
            print('结束时间为 : '+time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
    except:
        print("pass")
        pass
for _ in range(3):
    main()

由于原脚本中调用的库在python3中已改名,而且在现在的环境中执行不能输出执行时间,于是我稍微改了下后面的时间输出。
新建一个名为1.cron的文件(当然cron这个格式是我自定义的)填入定时任务配置:

*/5 * * * * python3 /home/1/1.py >> /home/1/1.log 2>&1
0 * * * * sudo rm /home/1/1.log
0 * * * * sudo rm /home/supervisor/supervisord.log /home/supervisor/supervisord.log.*
0 * * * * sudo rm /home/sjweb/frpc.log /home/sjweb/frpc.log.*
0 * * * * sudo rm /home/kod/frpc.log /home/kod/frpc.log.*
0 * * * * sudo rm /home/cd/frp/frpc.log /home/cd/frp/frpc.log.*
0 * * * * sudo rm /home/cd/cd/cloudereve.log /home/cd/cd/cloudereve.log.*
0 * * * * sudo rm /home/super/frpc.log /home/super/frpc.log.*

第一行任务为每五分钟执行一次python脚本并将日志输出到同目录的1.log文件中,第二行为每小时清理一次python脚本输出的日志,剩下的都是每小时清理一次supervisor的日志,不然日志越来越多很麻烦,为了顺眼就把清理同一目录日志文件的命令放到同一行来写,通过观察日志写入情况来监控运行状态。虽然启动Centos的同时也改了时区,但python日志中记录的时间仍然晚8小时,目前还没找到有效解决办法。
将1.cron设为cronie定时任务:

crontab home/1/1.cron

cronie有以下常用命令:

crontab -l #查看当前已有定时任务
crontab -r #删除已有定时任务

回到Centos根目录,启动计划任务:

crond start

4、综合启动

我将以下命令存放于QQ输入法云剪贴板中,每次需要启动时只需要粘贴进去执行就行,算是比较方便。

nginx ;
php-fpm ;
mysqld &
cd centos ;
./start-centos.sh 
cd / 
export TZ='Asia/Shanghai' 
crontab home/1/1.cron ;
crond start ;
supervisord -c /home/supervisor/supervisord.conf ;
cd /

先启动LNMP三件套,接着启动Centos,进入根目录启动计划任务及进程守护。启动进程守护即可同时自动启动五个内网穿透客户端和cloudereve客户端。启动cloudreve之前必须启动三件套,因为cloudreve启动时需要读取数据库,而mariadb未启动会造成数据库读取失败。

六、搭建网站

由于这些网站的搭建教程烂大街了,这也不是本篇文章的重点,就只是介绍一些自己遇到的关键点。我本来也想搭一个Typecho,但目前的正式版在安装时配置数据库存在问题,而测试版又有伪静态问题,反正存在各种问题就放弃转而安装WordPress。

1、自动跳转https

首先要实现的就是http自动跳转https,不然只能通过的带https前缀的链接进去网站可太难受了。当然本来搭的网站就是http的,那就不用进一步折腾了。
我的解决办法是在SakuraFrp上为每个网站创建http和https两个隧道(注意部分隧道不支持创建http隧道),然后配置nginx的自动跳转,即本地每个网站俩端口,以解决80和443用不了的问题,这些在上文中的nginx配置文件中都明显的体现出来。

2、phpmyadmin

以下简称pma。对于菜鸟来说,有图形界面的数据库管理工具方便的不得了,你可以把pma当做一个可以直接读取数据库的网站程序。
pma官网下载最新版并解压到一个文件夹,可以把它单独当一个网站,为它创建内网穿透隧道、配置单独的域名,专门弄个网站来管理数据库,也可以直接扔到其他网站子目录中,当做这个网站的子站点,省事省心。
pma在某些时候用Chromium系的浏览器上可能登录失败,在IE上可完美登陆。

3、伪静态

  • WordPress的伪静态为:
location / {
   try_files $uri $uri/ /index.php?args;
   }
   rewrite /wp-admin$ $scheme://$host$uri/ permanent;
  • 可道云伪静态:
if (!-e $request_filename){
rewrite  ^(.*)$  /index.php?s=$1  last;   break;
}

可道云不开启伪静态无法安装webdav插件。

  • cloudreve

下载cloudereve解压,赋予执行权限并启动:

wget https://github.com/cloudreve/Cloudreve/releases/download/3.1.1/cloudreve_3.1.1_linux_arm64.tar.gz
tar -zxvf cloudreve_3.1.1_linux_arm64.tar.gz
chmod -R 777 cloudreve
./cloudreve

首次启动时,Cloudreve 会在同级目录下创建名为conf.ini的配置文件,修改此文件进行一些参数的配置,保存后重启 Cloudreve 生效。配置nginx反向代理实现https。

Cloudreve配置文件

[System]
; 运行模式
Mode = master
; 监听端口
Listen = :5212
; 是否开启 Debug
Debug = false
; Session 密钥, 一般在首次启动时自动生成
SessionSecret = IBSUfS8kCKLSeS0i93bbhmxav1OUbw5LQXMQ8oOXJFQ9WCU8PqBmTjY07crdvGkl
; Hash 加盐, 一般在首次启动时自动生成
HashIDSalt = SeLBTR3CpkvRw8GpFF90uUmJNtf8G8Ps9V8bDYgyCuC1gCgS2KGANkuA4ZQf3A5f

; 数据库相关,如果你只想使用内置的 SQLite数据库,这一部分直接删去即可
[Database]
; 数据库类型,目前支持 sqlite | mysql
Type = mysql
; MySQL 端口
Port = 3306
; 用户名
User = root
; 密码
Password = 4950751571
; 数据库地址
Host = 127.0.0.1
; 数据库名称
Name = cd
; 数据表前缀
TablePrefix = cd-

; 从机模式下的配置
[Slave]
; 通信密钥
Secret = 1234567891234567123456789123456712345678912345671234567891234567
; 回调请求超时时间 (s)
CallbackTimeout = 20
; 签名有效期
SignatureTTL = 60

; 跨域配置
[CORS]
AllowOrigins = *
AllowMethods = OPTIONS,GET,POST
AllowHeaders = *
AllowCredentials = false

; 从机模式缩略图
[Thumbnail]
MaxWidth = 400
MaxHeight = 300
FileSuffix = ._thumb

可道云和cloudreve

七、挂载webdav

1、可道云的webdav

cloudreve与可道云都支持webdav,手机端支持webdav挂载的文件管理器,mix是我现在用的很顺手的文件管理器。如文章开头所说,挂载可道云的webdav可以很方便的编辑termux目录下的文件。
可道云可读取termux安装目录下所有文件,即相对于安卓环境而言,可以读取到:

/data/data/com.termux

点击可道云左下角用户头像进入后台管理,在储存中新增要挂载的储存位置。
储存目录填手机储存的某个文件夹路径,可管理当前路径下的所有文件。
若要读取Centos文件,填写:

/data/data/com.termux/files/home/centos/centos-fs/root/

路径中的centos文件夹是我自己新建的,直接安装的没有这个文件夹。
进入可道云文件管理界面,将左侧栏二级侧栏中的网络挂载添加到收藏夹中。进入插件管理中开启webdav服务,在个人中心可找到webdav链接。
在webdav挂载软件中输入以上链接及安装可道云时配置的账号密码即可成功连接。

2、cloudreve的webdav

在侧栏菜单WebDAV中创建新的账号,webdav登录账号为cloudreve登录账号,密码为生成的密码。

3、Windows挂载webdav

Windows资源管理器自带的映射功能可用来挂载webdav,在点击侧栏此电脑,顶栏横排菜单中的“映射网络驱动器”和“添加一个网络位置”就是挂载功能,但体验贼差劲,重启电脑后就失效了,得重新挂一遍。所以我用第三方软件RaiDrive挂载。
打开RaiDrive添加onedrive和webdav,挂载webdav功能在NAS选项中,勾选地址后面的方框启用ssl,即443端口,地址栏第一栏输入域名,下面一栏输入webdav链接剩余部分,直到方框描边由红变白。
RaiDrive不能通过可道云和cloudreve的webdav读取实际容量,显示的容量有点离谱。
挂载的网盘

八、ksweb及frp安卓端

虽然现在不用ksweb了,还是稍微记录一下关键配置部分。
想要建立多个网站,就在ksweb中添加多个主机,lighttpd和nginx可以配置ssl证书,但国内安卓端浏览器会报不安全。
frp安卓端无法使用新版SakuraFrp的配置文件,需要从新版配置文件中提取信息按以下配置填写,中文内容都是要改的:

frp安卓端配置文件

[common]
server_addr = 服务器地址
server_port = 7000
tcp_mux = true
pool_count = 1
protocol = tcp
user = 访问秘钥
token = SakuraFrpClientToken
dns_server = 223.5.5.5

[隧道名称]
privilege_mode = true
type = http或者https
local_ip = 127.0.0.1
local_port = 本地端口
custom_domains = 绑定域名
use_encryption = false
use_compression = true

配置多个站点,则在其后继续填入以上内容。

参考资料

Termux 高级终端安装使用配置教程
https://www.sqlsec.com/2018/05/termux.html

旧手机上搭建网站+内网穿透
https://www.coolapk.com/feed/16506805?shareKey=ODYwYjJlODgxNzIzNWY2YzljZDI

AutoApi-普通版
https://github.com/wangziyingwen/AutoApi

Office 365 E5 账号申请及永久续期教程
https://logi.im/script/permanently-keeping-an-office-e5-account.html

cloudreve配置文件
https://docs.cloudreve.org/getting-started/config

Linux crontab 命令
https://www.runoob.com/linux/linux-comm-crontab.html

linux进程守护工具supervisor使用概述
https://blog.csdn.net/qingquanyingyue/article/details/104155897

本文作者:七米蓝
本文标题:《将手机内网穿透当作服务器并运行了几个项目》
本文链接:https://www.chirmyram.top/archives/phoneserver
版权声明:本博客文章均采用CC BY-NC-SA 4.0许可协议,转载请注明出处!

Last Modified: October 19, 2020
Archives QR Code Tip
QR Code for this page
Tipping QR Code
Leave a Comment

10 Comments
  1. 我是XXX 我是XXX   Windows 10 x64 Edition  Google Chrome 80.0.3987.163

    手机还好吗xi'xixixi5

    1. ChirmyRam ChirmyRam   Windows 10 x64 Edition  ChromiumEdge 87.0.658.0

      @我是XXX老手机本就行将就木,现在一天24小时充着电OωO

  2. 绿灯岁月 绿灯岁月   Android 10  WebView 4.0

    老大,现在我正在访问的网站,你是用手机搭建做的内网穿透,速度好快

    1. ChirmyRam ChirmyRam   Windows 10 x64 Edition  ChromiumEdge 87.0.654.0

      @绿灯岁月本篇文章所在的博客网站是搭在金山云服务器上的,手机当服务器搭的网站只适合做实验性的小项目,太不稳定了,隔三差五就挂。

  3. 黑猫云盘 黑猫云盘   Windows 10 x64 Edition  Google Chrome 87.0.4270.0

    稳定性怎么样!

    1. ChirmyRam ChirmyRam   Windows 10 x64 Edition  ChromiumEdge 87.0.654.0

      @黑猫云盘你是指什么稳定性?

  4. zeruns zeruns   Windows 10 x64 Edition  Google Chrome 78.0.3904.108

    到此一游

    1. ChirmyRam ChirmyRam   Windows 10 x64 Edition  ChromiumEdge 87.0.644.4

      @zeruns#(击掌)

  5. 原神博客 原神博客   Windows 10 x64 Edition  ChromiumEdge 85.0.564.63

    到此一游

    1. ChirmyRam ChirmyRam   Windows 10 x64 Edition  ChromiumEdge 87.0.644.4

      @原神博客#(献花)