在家里运行网站
2020-04-15
周溱
更准确的说法是web应用。现在大量的应用,例如办公包括G-suite,Office 365,Reddit,Grammarly等其实都是web应用,你只需通过新一代浏览器,无需安装任何客户端软件即可使用。个人可不可以自己架设web应用呢?当然可以。一些web应用是自由软件,可以自行安装架设的。当然,需要做一番手脚。
基础设施
首先,你需要注册一个域名。例如本博客使用的域名 3qin.us
就是属于作者个人。这其中涉及一点费用,但相当廉价,大概每年十几美元左右。在这个网络时代,没有域名都不好意思说自己是网络公民了。
第二,你需要有一个公网IP,包括v4+v6,和一台公网服务器。最廉价的方法是购买一个vps(虚拟主机)。例如我使用的hostwinds就是一个小规模的hosting公司,当然,大公司例如Amazon也提供hosting服务。我这里不建议使用web hosting,不如使用更底层的主机hosting,是因为价钱差不了很多,但你能做的事情多很多。以我使用的hostwinds VPS为例,最低档每月费用五块美元,而基本web hosting费用也要三块多。当然网上还有完全免费的web hosting,但请记住,hosting总要有成本,成本总要有人来负担。长久之计,这点成本还是自己来承担为好。
第三,你需要有SSL证书。没有证书,人家根本不会上你的网站。好处是在有了域名,VPS之后,可以完全免费地获得SSL证书。不是刚说免费的东西都有问题吗?但在大规模部署,完全自动化的情况下,证书的生成及校验成本已经很低很低,公益机构Let's Encrypt完全包下来了。所以,任何有域名,有VPS的人都可以享受免费SSL证书,相当简便的初始安装,和完全自动化的更新。
有了以上三点,你可以架设数量无限的http virtual host,每一个都是正规网站,包括域名和SSL证书,例如本博客。
进阶服务困境
以上仅是基础服务。廉价vps的问题是资源受限。例如我的5块钱vps来说,只给我单CPU,1G内存,30G SSD存储,每月流量上限1TB。我用它运行emacs和邮件服务没问题,流量也够了,但CPU,内存,存储都很差,想运行大型全栈web app总力不从心。正规的做法是升级你的VPS,大致到每月20块的水平就比较像话了。当然小农如我,是不舍得花这个钱的。怎么办?
和vps可以对比的是家里的电脑资源。我已经付了家里的宽带费用,家里还有CPU,内存和存储相当不错的台式电脑。可惜,家庭宽带是有问题的:
- 没有固定IP。动态IP处于居民区段,也没有信用。
- ISP端有防火墙,限制很多网络行为。
- 现在的ISP甚至控制你家里的接入设备,连端口转发都不能搞。
- 上下行带宽不均衡。主要限制在上行比较差。
可见,VPS有的问题家里没有,但家里有的问题VPS也没有。二者要是能结合起来就好了。
VPN
一个自然的想法是架设VPN打通家里和VPS。有了VPN之后,我可以在家里运行大型服务,通过VPS做端口转发,展现在公网上,如下图所示:
一个相对好用好安装的VPN软件是openvpn。但这样也有自己的问题:
- VPN导致家里内网门户大开,你还需要周全的防火墙来保证安全。
- 所有服务运行在家里,这样家里一旦断网,所有服务全部下线。
- 所有服务运行在家里,大大加重了家庭网络的上行负担。
- 最后,VPN相对安装维护复杂一点。
其实我并不需要IP级网络沟通,我所需要的所有网络服务其实都是web服务,全部走HTTP协议。针对这点,有没有更好的方法呢?
container + ssh tunnel
我最后使用的方法是用container + ssh tunnel + proxy caching. 这个架构比较非常规,解释不如看图:
下面分三部分分别讲述:
前端
前端在VPS上运行nginx。每一个应用对应一个nginx 上的 vhost。资源要求小的静态网站,例如本博客,直接运行在vps上。资源要求大的应用使用reverse proxy向后端传递。为了尽量降低家庭网络上行瓶颈,在前端的nginx内使用proxy cache来暂存后端响应,主要针对静态资源。
后端
后端在家里的电脑里。最好使用固网连接的台式电脑,并使用Linux,防止无线网络不稳定,或电脑自动休眠等问题。每一个应用对应一个lxc container。每一个container都是完全自洽的,包含所有数据库等应用的支持在内。这样有利于迁移管理。由于前端已经有nginx和ssl部署,后端直接暴露非SSL的应用服务器,应用服务器直接服务静态资源。
隧道
从每一个后端容器,向前端vps分别做ssh隧道,打通本服务所需要的端口。映射的端口仅通到vps本机,向外的服务完全由nginx再proxy出去。由于家庭网络断线的概率不小,这里每一个tunnel都有自己的守护进程,一旦断线立刻重连。
分析
这种部署方式兼顾了安全性和易维护性,同时不需要额外成本。当然缺点还是有:
- 系统瓶颈还是在家庭网络上行带宽上。nginx的proxy cache不理解应用逻辑,只能求稳,对带宽的节约有限。
- 家庭网络断网,断电等可能性多,整个系统在线率不高,最多99%。网络断线后只剩有限的静态服务。
由于带宽受限,视频或网盘之类应用恐怕效果不佳。如果想运行更可靠更高速的服务,还是购买高档一点的vps服务为好。
在这个架构上,我已经可以做一些在廉价vps上做不到的事情。例如我的discourse。