概述
FRP(Fast Reverse Proxy)是一个高性能的反向代理工具,可以将内网服务安全地暴露到公网。在实际应用中,我们经常需要同时运行多个 FRPC 客户端实例,例如连接不同的 FRP 服务器或代理不同的内网服务。本文将详细介绍如何在 Linux 系统上配置、管理和维护多个 FRPC 实例。
环境准备
获取 FRP 客户端
FRP 客户端需要从官方 GitHub 发布页面手动下载:
bash
# 下载最新版本的 FRP
wget https://github.com/fatedier/frp/releases/download/v0.51.3/frp_0.51.3_linux_amd64.tar.gz
# 解压并获取 frpc 可执行文件
tar -zxvf frp_0.51.3_linux_amd64.tar.gz
cd frp_0.51.3_linux_amd64目录结构规划
建议采用规范的目录结构来管理 FRPC 相关文件:
text
/vol1/1000/frpc/
├── frpc # FRPC 可执行文件
├── frpc.ini # 第一个实例的配置文件
├── frpc-server2.ini # 第二个实例的配置文件
├── manage-frpc.sh # 管理脚本
└── logs/ # 日志目录
├── frpc.log
└── frpc-server2.log配置文件转换与编写
TOML 到 INI 的转换
FRP 官方目前只支持 INI 格式的配置文件。如果你的配置是 TOML 格式,需要手动转换为 INI 格式。
TOML 格式示例:
toml
serverAddr = "xxx.xxx.xxx.xxx" #公网IP或者域名
serverPort = 7000
auth.token = "xxxxxxxxxxx"
[[proxies]]
name = "xxxxxxx" #取个名字
type = "tcp" # 连接形式、可选tcp,udp,http,https
localIP = "xxx.xxx.xxx.xxx" #内网IP
localPort = 80转换后的 INI 格式:
ini
[common]
server_addr = xxx.xxx.xxx.xxx #公网IP或者域名
server_port = 7000
token = xxxxxxxxxxxxxxx
log_file = /vol1/1000/frpc/logs/frpc.log
log_level = info
admin_addr = 127.0.0.1
admin_port = 7400
[openresty-http]
type = tcp
local_ip = xxx.xxx.xxx.xxx
local_port = 80多实例配置示例
实例1:TCP 代理配置 (/vol1/1000/frpc/frpc.ini)
ini
[common]
server_addr = xxx.xxx.xxx.xxx
server_port = 7000
token = xxxxxxxxxxxxxxx
log_file = /vol1/1000/frpc/logs/frpc.log
log_level = info
admin_addr = 127.0.0.1
admin_port = 7400
[http]
type = tcp
local_ip = xxx.xxx.xxx.xxx
local_port = 80
[https]
type = tcp
local_ip = xxx.xxx.xxx.xxx
local_port = 443实例2:HTTPS 代理配置 (/vol1/1000/frpc/frpc-server2.ini)
ini
[common]
server_addr = xxx.xxx.xxx.xxx
server_port = 8000
meta_id = xxxxxxxxxx
heartbeat_interval = 120
log_file = /vol1/1000/frpc/logs/frpc-server2.log
log_level = info
admin_addr = 127.0.0.1
admin_port = 7500
[service1]
type = https
custom_domains = xx.com #自己的域名
plugin = https2http
plugin_local_addr = xxx.xxx.xxx.xxx:35678 #内网的服务
plugin_host_header_rewrite = xxx.xxx.xxx.xxx #内网的ip
plugin_crt_path = /vol1/1000/Soft/Access证书/lsky/fullchain.pem
plugin_key_path = /vol1/1000/Soft/Access证书/lsky/privkey.pem
[service2]
type = https
custom_domains = xx.com #自己的域名
plugin = https2http
plugin_local_addr = xxx.xxx.xxx.xxx:35678 #内网的服务
plugin_host_header_rewrite = xxx.xxx.xxx.xxx #内网的ip
plugin_crt_path = /vol1/1000/Soft/Access证书/lsky/fullchain.pem
plugin_key_path = /vol1/1000/Soft/Access证书/lsky/privkey.pemSystemd 服务配置
服务文件创建
为每个 FRPC 实例创建独立的 systemd 服务文件,存放在 /etc/systemd/system/ 目录下。
服务文件1: /etc/systemd/system/frpc-server1.service
ini
[Unit]
Description=FRP Client - Server 1 (xxx.xxx.xxx.xxx)
After=network.target
Wants=network.target
[Service]
Type=simple
WorkingDirectory=/vol1/1000/frpc/
ExecStart=/vol1/1000/frpc/frpc -c /vol1/1000/frpc/frpc.ini
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
RestartSec=5s
User=1000 #自己查自己的用户id
Group=1000
[Install]
WantedBy=multi-user.target服务文件2: /etc/systemd/system/frpc-server2.service
ini
[Unit]
Description=FRP Client - Server 2 (xxx.xxx.xxx.xxx)
After=network.target
Wants=network.target
After=frpc-server1.service
[Service]
Type=simple
WorkingDirectory=/vol1/1000/frpc/
ExecStart=/vol1/1000/frpc/frpc -c /vol1/1000/frpc/frpc-server2.ini
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
RestartSec=5s
User=1000
Group=1000
[Install]
WantedBy=multi-user.target服务管理命令
bash
# 重新加载 systemd 配置
sudo systemctl daemon-reload
# 启动服务
sudo systemctl start frpc-server1.service
sudo systemctl start frpc-server2.service
# 启用开机自启
sudo systemctl enable frpc-server1.service
sudo systemctl enable frpc-server2.service
# 查看服务状态
sudo systemctl status frpc-server1.service
sudo systemctl status frpc-server2.service管理脚本
创建统一的管理脚本简化日常操作:
管理脚本: /vol1/1000/frpc/manage-frpc.sh
bash
#!/bin/bash
SERVICE1="frpc-server1.service"
SERVICE2="frpc-server2.service"
case "$1" in
start)
echo "启动 FRPC 多实例服务..."
sudo systemctl start $SERVICE1
sudo systemctl start $SERVICE2
;;
stop)
echo "停止 FRPC 多实例服务..."
sudo systemctl stop $SERVICE1
sudo systemctl stop $SERVICE2
;;
restart)
echo "重启 FRPC 多实例服务..."
sudo systemctl restart $SERVICE1
sudo systemctl restart $SERVICE2
;;
status)
echo "=== FRPC 多实例服务状态 ==="
sudo systemctl status $SERVICE1
echo "---"
sudo systemctl status $SERVICE2
;;
logs)
echo "=== FRPC 服务1日志 ==="
sudo journalctl -u $SERVICE1 -f
;;
logs2)
echo "=== FRPC 服务2日志 ==="
sudo journalctl -u $SERVICE2 -f
;;
enable)
echo "启用开机自启..."
sudo systemctl enable $SERVICE1
sudo systemctl enable $SERVICE2
;;
disable)
echo "禁用开机自启..."
sudo systemctl disable $SERVICE1
sudo systemctl disable $SERVICE2
;;
*)
echo "用法: $0 {start|stop|restart|status|logs|logs2|enable|disable}"
exit 1
;;
esac使用管理脚本:
bash
# 赋予执行权限
chmod +x /vol1/1000/frpc/manage-frpc.sh
# 使用示例
./manage-frpc.sh status # 查看状态
./manage-frpc.sh start # 启动服务
./manage-frpc.sh logs # 查看日志服务监控与维护
状态检查
bash
# 检查服务运行状态
sudo systemctl is-active frpc-server1.service
sudo systemctl is-active frpc-server2.service
# 检查进程
ps aux | grep frpc | grep -v grep
# 检查网络连接
sudo netstat -tlnp | grep frpc日志管理
bash
# 查看实时日志
sudo journalctl -u frpc-server1.service -f
sudo journalctl -u frpc-server2.service -f
# 查看特定时间段的日志
sudo journalctl -u frpc-server1.service --since "2025-09-25 10:00:00"
# 查看文件日志
tail -f /vol1/1000/frpc/logs/frpc.log性能监控
bash
# 监控资源使用情况
top -p $(pgrep -d',' -f frpc)
# 监控网络流量
iftop -f "port 7000 or port 8000"故障排除
常见问题及解决方案
-
服务启动失败
bash
# 检查配置文件语法 /vol1/1000/frpc/frpc verify -c /vol1/1000/frpc/frpc.ini # 查看详细错误信息 sudo journalctl -u frpc-server1.service -n 50 -
端口冲突
-
确保每个实例的
admin_port唯一 -
检查代理的
remote_port不冲突
-
-
权限问题
bash
# 确保 frpc 文件有执行权限 chmod +x /vol1/1000/frpc/frpc # 确保配置文件可读 chmod 644 /vol1/1000/frpc/*.ini -
证书路径错误
bash
# 验证证书文件存在且可读 ls -la "/vol1/1000/Soft/Access证书/lsky/fullchain.pem" ls -la "/vol1/1000/Soft/Access证书/lsky/privkey.pem"
连接测试
bash
# 测试本地服务是否可达
curl -I http://xxx.xxx.xxx.xxx:80
curl -I http://xxx.xxx.xxx.xxx:35678
# 测试管理接口
curl http://127.0.0.1:7400/health 2>/dev/null && echo "服务1正常"
curl http://127.0.0.1:7500/health 2>/dev/null && echo "服务2正常"服务卸载
完全卸载步骤
bash
#!/bin/bash
echo "开始卸载 FRPC 服务..."
# 停止服务
sudo systemctl stop frpc-server1.service frpc-server2.service
# 禁用开机自启
sudo systemctl disable frpc-server1.service frpc-server2.service
# 删除服务文件
sudo rm -f /etc/systemd/system/frpc-server1.service
sudo rm -f /etc/systemd/system/frpc-server2.service
# 重新加载 systemd
sudo systemctl daemon-reload
sudo systemctl reset-failed
echo "FRPC 服务卸载完成"选择性清理
bash
# 仅卸载服务(保留配置文件)
sudo systemctl stop frpc-server1.service frpc-server2.service
sudo systemctl disable frpc-server1.service frpc-server2.service
sudo rm -f /etc/systemd/system/frpc-server*.service
sudo systemctl daemon-reload
# 完全清理(删除所有文件)
sudo rm -rf /vol1/1000/frpc/最佳实践
安全建议
-
使用强 token:避免使用简单易猜的 token
-
限制文件权限:配置文件设置为 600 权限
-
定期更新:及时更新 FRP 到最新版本
-
网络隔离:使用防火墙限制不必要的端口访问
维护建议
-
定期备份配置:
bash
# 备份配置文件 tar -czf frpc-backup-$(date +%Y%m%d).tar.gz /vol1/1000/frpc/*.ini -
日志轮转:配置 logrotate 避免日志文件过大
-
监控告警:设置服务异常时的告警机制
-
性能优化:根据实际负载调整连接参数
高可用考虑
-
多实例部署:在不同服务器部署 FRPC 实例实现冗余
-
健康检查:定期检查服务状态并自动恢复
-
负载均衡:结合多个 FRPS 服务器实现负载分担
总结
通过本文的详细指导,你可以成功在 Linux 系统上配置和管理多个 FRPC 实例。关键要点包括:
-
规范的目录结构 便于文件管理
-
正确的配置文件转换 从 TOML 到 INI 格式
-
Systemd 服务集成 实现开机自启和方便管理
-
统一的管理脚本 简化日常操作
-
完善的监控维护 确保服务稳定运行
这种多实例架构不仅提高了服务的可靠性,还为不同业务需求提供了灵活的代理方案。通过遵循本文的最佳实践,你可以构建一个稳定、可维护的 FRP 客户端环境。