腾讯云服务器部署FRP服务端,EMQX服务端
一.购买腾讯云服务器
1.1说明
服务器买什么都行,之前用过其他的,对比发现像腾讯云阿里云服务器就是很方便,维护管理都是图形化界面,有很多功能,比如远程控制功能,可以直接进入服务器远程控制终端,如果仅仅是自己买的服务器,想登录服务器需要用工具软件或者命令。以Windows为例,
通过 SSH 远程登录 Linux 服务器的指南
SSH(Secure Shell)是远程登录和管理 Linux 服务器的标准协议。
1.1.1 Windows 系统登录方法(推荐使用 PowerShell)
-
打开 PowerShell
-
按
Win + R输入powershell回车 -
或在开始菜单搜索 "PowerShell"
-
-
基本登录命令
ssh username@server_ip
-
username:服务器用户名(如root,ubuntu等) -
server_ip:服务器公网 IP 地址或域名
-
-
指定端口登录(如果服务器使用非标准端口)
ssh -p 2222 username@server_ip
默认 SSH 端口是 22,有些服务器会修改为其他端口
-
使用密钥登录(更安全)
ssh -i C:\path\to\your\private_key.pem username@server_ip
-
首次连接确认
第一次连接时会提示:The authenticity of host 'xxx.xxx.xxx.xxx (xxx.xxx.xxx.xxx)' can't be established. ECDSA key fingerprint is SHA256:xxxxxxxxxxxxxxxx. Are you sure you want to continue connecting (yes/no/[fingerprint])?
输入
yes并回车
1.1.2 图形化工具推荐(Windows)
| 工具 | 特点 | 下载地址 |
|---|---|---|
| PuTTY | 轻量级经典工具 | putty.org |
| MobaXterm | 功能全面(推荐) | mobaxterm.mobatek.net |
| WinSCP | 文件传输专用 | winscp.net |
1.2 腾讯云服务器部署
因为我用来做项目测试,所以申请的免费试用一个月。实名认证一下就可以申请了。

点控制台可以找到自己服务器,然后给服务器装系统,或者点重装系统如下下图,页面提示很好找,一般服务器系统都是Linux,我安装的ubuntu.

再就是重置密码,远程登录到服务器。设置完密码之后SSH登录。

然后就来到你服务器的终端,跟ubuntu终端不一样的是它是白色的而已,像下面。
然后你可以在终端运行命令,比如下载宝塔,FRP,MQTT服务器等软件。
二.部署FRP服务端
2.1 方案一.宝塔部署
2.1.1宝塔安装
功能介绍:快速创建管理web项目,快速预览服务器资源使用情况,文件管理,软件商店。感兴趣的可以自己了解一下


2.1.2软件商店安装FRP
我刚开始想用一下宝塔,所以在服务器终端用命令安装了宝塔,然后访问宝塔web页面,在软件商店下载FRP,毕竟图形化界面安装软件可能形象点,但是我感觉熟悉了命令行,其实命令下载软件更快捷,有什么问题deep seek一下,命令行直接解决。
像安装软件命令,去官网一般都有,宝塔官网宝塔面板(bt.cn) 简单好用的Linux/Windows服务器运维管理面板

然后复制安装命令到服务器终端,等待下载,输y下载就行

下载成功界面。注意保存面板链接,外网链接访问宝塔web界面,用户名和密码用来登录. 
还有两点注意,如下图绿色框两点,一是首次打开浏览器会提示不安全,解决方案如图,选择继续访问即可。二是要去腾讯云服务器的防火墙配置放行端口,才能访问宝塔web页面端口,而且宝塔也有防火墙,也就是你之后要用到哪个端口,要开两次防火墙💔,当然也可以把宝塔上防火墙全开了

点进去你的服务器能看到下面页面,可以看到,默认其实腾讯云给开了windows,Linux远程登录的端口,还预留给ping了,你可以在windows终端ping一下你的公网ip测试网络连通性,如下图


然后注册宝塔账号到软件商店搜索下载就可以了。


安装之后点进去下载frp服务端,
然后可以看到FRP服务端配置,从图片上看出两点,一是宝塔默认这些端口也是没有开放,还是那句不要忘记设置宝塔防火墙。二是FRP的web管理页面,点查看就能看到它的端口,然后浏览器访问:公网Ip+端口,就能访问web页面查看客户端情况这种
补充说明,理论上是这样,但是我在实践中,访问不了web页面,防火墙也开了,就算配置好客户端配置文件,开启FRP客户端程序之后。然后我就用其他方案了---服务器终端直接命令行安装FRP服务端,然后成功了,与上面过程不同的是,我在终端用命令配置了FRP服务端配置文件,因为时间问题,方案一为什么没成功也没有深入研究,但是网上也有这种方法成功的案例,可能是版本问题,也可能是宝塔安装没有操作落实服务端配置文件。
举个例子,就像在腾讯云界面开启了某个防火墙端口,但是有提示说要确保服务器确实开启了那个端口,这时候可以去终端用命令查看开放端口,然后我查看之后确实已经开放了,也就是说有情况可能个例吧,腾讯云页面显示开启成功,但是服务器实际上没开启。
2.2 服务器远程终端安装
其实我在终端安装也不太顺利,总结两点教训,一是绑定服务到某个端口时,检查一下端口是否空闲。二是,运行某个命令后,检查结果是否落实。下面是具体总结:
2.2.1 命令安装服务端FPRS
第一阶段:基础安装
-
下载解压
wget https://github.com/fatedier/frp/releases/download/v0.52.3/frp_0.52.3_linux_amd64.tar.gz tar -zxvf frp_0.52.3_linux_amd64.tar.gz-
🕳️ 坑1:网络中断导致下载文件损坏
-
✅ 解决:使用
wget --retry-connrefused重试下载
-
-
安装二进制文件
sudo cp frps /usr/local/bin/ sudo chmod +x /usr/local/bin/frps-
🕳️ 坑2:文件权限不足导致 "command not found"
-
✅ 解决:
sudo chmod 755 /usr/local/bin/frps
-
第二阶段:配置迷宫
-
配置文件格式大战
# 最初使用的 INI 格式(已弃用) [common] bind_port = 15443 # 最终有效的 TOML 格式 [common] bindPort = 15443 # 注意大写P!-
🕳️ 坑3:新版 FRP 弃用 INI 格式但又不完全兼容 TOML
-
🕳️ 坑4:配置项大小写敏感(
bindPort≠bindport) -
✅ 解决:使用
.conf扩展名 + INI 格式最稳定
-
-
端口监听之谜
-
🕳️ 坑5:服务始终监听 7000 默认端口
-
✅ 发现:配置文件未被正确加载
-
✅ 验证:
sudo ps aux | grep frps检查实际加载的配置
-
第三阶段:服务管理
-
Systemd 服务配置
[Service] ExecStart=/usr/local/bin/frps -c /etc/frp/frps.conf-
🕳️ 坑6:修改服务文件后未重载
-
✅ 解决:每次修改后执行
sudo systemctl daemon-reload
-
-
服务启动异常
-
🕳️ 坑7:
Active: activating (auto-restart) -
✅ 排查:
journalctl -u frps -xe --no-pager -
✅ 关键:发现 "address already in use" 错误
-
第四阶段:端口冲突攻坚
-
端口占用检测
sudo lsof -i :15443 sudo ss -tulnp | grep ':15443'-
🕳️ 坑8:FRP 自身旧进程占用端口
-
✅ 解决:
sudo fuser -k 15443/tcp
-
-
终极解决方案
# 终止占用进程 sudo fuser -k 15443/tcp # 重启服务 sudo systemctl restart frps
第五阶段:成功标志
✅ 最终验证命令输出:
tcp6 0 0 :::15443 :::* LISTEN 51481/frps
tcp6 0 0 :::16443 :::* LISTEN 51481/frps
经验总结
| 问题类型 | 踩坑次数 | 根本原因 | 终极解决方案 |
|---|---|---|---|
| 配置文件格式 | 7+ | INI/TOML 过渡期兼容性问题 | 使用 .conf + INI 格式 |
| 端口监听失败 | 5+ | 端口占用/配置未加载 | fuser -k + 严格验证配置路径 |
| 服务管理 | 4+ | daemon 未重载 | 修改后必执行 daemon-reload |
| 权限问题 | 3+ | root 权限不足 | 关键操作全用 sudo |
| 防火墙拦截 | 2+ | 云平台/本地双重防火墙 | 控制台+ufw 双重检查 |
建议
-
配置格式选择
# 保守方案:使用 .conf + INI 格式 sudo mv frps.toml frps.conf -
端口选择策略
-
避免使用 1000 以下端口
-
推荐范围:20000-65535
-
-
万能排查命令
# 检查服务状态 systemctl status frps # 检查端口监听 sudo netstat -tulnp | grep frps # 实时查看日志 journalctl -u frps -f # 检查进程加载的配置 sudo ps aux | grep frps
最终成功配置参考
服务器端 (/etc/frp/frps.conf):
[common]
# 网络配置
bind_port = 15443
allow_ports = 20000-30000
# 安全配置
token = PSMOjRyFvMrZt6kXFTWyyHXGLI
authentication_timeout = 900
# 仪表板配置
dashboard_port = 16443
dashboard_user = 7FPhpFRd
dashboard_pwd = izc0bgXOmOWtPMot
# 日志配置
log_file = /var/log/frps.log
log_level = info
log_max_days = 7
客户端 (frpc.toml):
[common]
server_addr = "106.54.xx.xx"
server_port = 15443
auth.token = "PSMOjRyFvMrZt6kXFTWyyHXGLI"
transport.tls.enable = false
[[proxies]]
name = "ssh-tunnel"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 2222
刚开始去网上搜有没有文章参考,因为咱对ubuntu命令终端使用不太懂,但是搜到都是服务器端是windows然后直接用记事本修改配置文件的,想着应该顺利的话,下载改配置保存就可以了,然后碰到了这多坑,算是学习总结了。整好了后来换个浏览器又搜了一下,发现下面这个文章写的挺好Frp内网穿透搭建教学 - Micky233 - 博客园
2.2.2 Windows安装客户端FPRC
注意一点,下载的客户端版本要和服务器端版本一样。链接https://doc.itprojects.cn/A0002.esp32cam/02.download/04.pc.py/frp_0.52.3_windows_amd64.zip
下载之后有两个软件包,FPRS和FPRC,S是服务端sever,C是客户端client,windows上是之后要暴露的内网服务,所以安装客户端。
再就是修改客户端配置文件,相关说明: 下载解压文件包可以看到如下图,我把FPRS相关软件配置删了,客户端用不到。
参考上文给出的配置进行说明,服务端和客户端都有配置文件,根据我给出的示例可以看到,两点对应下图:1.服务器端配置了服务端口,连接密钥,仪表盘设置,也就是web网页登录访问端口,用户名和密码。所以我之前说宝塔安装后web服务端口可能没有真正写进服务端配置文件,因为我当时测试访问不了web网页,更不用提后面的测试了
2.客户端配置了,FRP服务端的公网服务器ip,端口,连接密钥(相当于服务端客户端认证密码,二者配置都要一样),穿透端口(localPort本地端口,remotePort公网服务器端口),端口设置之后,这样内网服务就可以通过frpc和frps连接为媒介,当外部访问指定公网端口,frp就会转发到指定内网端口,所以每个转发都要写一个[proxies]配置一下。

2.3 启动客户端服务并测试
2.3.1 本地运行web服务
我是直接参考之前nps内网穿透在本地电脑用python开启的web服务,链接NPS内网穿透-CSDN博客
在客户端启动web服务
1.安装 Python
下载安装时务必勾选`Add Python to PATH
2.创建脚本文件
3.运行 Web 服务
在'web_demo.py 文件所在目录,打开命令窗口
-输入:
pip install gradio
python web_demo.pyshuoshuo
import gradio as gr
def greet(name):
return f"Hello {name}!"
demo = gr.Interface(fn=greet, inputs="text", outputs="text")
demo.launch(server_port=9877)
说明:第一点,python脚本服务端口号要对应配置文件里的穿透端口,我配置里写的9877。

第二点,在windows命令窗口下载gradio模块真的超慢💔,建议使用镜像源 ,当然也可以默认设置,多说一句,FPRS服务端也可以问一下deep seek命令,让它开机自启,这样就不用每次在终端启动命令了
pip install gradio -i https://pypi.tuna.tsinghua.edu.cn/simple
永久设置镜像源,避免每次都要指定镜像源,可以设置为默认源:
# 设置清华源为默认
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
# 安装gradio(无需额外指定源)
pip install gradio
本地服务开启成功结果:(上面是下载模块记录,下面是开启服务后)
2.3.2 运行frpc程序
在frp客户端文件夹中,执行cmd,打开终端,命令
frpc.exe -c frpc.toml
运行成功标志:

2.3.3 验证
一:访问frp提供的web管理网页---浏览器输入--公网IP:web端口号(符号英文)
说明:端口就是配置文件里的仪表盘端口号,公网Ip去腾讯云上查看你的服务器公网ip,服务器内网Ip是它本地的Ip,不要搞错

查看frp服务端运行的情况,如上图,访问该网页需要登录用户名和密码,也是配置文件里的。第一次登录以后就直接登录就行。


客户端显示有一个。
二,访问frp公网绑定端口(与内网端口),而我们在那个端口上用python运行了一个本地网页。
访问成功,也就是说,我们访问公网云服务器的ip和指定端口号,访问到了本地电脑web网页,穿透成功。
三.部署mqtt服务端
3.1服务器下载并启动EMQX
我选择的是MQTT服务器--EMQX服务端,大家可以用其他的。下载链接 EMQX: MQTT 与 AI 一体化平台

点免费试用,自托管下载即可
到腾讯云远程登录到自己服务器终端执行下载命令,安装,启动。注意,选择好服务器对应系统和安装包类型

3.2 访问web管理网页--浏览器输入--公网IP+服务端口
默认web端口 18083
用户名 admin
密码 public
第一次登录之后可以修改密码。
3.3 测试
怎么测试呢,思路,MQTT服务端处理消息订阅转发,那么就整一个客户端发布特定主题,一个客户端订阅特定主题,订阅的客户端有正确反馈,通信链路就是通的。
3.3.1工具
micropython--就是python的IDE,只是没有pycharm用的广泛,优点,对esp32支持好,因为我的项目用esp32。
esp32开发板--你需要烧录固件,但是我买的烧录板,就是直接type-c可以直接烧录的可能micopython软件不识别,但是在Arduion上可以烧录💔。所以嘞,你需要USB转串口模块
USB转串口模块--很简单,tx-rx,rx-tx,gnd,5v电源就可以了,具体说明,上链接:esp32-cam Thonny 烧录以及通信_make sure the device is not in bootloader mode.-CSDN博客

3.3.2 mqtt客户端1--esp32
1.思路
- esp32链接上wifi(要不咋有网络功能)
- esp32上需要下载一个mqtt的库
- 我们自己编写一个.py文件调用上面第2步的mqtt库,从而使用mqtt实现客户端的功能
- 客户端功能:订阅主题ledctl,然后接收到on消息,让板上小灯亮,实现远程控制功能
2.mqtt库(要下载到esp32上的)
MicroPython 的标准库组件 MQTT 客户端库文件
-
MicroPython 项目官方仓库中的
umqtt.simple模块 -
GitHub 源码地址:
https://github.com/micropython/micropython-lib/tree/master/micropython/umqtt.simple
3.esp32客户端 实现代码:
import time
import network
from umqttsimple import MQTTClient
from machine import Pin
p4 = Pin(4, Pin.OUT) # create output pin on GPIO0
def do_connect():
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
if not wlan.isconnected():
print('connecting to network...')
wlan.connect('wifi名', 'WIFI密码')
i = 1
while not wlan.isconnected():
print("正在链接...{}".format(i))
i += 1
time.sleep(1)
print('network config:', wlan.ifconfig())
def sub_cb(topic, msg):
topic_str = topic.decode('utf-8') # 将字节串转为字符串
msg_str = msg.decode('utf-8') # 将消息内容转为字符串
if msg_str == "on":
p4.value(1) # 打开设备
elif msg_str == "off":
p4.value(0) # 关闭设备
# 1. 联网
do_connect()
# 2. 创建mqt
c = MQTTClient("umqtt_client", "公网ip") # 建立一个MQTT客户端
c.set_callback(sub_cb) # 设置回调函数
c.connect() # 建立连接
c.subscribe(b"ledctl") # 订阅主题
while True:
c.check_msg()
time.sleep(1)
说明:要修改部分,1. wlan.connect('wifi名', 'WIFI密码')写自己的WIFI名和密码。2.c = MQTTClient("umqtt_client", "公网ip") # 建立一个MQTT客户端。写自己的公网ip 3.查看手册看自己的闪光灯引脚,不同品牌可能不一样,也可以去thony官网看引脚控制函数然后自己定义闪光灯模式,我定义的是接收指令然后开灯。下面是我的,闪光灯引脚是Pin4,所以程序里写的4

说明一下,新建文件,复制库运行,保存到Micropython设备,再新建文件保存esp32mqtt客户端代码,如下图。运行mqtt客户端代码结果如下图,第一次连接wifi可能会等待输出正在连接。


ok了,一个客户端准备好了~它实现订阅这个主题:c.subscribe(b"ledctl") # 订阅主题
当接收到这个主题的消息,调用回调函数,判断指令,若是on,则打开闪光灯
3.3.3 mqtt客户端2--MQTTX
还去刚刚EMQX下载网页,他们有提供图形化工具很友好
安装之后直接连接自己服务器,设置一下公网ip,mqtt服务端(EMQX)端口,默认1883,当然你可以改配置

连接成功标志
OK了,可以用这个客户端发布主题了,注意要发布那个客户端订阅的主题。
下面分别是消息发布格式选项,发布主题,消息。对于控制设备的简单命令(如开关控制),Plaintext(纯文本)格式是最简单直接的选择。

3.3.4 演示结果
发指令on闪光灯开,off关,效果如下。
dong
当然你可以去web网页查看很多客户端信息,
项目做到后面发现思路不是很清晰,感觉还是来整理记录一下,因为某人说过🙃,博客能跟别人讲清楚自个干了啥,还有防止忘记,之后直接拿来用,我刚学的东西确实容易忘,熟悉了好点,看之前记录很容易回想起来,就大概整理了下,有点多
更多推荐


所有评论(0)