起因
原本所有服务都是部署到服务器上的,群友推荐了一个mix-space博客,我也想部署上去试一下,试了半天,服务器一编译就崩了,ssh都卡断开了。后来尝试通过tmux保活,确保ssh断开后也能正常编译,等了挺久登录服务器后发现还是编译失败。又试了一下限制编译时的核心和内存占用,一样编译失败,索性本地测试了一下,发现本地编译是没有问题的,于是又找了另一台2H2G的服务器,再次从头搭建了一遍,最后还是编译崩溃,基本就确定问题在于服务器太差了。最后考虑的方案就是本地部署博客项目,然后通过内网穿透去访问,这中间也踩了点坑,本来frp服务端和客户端配置一下挺简单的,但是发现网上教程是有点小问题的,可能是我的版本和他的不一样,配置文件中的细节差了一点,花了一天多的时间来回排查问题。
⚠️声明
以下配置文件仅适用于frp_0.64.0_linux_amd64.tar.gz
版本,如果版本和我不同不要抄以下配置文件,避免踩和我一样的坑
准备工作
- 开放服务器的端口(我这里测试仅开放了50080端口)
- 确认服务器防火墙状态(不限制7000、7500、50080等frp需要的端口即可)
- 确认本地防火墙状态(我本地直接关了)
- 服务器和本地都下载好frp的文件
wget https://github.com/fatedier/frp/releases/download/v0.64.0/frp_0.64.0_linux_amd64.tar.gz
服务器配置
首先解压下载好的frp_0.64.0_linux_amd64.tar.gz
文件
tar -xzvf frp_0.64.0_linux_amd64.tar.gz
解压后内容如下:
frpc frpc.toml frps frps.toml LICENSE
服务器主要看frps
和frps.toml
frps.toml
文件内容如下,⚠️注意在运行之前最好将注释删除掉:
[common]# 监听端口bind_port = 7000# 面板端口dashboard_port = 7500# 登录面板账号设置dashboard_user = "admin"dashboard_pwd = "admin"# 身份验证auth.method = "token"auth.token = "12345678"
修改好后,可以通过./frps -c ./frps.toml
测试一下是否可以正常运行
客户端配置
客户端也是下载好frp_0.64.0_linux_amd64.tar.gz
文件并解压,客户端主要看frpc
和frpc.toml
frpc.toml
教程中推荐的配置文件写法如下,⚠️注意在运行之前最好将注释删除掉:
[common]# server_addr 为 FRPS 服务器 IP 地址server_addr = "127.0.0.1"# server_port 为服务端监听端口,bind_portserver_port = 7000# 身份验证auth.method = "token"auth.token = "12345678"
# 下方此处设置为,访问frp服务端的50022端口时,等同于通过中转服务器访问127.0.0.1的2222端口。# name 服务名称# type 为连接的类型,此处为tcp# local_ip 为中转客户端实际访问的IP# local_port 为目标端口# remote_port 为远程端口[[proxies]]name = "ssh"type = "tcp"local_ip = "127.0.0.1"local_port = 2222remote_port = 50022
[[proxies]]name = "mx-shiro"type = "tcp"local_ip = "127.0.0.1"local_port = 2323remote_port = 50080
其实我更喜欢[proxies.ssh]
和[proxies.http]
这种写法,这样写在ui面板
中可以看到每一个监听的端口,而如果写成[[proxies]]
然后通过name
字段区分,在ui面板
中只显示一个监听的端口,以下是[proxies.ssh]
和[proxies.http]
写法:
[common]# server_addr 为 FRPS 服务器 IP 地址server_addr = "127.0.0.1"# server_port 为服务端监听端口,bind_portserver_port = 7000# 身份验证auth.method = "token"auth.token = "12345678"
# [proxies.ssh] 为服务名称,下方此处设置为,访问frp服务端的50022端口时,等同于通过中转服务器访问127.0.0.1的2222端口。# type 为连接的类型,此处为tcp# local_ip 为中转客户端实际访问的IP# local_port 为目标端口# remote_port 为远程端口[proxies.ssh]type = "tcp"local_ip = "127.0.0.1"local_port = 2222remote_port = 50022
[proxies.http]type = "tcp"local_ip = "127.0.0.1"local_port = 2323remote_port = 50080
修改好后,可以通过./frpc -c ./frpc.toml
测试一下是否可以正常运行,如果可以正常运行,就可以先把服务器那边运行起来,然后本地运行起来,看输出是否正常,能否正常访问,正常输出应该是这样的:
WARNING: ini format is deprecated and the support will be removed in the future, please use yaml/json/toml format instead!
这句不用管,只是提醒你.ini
格式的配置文件不推荐使用了,最好使用yaml/json/toml
格式的
只要看最后输出的是start proxy success
即可
问题记录
remote_port和remotePort问题
于是就到了我遇到的最重量级的问题了,就是配置文件中字段remote_port
和remotePort
,网上的教程中大多是写成remotePort = 50080
这样的格式(至少我搜到的前几篇都是写成remotePort
),所以我在运行后无法使用时完全没有怀疑过这个配置文件的写法是有问题的,甚至搜过frp新版配置文件toml详解,里面也是remotePort
写法,教程里甚至说:
从 v0.52.0 版本开始,frp 开始支持 TOML、YAML 和 JSON作为配置文件格式。
本文所用版本v0.62.1,并且以debian为例
我的版本是0.64.0
,按理说用他这种写法应该是没有问题的,而且最抽象的是我按这种错误写法编写配置文件后,既不能正常使用,又不会报错,真麻了。
请看,他正常运行起来了,没有报错,然后我服务器的50080端口是无法访问的
后来幸好还有耐心,又找了几篇文章,里面提到了ui面板
,也就是服务器的配置文件frps.toml
中监听的7500端口对应的服务,在ui面板
中可查看客户端的连接,同时会显示这个客户端连接后服务器在监听哪个端口,上面这个图片中配置文件remotePort = 50080
字段写的是服务器监听50080端口是吧,看看ui面板
中现在实际监听的是哪个端口
实际服务器在监听7078端口,这能用就怪了,50080肯定无法访问啊,恰好后面的教程中有旧的frps.ini
文件写法,我发现旧的配置文件中是写成remote_port = 50080
的,同时好巧不巧发现了服务器输出中的这一行
之前没有仔细看过服务器的输出,再加上这个frp我也是第一次配,所以错过了这个关键信息,看到这我就应该想到是配置文件中的remotePort = 50080
字段没有被服务器识别了,所以我改成了remote_port = 50080
,重新运行,这次服务器输出如下:
输出中监听的端口不是0了,而是明确写了50080,此时ui
面板中也是50080
这下破案了,是之前配置文件中的写法有问题,给我折磨坏了
这回测试没有问题可以把服务托管到systemd了
托管到systemd
首先按照教程中的说法,将frps.toml
和frps
放入服务器的/etc/frp
路径下,将frpc.toml
和frpc
放入内网主机的/etc/frp
路径下
# 内网主机❯ ls /etc/frp/frpc frpc.toml# 服务器❯ ls /etc/frp/frps frps.toml
然后编写frps.service
和frpc.service
文件
frps.service
在服务器的/etc/systemd/system/
路径中创建frps.service
文件,该文件内容如下:
[Unit]Description=Frp Server ServiceAfter=network.target
[Service]Type=simpleUser=rootRestart=alwaysRestartSec=3sExecStart=/etc/frp/frps -c /etc/frp/frps.toml
[Install]WantedBy=multi-user.target
编写后运行服务:
# 重新加载 Systemd 配置systemctl daemon-reload# 将服务设置为开机自启动systemctl enable frps# 启动服务systemctl start frps# 查看服务状态systemctl status frps
frpc.toml
在内网主机的/etc/systemd/system/
路径中创建frpc.service
文件,该文件内容如下:
[Unit]Description=Frp Client ServiceAfter=network.target
[Service]Type=simpleUser=rootRestart=alwaysRestartSec=3sExecStart=/etc/frp/frpc -c /etc/frp/frpc.toml
[Install]WantedBy=multi-user.target
编写后运行服务:
# 重新加载 Systemd 配置systemctl daemon-reload# 将服务设置为开机自启动systemctl enable frpc# 启动服务systemctl start frpc# 查看服务状态systemctl status frpc