将家里的电脑当成服务器放到公网并允许域名访问
起因
最近搬了新家,第一件事就是把原来移动的渣渣宽带退掉,然后携号转网,投靠了联通,顺带办了联通的宽带。租房子的时候一直想在家里搭一个服务器,终于搬进了自己的房子里,就马上开始着手做这件事了。
家里有一个台式机,是之前为了玩游戏自己组的主机,后来又为了装黑苹果换了一套硬件。本来想另外买一套硬件来专门搭服务器的,因为弄房子花光了钱,就只能先用这个台式机先猜猜坑了。尝试着搭一下,看看方案可不可行。如果这次成功了,至少证明这个方案是可行的。等真正需要在家里搭服务器了,再重新来过也可以。
期望
把原来在阿里云上的服务都转移到台式机上来,配置域名解析,让外网可以通过域名访问到台式机的服务上来。
主要还是因为之前买的三年的阿里云服务器要到期了,续期的价格还高了三倍。
方案
先在台式机上装个 CentOS,搭建好服务器环境,把项目都下载下来,代码都跑起来。
配置解析,让域名解析到本地服务器的公网 ip 上。
根据 dnspod 的文档写个定时脚本,让公网 ip 变化后及时上报到 dnspod,修改解析记录。
实现
装系统和搭环境都比较容易,毕竟一直以来做的就是这些东西,这部分略过不写。
配置解析,就需要有当前机器的公网 ip。最开始想要尝试一下 ipv6 的,因为 ipv4 指向的是家里的路由器,ipv6 指向的是具体的设备。
于是使用 IPv6 测试检测了一下,发现家里的网是支持 ipv6 的。
但是友人 Hermit 及时指出了问题所在。
于是转而使用 ipv4 进行配置了。
使用百度获取到家里的 ip,在 dnspod 将域名解析到百度给的 ip 上。
然后在小米路由器的后台配置端口转发,需要将路由器被请求的接口映射到电脑上对应服务的端口上。这步没有图,因为我没在家。想起来再补图。
最蛋疼的一步来了,由于是家用宽带,即使提供了动态的公网 ip,也是不允许 80 端口被外部访问的。也就是说,无论服务器内部如何配置,只要客户端访问的端口是 80,这个请求就不会进到服务器中。
这时候就需要使用 dnspod 提供的隐形URL解析功能了。将另一个二级域名的 80 端口隐形转发到主域名的非 80 端口下,这样就实现了外部能访问 80 端口的效果。整个流程大概是这个样子:
不光这样就够了,在服务器上还需要用 nginx 来处理对应域名来的请求。以上图举例,nginx 需要处理的是 really.hostname.com:8888
,而不是fake.hostname.com
,因为真正访问到服务器上的域名是前者。
这样就绕了一个大圈子,终于让外网域名和内网的服务连通了。还有最后一件事,就是依照文档 写定时脚本,定期上报本机 ip 即可。
由于是动态 ip,所以无法避免一个问题:用脚本上报 ip 后,解析生效还需要一段时间,大约五六分钟左右。所以每次 ip 变更后都会有五六分钟的宕机时间,这个暂时没想到方案可以避免。由于搭建的服务器就是我个人的博客和一些小的项目,这个影响暂时不是很大。如果是很多人用的在线服务,这个影响就很大了。