无公网ip的树莓派建站
周五晚上好无聊,又不想看书,所以写下这篇文章。虽然这篇文章是以树莓派作为无公网ip设备的例子来写的,但是其他的linux设备同样可以使用该方法,操作也基本一样。 可以看看demo,不过由于学校晚上断网断电,另外折腾过程中文件可能也会变化,所以不保证能够访问。
其实这篇文章应该写在宿舍树莓派捣鼓记录里面的,不过考虑到其实这种方法适用于其他的各种设备,所以将其独立了出来,另外“无公网ip”的说法还是有一些标题党的,虽然我们的树莓派可以“无公网ip”,但是我们依旧需要一台有公网ip的机器来进行对树莓派的端口映射以及反向代理,其他的设备同理。
至于“用有公网ip的机器来映射端口与反代”是不是多此一举,那就看你怎么看了。国外有公网ip的服务器可便宜得很,几块钱一个月就能得到一个具有独立ip的服务器了,但是这些服务器往往性能不咋地,而使用这种方法我们就可以使用家里性能强劲一些的机器提供web服务了(当然,树莓派只是折腾着好玩的,如果对性能有需求可以选用诸如nuc之类的性能强一些的迷你主机),而就算是树莓派,挂载一个硬盘再映射出去,也能作为一个网盘使用,数据也掌握在自己手上,不用担心服务商跑路之类的问题(只要你本地上传速度足够,虽然大陆下载国际上的数据实在是缓慢,但是上传方向的速度还是可以的)。我的树莓派在校园网之下,上传速度正好比较给力,到国外的机器能有六七十兆以上的速度。
设置cloudflare
这一步可有可无,如果你国外的服务器线路实在是太差了,可以用cloudflare优化一下(虽然这家伙大部分时候都是拖慢速度的),将域名服务器转到cloudflare后,添加一条记录,以pi.do.ci
为例,解析到你用于映射与反代的服务器,并开启cdn(橙色云朵),不过不开cdn,仅作为dns解析也可以(这样的话就不需要把域名服务器转到cloudflare了)。 建议暂时只当作dns解析,稍后开启https的时候再开启cdn模式
树莓派安装nginx
这一步很简单,在树莓派用apt install nginx
之类的命令把nginx装好即可,另外建议修改一下站点配置文件,我的系统中是/etc/nginx/sites-enable/default
(不通的发行版可能会有差异),建议直接在改目录下复制一份文件,并作出修改。 为了后面便于看出效果,我们先随便找个静态网站的页面放进去并作为网站根目录
在有些系统中,可能sites-enable中直接就是配置文件,而另外一些系统中,sites-enable里面的则是符号链接文件,指向sites-available中的实际文件,不过无论哪种情况,都是只有在sites-enable里面的配置文件才是真正启用的。,所以我们直接在sites-enable里面添加配置文件也是可以的,不过要注意复制的default是不是只是一个符号链接文件。
|
|
设置frp
frp是用于端口映射的工具,它可以让具有公网ip的服务器充当中介,转发无公网ip的设备的端口,官方已经提供了详细的文档网上也有了很多成熟的教程,这里就不赘述了。
服务端设置
先从github release页面上下载frp。
|
|
客户端设置
由于这次折腾用的是树莓派,而我装的是64位的系统(官方系统目前还是32位的),所以下载arm64的frp。
|
|
如果你仔细阅读了官方文档的话,可以发现他们还提供了type = http
的参数,设置类型为http可以进行一些额外的操作,比如修改http请求中的header,给网页加上鉴权登录,自定义二级域名等操作,不过我们目前用不到这些功能,所以直接按照tcp转发即可。
这时候直接访问映射服务器 ip:8000 理论上就能看到nginx的默认页面了(如果你开启了cdn,那就不要使用域名访问,cloudflare是不会帮你访问8000端口的)。
但是这网站还要手动指定端口访问多不方便,所以我们还需要设置一下反向代理,让我们可以通过80/443端口访问到我们的机器。
设置反向代理
在用于反代的机器上的nginx站点配置文件夹/etc/nginx/sites-available
(再次提醒,不同的发行版,甚至同一发行版的不同版本这个配置文件的表现可能有一点不同,比如在树莓派中,这个文件夹中直接就是文件,而到了ubuntu中,这个文件中又是指向site-available中同名文件的符号链接) 中新增一份配置文件。
|
|
如果你是在sites-available里面创建的配置文件,那么记得在sites-enable中添加一个软链接,sites-enable里面有的文件才是实际启用的站点,添加后记得重启nginx
另外,如果你用于中转的机器的默认站点配置文件开启了http 301重定向到https,那我们得把它给关了,不然直接重定向到443了,而我们这个站点配置是没有监听443端口的。
配置好之后,访问我们设置的域名,已经可以访问到网站了。
通过cloudflare开启https
如果我们想开启https,又懒得折腾证书,可以直接通过开启cloudflare的cdn,并开启https重写,并使用灵活模式,使得用户浏览器到cloudflare这一段路走的https,而之后继续使用http进行通信。
另外建议进入边缘证书设置中启用“使用使用https”与“自动https重写”。
等待一段时间,当dns解析更新与证书签发都完成之后再度访问我们的网站,发现已经启用了https了。
nginx显示文件目录
另外,当我们想在树莓派上挂载一块硬盘,又懒得搭建专门的网盘程序时,可以开启nginx的目录显示功能(不过更加建议使用miniserv这个项目了,可以设置密码,还可以上传文件,并且更加好看)
编辑我们树莓派nginx配置文件中的pi文件。
|
|
开启全站缓存Always online
之前提到了,学校晚上会断网断电,但是在断网断电之后我们依旧可以让我们的网站能够访问,那就是借助Cloudflare的Always online服务,对整个网站的内容(静态内容)进行缓存,前往页面规则添加Always online并设置好参数即可。
之后我们可以把树莓派上的nginx服务器关闭看看,本来会提示错误的,但是开启全站缓存之后,网站依旧可以正常访问(当然可能有部分内容显示不正常,尤其是动态站点,不过我的网页是hexo生成的静态文件,所以看不出有什么变化。)还有就是,能够正常显示的前提是你访问的内容缓存过,也就是说,服务器离线之前有人访问过的文章才会被缓存下来,如果访问没被缓存的内容依旧会返回502错误的。
后记
其实这些操作并不难,不算特别有趣,也没有什么新的知识点,但是我还是从头到尾走了一遍,因为我的第一个网站就是几年前搭建在树莓派3b上的,那时候还使用了sakura frp作为映射,我当时很好奇——为什么通过我的域名访问他们的ip就能定向到我的网站而不是其他用户的网站呢?经过后来的学习,我知道了web服务器可以根据header中不同的host使用不同的网站根目录,而今天就是无聊之际想着通过实际操作来回答一下当年的疑问,所以有了这篇文章。