网站Logo 爱絮叨的充电桩

在 Linux 系统上配置和管理多个 FRPC 实例的完整指南

alan
30
2025-09-25

概述

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.pem

Systemd 服务配置

服务文件创建

为每个 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"

故障排除

常见问题及解决方案

  1. 服务启动失败

    bash

    # 检查配置文件语法
    /vol1/1000/frpc/frpc verify -c /vol1/1000/frpc/frpc.ini
    
    # 查看详细错误信息
    sudo journalctl -u frpc-server1.service -n 50
  2. 端口冲突

    • 确保每个实例的 admin_port 唯一

    • 检查代理的 remote_port 不冲突

  3. 权限问题

    bash

    # 确保 frpc 文件有执行权限
    chmod +x /vol1/1000/frpc/frpc
    
    # 确保配置文件可读
    chmod 644 /vol1/1000/frpc/*.ini
  4. 证书路径错误

    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/

最佳实践

安全建议

  1. 使用强 token:避免使用简单易猜的 token

  2. 限制文件权限:配置文件设置为 600 权限

  3. 定期更新:及时更新 FRP 到最新版本

  4. 网络隔离:使用防火墙限制不必要的端口访问

维护建议

  1. 定期备份配置

    bash

    # 备份配置文件
    tar -czf frpc-backup-$(date +%Y%m%d).tar.gz /vol1/1000/frpc/*.ini
  2. 日志轮转:配置 logrotate 避免日志文件过大

  3. 监控告警:设置服务异常时的告警机制

  4. 性能优化:根据实际负载调整连接参数

高可用考虑

  1. 多实例部署:在不同服务器部署 FRPC 实例实现冗余

  2. 健康检查:定期检查服务状态并自动恢复

  3. 负载均衡:结合多个 FRPS 服务器实现负载分担

总结

通过本文的详细指导,你可以成功在 Linux 系统上配置和管理多个 FRPC 实例。关键要点包括:

  1. 规范的目录结构 便于文件管理

  2. 正确的配置文件转换 从 TOML 到 INI 格式

  3. Systemd 服务集成 实现开机自启和方便管理

  4. 统一的管理脚本 简化日常操作

  5. 完善的监控维护 确保服务稳定运行

这种多实例架构不仅提高了服务的可靠性,还为不同业务需求提供了灵活的代理方案。通过遵循本文的最佳实践,你可以构建一个稳定、可维护的 FRP 客户端环境。

动物装饰