
服务器资源不够,又想让 hr 访问网站怎么办
前言
大家好,我是程序员 cq。
之前面试鱼厂的时候,我简历上的 OJ 项目没有部署到服务器上,鱼皮大大让我部署一下,他要浏览我的网站看看都有哪些功能,我面露难色,我的 2 核 4G 服务器早就已经到期了,虽然我还有一个 2 核 2G 的服务器,但是我的这个 OJ 项目又是个微服务,还有其他的 Nacos、RabbitMQ 等中间件,根本就跑不起来。
内网穿透初体验
好吧,没有条件,创造条件,我直接用内网穿透不就好了?
对于内网穿透,我之前其实用的最多的就是 natapp,网址:https://natapp.cn/
正好这个网址提供了免费的内网穿透隧道:
我看到这里,果断白嫖,反正也不用钱,先用一下让被人能访问到才是最重要的。
我先配置下前端,先保证页面能访问到。
本地把 authToken 配置好之后,直接一键启动就好:
访问网站:
怎么回事,为什么会出现 Invalid Host header?
简单查了一下,原来是因为我把本地的 127.0.0.1 映射到 ag8qr7.natappfree.cc,浏览器请求这个域名时,Host 头 是 ag8qr7.natappfree.cc,但是我本地启动的 Webpack Dev Sever 并不知道 ag8qr7.natappfree.cc 是可信的来源,所以直接拒绝请求了。
解决方法很简单,在 vue.config.js 中设置这个 Host 允许访问就好了:
重启后,再次访问 http://ag8qr7.natappfree.cc ,等待了两分钟后,终于看到页面了!
流程跑通之后,我本以为后面就好做了,只需要再对后端做个内网穿透就好了,但是我万万没想到,natapp 只提供了一个免费的 http 内网穿透:
好好好,那我买好吧,看下价格一个月要 9 块钱。我再看下我的 2 核 2G 服务器,一年也才 46,比我的服务器还贵,而且还有流量限制。
买个屁,我直接自己搭建一个内网穿透不就得了。
自建内网穿透服务
于是我就在 github 上找 star 最多的内网穿透工具,果然找到了一个内网穿透的服务:https://github.com/fatedier/frp
还可以看到他们的官方文档:https://gofrp.org/zh-cn/
服务器搭建内网穿透服务
1)下载 frps
下载链接:https://github.com/fatedier/frp/releases
由于我的服务器是 AMD 架构的,所以选择了红框内的文件。
可以直接在服务器中下载这个文件
▼bash复制代码cd /www/server/frp wget https://github.com/fatedier/frp/releases/download/v0.61.0/frp_0.61.0_linux_amd64.tar.gz
2)服务器解压文件
执行下面这个代码即可解压
▼bash复制代码tar -zxvf frp_0.61.0_linux_amd64.tar.gz
3)进入 frp_0.61.0_linux_amd64 目录,可以看到里面的文件列表
▼bash复制代码cd frp_0.61.0_linux_amd64
4)启动服务
解压后什么都不用管,直接启动就好:
▼bash复制代码./frps -c frps.toml
本地启动内网穿透服务
1)本地下载 frp
由于我是 mac 系统,所以我下载了第一个,如果是 Windows 系统,一般下载第二个就好。
2)编辑 frpc.toml
serverAddr 设置为我们刚刚服务器的 ip 地址。
localPort 设置为本地的要被代理的端口,这里我设置为本地前端端口 8080。
remotePort 设置为远程要暴露出去的端口,这里我和本地的端口都设置为 8080。
3)运行 frpc 服务
▼bash复制代码./frpc -c frpc.toml
此时再访问页面:
搞定,流程跑通了。
使用自建内网穿透暴露服务
刚刚已经可以用服务器 ip 访问本地的前端了,现在我们只需要再代理一下后端就好了。
后端正常启动,此时把前端的请求接口地址改为代理后的接口地址就好了:
此时再访问我们的项目:
大功告成,这样别人直接访问我们提供的 ip 地址,就可以看到我们的项目了。服务器在这中间起到的作用就只是一个转发请求,我们的 Nacos、RabbitMQ 、代码沙箱、各种微服务也都不需要在服务器上部署了。
至此,我已经可以给鱼皮大大看我的项目了(如果当时真的这么顺利就好了)。
在鱼皮大大要看我的项目的时候,我其实只用了 natapp 尝试了内网穿透,发现只能代理一个服务的时候已经慌了,我担心搞的时间太久,会给人的印象不好,于是我只能先让鱼皮大大看下我代码的提交记录,以此证明这个项目我是真实的扩展了很多功能。
虽然最后只提供了代码的提交记录,但是我后面还是自己尝试了搭建内网穿透服务,虽然这次别人没有看到我的项目,但是我要保证后面的面试中,可以让面试官在线浏览我的 OJ 项目。
frp 高级操作
frps 后台运行
其实刚刚大家也都能看到,我们启动服务器的内网穿透服务,是在前台运行的,一不小心就关闭了。不过我们可以使用 systemd 来管理我们的 frps 进程,详细文档可以看这里:https://gofrp.org/zh-cn/docs/setup/systemd/
1)创建 frps.service 文件
▼bash复制代码sudo vim /etc/systemd/system/frps.service
写入以下内容:
▼shell复制代码[Unit] # 服务名称,可自定义 Description = frp server After = network.target syslog.target Wants = network.target [Service] Type = simple # 启动frps的命令,需修改为您的frps的安装路径 ExecStart = /path/to/frps -c /path/to/frps.toml [Install] WantedBy = multi-user.target
2)使用 systemd 命令管理 frps 服务
▼bash复制代码# 启动frp sudo systemctl start frps # 停止frp sudo systemctl stop frps # 重启frp sudo systemctl restart frps # 查看frp状态 sudo systemctl status frps
3)设置开机自启动
▼bash复制代码sudo systemctl enable frps
这样 frps 就可以实现开机自启动,而且可以在后台运行。
配置控制台
在服务器的 frps.toml 中加上这两个配置即可:
▼toml复制代码webServer.addr = "0.0.0.0" webServer.port = 7500
其实重启服务:systemctl restart frps
即可看到我们的控制台页面:
配置域名
自建了内网穿透服务之后,虽然别人可以访问到我本地的服务了,但是访问的是 ip 地址,一点都不优雅,而且如果我的 ip 地址变了,别人也访问不了,所以我们可以配置下域名解析(如果是国内的服务器,这里的域名必须备案)。
正好 frp 支持配置域名,详细文档可以看这里:https://gofrp.org/zh-cn/docs/examples/vhost-http/
我这里可以带大家简单配置下。
1)配置服务器的 frps.toml
增加一行配置:
▼toml复制代码vhostHTTPPort = 80
修改后重启即可:systemctl restart frps
2)配置本地的 frpc.toml
▼toml复制代码serverAddr = "服务器 ip" serverPort = 7000 [[proxies]] name = "frontend-http" type = "http" localIP = "127.0.0.1" localPort = 8080 customDomains = ["proxy.yourdomain.com"]
配置好后,重启本地的 frpc 服务。
3)配置域名解析
记录类型选择 A,主机记录填 proxy,记录值填 ip 地址即可。
点击确认后就配置了域名解析,直接访问这个域名就可以访问本地服务。
配置 https
通过上面的那些操作,我们实现了通过域名访问服务,但是远远不够,我们正常访问的网站都有 https,所以接下来我们可以尝试配置 https。frp 也提供了 https 的配置文档:https://gofrp.org/zh-cn/docs/examples/https2http/
1)配置服务器的 frps.toml
修改一行配置,将 vhostHTTPPort 换成 vhostHTTPSPort
▼toml复制代码bindPort = 7000 vhostHTTPSPort = 443
2)修改本地的 frpc.toml
▼toml复制代码serverAddr = "你的 ip" serverPort = 7000 [[proxies]] name = "frontend-http" type = "https" customDomains = ["proxy.yourdomain.com"] [proxies.plugin] type = "https2http" localAddr = "127.0.0.1:8080" # HTTPS 证书相关的配置 crtPath = "./server.crt" keyPath = "./server.key" hostHeaderRewrite = "127.0.0.1" requestHeaders.set.x-from-where = "frp"
3)获取免费的 ssl 证书
我们可以在腾讯云的 ssl 证书中申请免费证书:https://console.cloud.tencent.com/ssl
点击申请后,填写要绑定的域名,然后点击提交申请,进行域名验证:
此时我们可以看到主机记录、记录类型还有记录值。
根据上面的数据配置好域名解析就可以了(注意这里的域名解析是在域名所在的云服务中配置的):
4)下载证书
配置完成后腾讯云点击验证域名后,再点击完成,等待片刻后就签发成功了,这时候我们再下载 ssl 证书

只需要下载 Apache 证书即可。
5)配置 frpc 的证书
将证书放到 frpc.toml 所在的文件夹即可(注意文件名要和 frpc.toml 配置的对应上):
此时重启 frpc 服务,访问域名即可查看到 https 的服务。
总结
至此,我们搭建好了一个内网穿透服务,而且还可以配置域名和 https,如果自己的服务器资源不够的话,确实可以搭建一个内网穿透服务,保证自己在求职时面试官可以在线浏览我们的网站。
不知道大家还有哪些内网穿透的工具,欢迎大家在评论区分享。

