http://hocassian.cn/wp-content/uploads/2020/06/277edbd1b24a69348578366b4f4e95213c335818.jpg

首先说一下项目背景,自从17年我就开始部署自己的个人网站了,也算是踩过不少坑了,其中令我印象最深的就是各大云平台的服务器租赁了。像我这种搞自己小网站,对服务器负载要求不高的用户其实还好,腾讯云学生套餐的十块钱一个月套餐真香哈哈,1核心2G内存50G存储足够用了;但随着时间的流逝,学生套餐只有一年的有效期,过了之后续费的价格高到离谱,真可谓是「优惠一时爽,续费火葬场」,虽然问题可以通过参加云平台每日限时秒杀买新服务器,然后通过镜像备份迁移的方式转过去的方式解决,但是每隔几年这样折腾一次对于我这种懒人来说是真的心累,可能云平台就是看准了我们这些懒人的特性,所以故意这样营销吧……老千层饼了咳咳……

而对于一部分开服玩家来说,比如在云平台开个CSGO私服,或者整个MC服务端,那种的开销就更大了,首先是算力要强,负载要强,其次ping值要低,而且大部分的腐竹都是学生,经济上也不能说很自由,这种情况下就会陷入以下的选择难题之中——

快、便宜、高性能——这三者只能取其二

所以我就在思考一个问题,能不能把服务器搬到本地来,这样想上什么配置全部都能自定义了,只用出一次买设备的钱,剩下的只有电费和网费了;至于如何与外网链接,直接内网穿透就行(不懂这个概念的可以百度一下),这样云服务器的租赁费用会降低不少,最起码不需要在cpu和内存以及储存上花多余的钱了。抱持着这样的设想,我开始了漫漫的采坑之旅~

先给大家看一下我的成果吧:Hocassian.cn

这个是我用树莓派3B+搭建的wordpress网站,如果同时在线人数不超过三位数,基本还是能撑一撑的(毕竟我还设置了cdn加速),这对于一个单板机来说已经很优秀了。其实我最开始想整星际蜗牛的,但突然发现其实也没啥特别的私人网盘相关的需求(毕竟每年给百度网盘大几百,咳咳),而且手机上装Linux模拟机Termux就能满足LAMP&LNMP基础的Vue+SpringBoot+MySQL老三样分布式开发(以后的章节里边慢慢和大家讲怎么玩),所以就没买,不过这价格比起群晖是真的实惠太多,万一哪一天剁手了呢(

在开始捣鼓硬件之前,我先把市面上所有的内网穿透的途径与方法都研究了一遍……不对,最开始我根本没想着搞内网穿透,而是想着如何从本地网络入手,直接打电话问运营商拿个公网ip然后奥利给,但自从听到有同行这样整直接被请去公安局喝茶,甚至端口信息都被写入了运营商的黑名单,再加上我本地的联通光纤路由多次调教无果后,遂果断放弃,选用了内网穿透,然后就开始各种研究,比如花生壳、哲西云、零遁科技、Ngrok……当然也包括最后被选中的FRP。

当时写论文的时候还特地拜托老妈帮忙找了一位巨佬,Ngrok就是他给出的推荐方案

然后我让我朋友@你阿叉烧 试了一下,他是专门开MC服务器的。结果很不凑巧,虽然速度还过得去(取决于min[中转服务器,客户终端]),但由于这个项目太久没维护,出现了以下问题:

所以最后选了frp

相信有些懂行的已经看出来了,无论是何种内网穿透,只要不是所谓的「牌子货(即类似花生壳那样的完全黑箱)」,都是需要一个中转服务器的。有人就会问了,你这不是脱了裤子放屁吗?最后还不是得用腾讯云之类的云服务……咳咳,这确实是事实,但还是比最原始的整站迁移方案来的方便快捷,甚至……可以直接部署到别人的服务器上「吸血」。

没错,虽然不想承认,但为了这个教程能顺利进行下去,我确实得说我正在「吸血」——目前我手头上有两台拥有公网ip的服务器,分别是之前给腾讯·大粤网做开发的和之前和小伙伴联手开发网络加速器所使用的。之前我的网站就直接放在后者之上的,但由于那个远在海外(日本AMZ),访问加载速度巨慢无比,而且我的域名是腾讯云那边的,他们官方不给长时间解析到其他云平台,所以才有了本次「网站大迁徙&大变革」计划——将frp的服务端放到前者的服务器上。

接下来就是具体的部署阶段了,无论对于新手还是老手来说,想要「快速地」部署,宝塔管理面板是必须得装的了。但有的时候吧,这玩意得看脸,没法快速的还是得慢慢搞,意思就是有些服务器的架构比较奇怪,没法兼容这套面板,其实官方也说了,兼容度如下:

比如我的树莓派3B+最初就装的是ubuntu的树莓派定制版,然后宝塔面板就各种出问题,这些问题已经有b站up主踩过了,然后给出了解决方案:

然后我看过一轮之后感觉……他们定制的有些太死板了,很多参数都封装在docker镜像里边了,不好处理。考虑到之后要装frp,而且要写教程肯定大概率面对的是小白(无贬义),所以我重新刷了一遍机,装了ubuntu最新的20.04系统,其实最好还是装18.04的,我也不知道为啥当时会脑子抽了装了个最新的20……反正大家千万别学我,老老实实装官方推荐的18,不然各种小问题频发,对于新手来说是不好处理的。

关于服务器,不一定非得是树莓派,还可以是其他硬件,比如上述的星际蜗牛,或者其他的单板机,比如香橙派等等。

关于安装宝塔面板:https://www.bt.cn/bbs/thread-19376-1-1.html

装好宝塔之后选择LNMP(Nginx+MySQL+PHP),注意php选择7.0,MySQL选择5.6,Nginx和phpMyAdmin(MySQL在线管理插件)按它默认的来就行,然后你就直接关掉界面去做别的事吧,这一步对于树莓派这种级别的服务器来说,没有8个小时装不完的。

等所有的插件都装好之后,查看一下是否都运行正常:

如果发现Nginx没装上去,或者右边不是绿色的小三角而是红色的两道杠,说明你的单板机不支持LNMP模式(这个纯粹看人品,我就没装上去,但另一个朋友装好了),如果你跟我一样遭遇不幸,没关系,LAMP模式一样行的通,选择装Apache 2.4.43吧~

装好之后,实际上基本什么网站都能部署了,你可以去宝塔的一键部署列表里看看自己想要部署什么网站,需要注意的是,选好之后别着急点一键部署,因为我们还有内网穿透要处理:

别贪心,单板机算力有限,选一个就好了,如果你想开多个网站,可以接着看我怎么拿手机搞的(手机的算力和内存相对就好多了)

只要涉及网络通讯,域名绝对少不了。相信很多朋友没有自己的域名,这里推荐大家看看这个教程(BV1pJ411E72D),弄明白域名的原理,且整到一个能用的、可自由解析的域名之后,再继续来看本教程;如果你有自己的域名且明白什么是解析,那么可以接着看。

这里还是拿wordpress举例子,但最开始frp穿透还没弄好,所以先教大家怎么搞穿透,首先新建一个静态网站:

这个网站设置完之后要删除的,然后再正式开始部署网站,就像「沙漠打水悖论」一样,没有最初的一桶水倒下去,怎么继续通过内压抽水呢?

我这边以一个二级子域名为例,这样配置之后,访问192.168.31.32(本地IP):

看到这个页面之后,就可以继续整frp了。这里要提示一下,宝塔商店自带的那个frp不要用,很多系统都不兼容的,毕竟frp是需要两台服务器都安装的,一台本地的(客户端),一台有公网IP的云服务器(服务端),不确定性太大,所以我推荐大家手动去下载release版然后自己装。

我们来到github,看到这个开源项目的页面:

通过这两个参数认准这一家

点击release进入项目发布界面:

根据你单板机的内核架构,和云服务器的内核架构选择合适的编译版本进行下载,毕竟两头都要装,所以得看准了。现在来解释一下frp的运行机制,部署在你单板机(比如我这里就是树莓派3B+)上的叫做frp客户端,负责接收frp服务端传来的信息,和发送数据给frp服务端(云服务器),而这个服务端是安装在云服务器上的,专门接收访问用户传来的信息,并将这个信息转发给frp客户端,客户端处理好之后又把这个信息转回去,由服务端推送给用户。这个处理机制有点像代理,如果你了解过相关的知识,相信不难理解的。

下载完之后,我建议大家在本地解压并编辑各项参数,然后再通过FTP或者SFTP的形式上传到服务器,这样的话好处有两个,其一是如果你云服务器要换了,直接关闭frp服务然后重新找另一个服务器把相同的配置文件和运行文件一传,直接执行就能短时间内完成变更。

其中,frpc是客户端(client),frps是服务端(server),千万要厘清,不要弄混了。以下教大家的是如何完整地配置frp+https访问,我在网上已经看过一圈了,无论是国内还是国外,frp的教程基本对应的都是普通的http协议访问,我自己捣鼓出来的https协议访问应该属于首创了(至少在已公开的范围内)。

如果你不想那么麻烦,觉得仅仅http也能接受,可以去看看这个简化版的教程,这篇文章剩下的内容也不用再继续看了:(等我写完这篇先)

首先我们编辑客户端的参数,用IDE或者记事簿打开frpc.ini:

[common]
server_addr = 你云服务器的ip地址
server_port = frp控制信号于两个服务器间通讯的端口(建议填写7000)
privilege_token = 相当于一个验证用的密码,只有两个服务器配置相同的密码才能通讯,防止第三方恶意利用你的云服务器。

[http_web] # 这个中括号别删了,里边的内容可以随便写
type = http # 传输的类型,建议保持这个,下边我会解释
local_ip = 127.0.0.1 # 对于本地服务器来说,网站地址当然是自己了,所以是localhost,但这里要填写127.0.0.1,如果你是在路由器或者其他内网设备上架设的网站,那么这里要改为指定的内网ip地址
local_port = 80 # 内网中运行网站的端口
remote_port = 8088 # 别人要访问云服务器的这个端口才能看到你的网站(如果你不设置反向代理的话),下边我会详细解释。
custom_domains = 你的域名,如果不是二级域名建议不带前缀www

然后是服务端frps.ini的参数,大家先跟着一步步做,有些内容需要做完全套才能理解:

[common]
server_addr = 0.0.0.0 # frp服务所使用的端口(TCP),建议保持不变
bind_port = 7000 # 和刚刚那个server_port相对应,建议填写7000
kcp_bind_port = 7000 # 同上
dashboard_port = 6443 # 这是一个frp的控制面板,访问「云服务器公网ip:端口6443」就能访问了,下边会详细说明
authentication_timeout = 9000 # 没有的话加一个,设置为9000,时间长一点没关系,不然以后出什么time_out错误还是得回来改这里。
dashboard_user = 上述控制面板的登录名,自定义
dashboard_pwd = 上述控制面板的登陆密码,自定义

type = http # 和客户端对应
vhost_https_port = 4433 # 这里随便填,我们这套教程用不到https的传输协议,但如果没这行系统又会报错,所以随便写一个数字(0-65535)上去就行
vhost_http_port = 8088 # 和刚刚的remote_port相对应
vhost_http_timeout = 9000 # 没有的话加一个,设置为9000,时间长一点没关系,不然以后出什么time_out错误还是得回来改这里。
privilege_token = 刚刚说的那个验证密码,记得保持一致。
custom_domains = 填写你的域名,但建议以泛域名解析的方式来填写,例如"*.Hocassian.cn",如果你的这台服务器上已经有别的网站在运行了,且他们都部署好了https,如果不是泛域名解析很容易直接串到他们的网站上去。

考虑到我们多半都在「吸血」,所以得考虑一个「云服务器已有运行网站」的情况。有人看到上述配置里的7000和8088两个端口就会觉得很奇怪,不应该只有一个端口完成所有信息传输作业吗?如果你这么想,说明你没有学过计算机组成原理。自古以来控制和信息传输都是分两部分来完成的,不然你看那些修电脑的干嘛干完南桥干北桥……咳咳,扯远了啊,总之7000就是负责控制8088信息传输的,所有的网站请求和反馈涉及的信息都是走在8088这条路上的,我们的部署链路图如下:

从这张图里不难看出,我们的https的SSL协议配置到云服务器上就好了。那么我们正式进入云服务器来部署,这里拿宝塔来实操举例,如果你懂服务器运维的话,以下这些步骤相信你也能在不借助宝塔面板的情况下通过输入命令来完成,无非就是Nginx的配置。

首先,在云服务器上新建网站,输入你的域名(这里拿dv.Hocassian.cn举例):

然后根据以下步骤申请并部署https的SSL,只有完成这步操作别人才可以通过https访问你的网站:

然后在Nginx配置处输入反向代理的相关配置参数:

location / {
        add_header 'Access-Control-Allow-Origin' 'http://你的域名.你的域名后缀';
        add_header 'Access-Control-Allow-Headers' 'Origin, X-Requested-With, Content-Type, Accept';
        add_header Content-Security-Policy "upgrade-insecure-requests;connect-src *";
        proxy_pass http://0.0.0.0:8088;
        proxy_set_header   Host             $host;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
    }

以我的网站为例,我是在这个位置这样设置的:

接着回到自己的服务器改一改默认页面(作为区分):

之后去到域名解析页面,把域名解析到指定的ip上:

然后把之前设置好的服务端和客户端分别部署在两台服务器上,这里推荐使用screen命令,不懂的可以百度一下,非常简单这里不展开了。最好别用后台的&,因为如果有参数需要修改,直接screen -r进窗口Ctrl+C停止进程,改了重新启动即可,后台的话还得找出PID然后去KILL,比较麻烦。

首先cd到放置了frp文件的文件夹
修改配置文件的命令:sudo nano frpc.ini(客户端配置) 或者 sudo nano frps.ini(服务端配置)
启动frp的命令:./frpc -c frpc.ini(启动客户端) 或者 ./frps -c frps.ini(启动服务端)

注意,先启动服务端,然后再启动客户端,两个都启动完毕后,试试进入指定的域名看看:

那么最终就调教成功了~现在可以回到本地服务器的一键部署界面,点击一键部署之后,把数据库、域名什么的都设置好,毕竟我们的服务器就在本地,你也可以把内网ip添加到自己的域名访问列表里,然后通过内网也能访问了:

可以看到我就算通过内网也可以访问到

如果出现有文件访问不到的404的情况,上述配置文件可以选择不填写,然后在反向代理选项卡处加一条:

这样就能正常访问了~

如果你和我一样,要配置wordpress个人网站的话,这一点必须要注意,就是初始流程走完之后,还得改本地和云端Nginx的参数,不然就会经常出这种问题:

打开如下界面,把所有带有timeout字样的参数全部改到3000以上:

如果你本地用的是Apache,那就这么改:

最后在wordpress配置里这么改:

这一步非常非常关键,一定要按照这样来改,前一个没有s,后一个有s,绝对不能出错,否则网站都进不去,只能去phpmyadmin里改数据库了。

记住,改完一个就要重启一个的服务,就像这样:

先重载,再重启

如果你想实时监听你的穿透情况,可以进入这个网址——你的服务器IP:6443,然后输入上述的账号和密码,之后就能看到这个页面了:

关于wordpress的主题,我推荐两款,其一是Sakura:

相关教程:https://yremp.live/wordpress-sakura-teach/

还有就是sakurairo,是一款相对于原版Sakura主题更加强大的主题:

相关教程:https://yremp.live/wordpress-sakurairo/

ok,那么我们的教程就先进行到这里,关于通过Termux调教手机的教程就下回再和大家分享吧~

 

https://www.bilibili.com/read/cv6017040云服务器, wordpress, IT教程, 内网穿透, frp


人生有無數種可能,人生有無限的精彩,人生沒有盡頭。一個人只要足夠的愛自己,尊重自己內心的聲音,就算是真正的活著。