动机
来实现内网项目部署到公网上
最近我有把我的hola博客,以及之前写完的项目部署到公网上的想法,于是结合之前玩服务器的经验,最后采取自建frp服务器的方案
我的需求:
- 性价比高,服务器费用不能太贵
- 能够部署多个java项目
- 不需要备案
几种实现方案
一般而言,要部署到公网上必须要一台服务器和一个公网ip,所有也有以下几种实现方案
-
将项目打包部署到公网云服务器中
这种也是最普遍最传统的做法,但是他有几个不够好的缺点:
- 性价比低,2核2g通常都需要30块钱一个月, 大厂服务器就更不用说了, 没有人那么有精力为了试用经常迁移多个项目
- 不适合多个java项目,众所周知java项目是很吃内存的
优点:
- 性能好用户体验好,因为项目是直接部署到服务器中的,相比于自建frp服务器方案要好
- 不需要维护多台服务器,项目在哪里就维护哪台服务器
-
将项目部署到本地服务器,配合cloudfared做内网穿透
原理是:
访问者-> cf -> 本地服务器 -> cf -> 访问者这种是我最近发现的一种方案,但是也仍然存在不好的点:
- 国内访问巨慢, cf服务器在美国, 你每次请求都需要绕很大一圈,自己经常访问后速度会改善,但是一旦给别人访问速度巨慢,这也是其最致命的缺点
- 如果要改善国内访问速度慢的痛点,你需要给cf做优点ip+自定义主机回退源,需要经常配置最佳ip,而且需要两个域名操作,但是只能改善一点仍然解决不了速度慢
优点:
- 免费
- 部署cf tunnel很方便
-
使用其他内网穿透工具, 例如樱花frp
这种方式和cf差不多, 但是具体玩的时候发现不够完美:
- 不是专门做海外内网穿透的, 针对海外线路, 没有对国内回程优化, 实际体验比cf略好(可以选一个比较近的节点)
- 付费节点虽然不贵但是我既然付费了为什么不自己搭建一台frp服务器内?
-
自建frp服务器
优点:
- 性价比高, 2h2g就可以满足, 重要的是网速带宽, 中转不吃cpu内存, 吃带宽. 这样成本低
- 本地服务器可以运行多个java项目, 中转服务器只需要反向代理即可
- 选一个海外服务器就无需备案
缺点:
- 维护可能比较麻烦一点, 本地服务器和中转服务器都需要去维护
核心流程-实现自建frp服务器完成内网穿透
我当前的环境: windows本地服务器 + 香港云服务器
自建前的准备: 一台香港服务器(选物理距离近的), frps和frpc
- 购买了一台性价比高的香港服务器后, 给他装1panel, 通过1panel安装frps(frp服务端),
- 本地服务器使用frpc, 配置及其简单, 看官方实例就能完成基本配置
- 购买一个域名, 配置好解析, 安装openresty来实现反向代理&安装证书
frps
1panel安装frps, 要记得打开防火墙, docker端口暴露
注意:
- 默认端口是7000,改高一些,不然无法链接客户端
frpc
修改toml文件配置好auth.token="xxxx"
反向代理
这里需要一些域名解析的只是
泛解析: *.aaa.com
A解析: 指向ip地址
子域名解析: bbb.aaa.com
主域名也解析到这台香港云服务器ip
每个子域名指向一个java项目, 每个子域名都是解析到这台香港云服务器ip
这里的原理,就是子域名和主域名都解析到同一个ip地址, nginx会根据域名区分并且反向代理到服务端口
公网用户 → 域名(子域名) → 香港云服务器
↓
香港服务器:OpenResty(反向代理) → FRP服务端(frps)
↓
FRP加密隧道 → 本地Windows:FRP客户端(frpc) → 多个Java项目
- frpc配置了proxy, 代理中会告诉服务端, 本地服务地址端口以及
映射到服务端的端口是哪一个(一般设置为本地端口一样) - 然后 子域名也解析同一个ip, 但是子域名不同, nginx会代理到服务器上的对应端口, 然后frp服务端会监听这个端口, frp再中转回本地服务器
- 例如:
- 访问http://blog-sky.asia -> nginx反向代理到服务器的 http://127.0.0.1:8013 -> frps会监听http://1270.0.1:8013 (因为frpc的remotePort告诉了frps将来要监听那个端口) -> frpc本地服务器的8013端口
- 访问http://sky-admin.blog-sky.asia -> nginx反向代理到服务器的 http://127.0.0.1:8011 -> frps会监听http://1270.0.1:8011 (因为frpc的remotePort告诉了frps将来要监听那个端口) -> frpc本地服务器的8011端口
主域名是blog-sky.asia, 子域名也是解析同一个ip地址, 这样就是实现了根据域名做反向代理(从cf部署tunnel中学习到的)