frp - 自动化 实战技巧
发布时间:2026-05-01 10:01
frp内网穿透自动化:服务自启、进程守护与监控脚本实战,告别frp断线需要手动重启的烦恼。
一、前言
搞过frp的人都知道,最烦的不是配置,难的是frp客户端动不动就断线,断了你还得手动去重启服务。特别是机器多的时候,一个个登录去重启简直要命。本篇聊透frp自动化那点事,从systemd服务到进程守护脚本,一次性搞定。
二、操作步骤
步骤1:安装frp客户端
先确保frp客户端已经安装好,假设你已经在服务器上下载了对应版本的frp。
# 下载frp(以0.52.0版本为例,根据架构选择)
# AMD64架构
wget https://github.com/fatedier/frp/releases/download/v0.52.0/frp_0.52.0_linux_amd64.tar.gz
tar -xzf frp_0.52.0_linux_amd64.tar.gz
cd frp_0.52.0_linux_amd64
# 将frp移动到系统目录
sudo mv frpc /usr/local/bin/
sudo mv frpc.ini /etc/frp/
sudo chmod +x /usr/local/bin/frpc
预期输出:
frpc.ini frpc_full.ini LICENSE systemd
./systemd/frpc.service
frpc /usr/local/bin/frpc
步骤2:创建systemd服务单元文件(CentOS/RHEL)
在CentOS/RHEL系统下,创建标准的systemd服务文件来管理frpc。
sudo cat > /etc/systemd/system/frpc.service << 'EOF'
[Unit]
Description=Frp Client Service
After=network.target
[Service]
Type=simple
User=root
ExecStart=/usr/local/bin/frpc -c /etc/frp/frpc.ini
Restart=on-failure
RestartSec=5
TimeoutStartSec=10
TimeoutStopSec=10
[Install]
WantedBy=multi-user.target
EOF
预期输出:
# 执行后无输出,创建成功
# 验证文件内容
cat /etc/systemd/system/frpc.service
[Unit]
Description=Frp Client Service
After=network.target
[Service]
Type=simple
User=root
ExecStart=/usr/local/bin/frpc -c /etc/frp/frpc.ini
Restart=on-failure
RestartSec=5
TimeoutStartSec=10
TimeoutStopSec=10
[Install]
WantedBy=multi-user.target
步骤3:创建systemd服务单元文件(Ubuntu/Debian)
Ubuntu系统路径相同,但需要注意systemd版本兼容性。
# Ubuntu下同样的服务文件,但建议添加额外检查
sudo cat > /etc/systemd/system/frpc.service << 'EOF'
[Unit]
Description=Frp Client Service
Documentation=https://github.com/fatedier/frp
After=network-online.target
Wants=network-online.target systemd-networkd-wait-online.service
[Service]
Type=simple
User=root
ExecStart=/usr/local/bin/frpc -c /etc/frp/frpc.ini
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
RestartSec=5
LimitNOFILE=65536
# 安全加固
NoNewPrivileges=true
ProtectSystem=strict
ProtectHome=true
ReadWritePaths=/etc/frp /var/log
[Install]
WantedBy=multi-user.target
EOF
预期输出:
# 重载systemd配置
sudo systemctl daemon-reload
# 设置开机自启
sudo systemctl enable frpc
Created symlink /etc/systemd/system/multi-user.target.wants/frpc.service → /etc/systemd/system/frpc.service.
步骤4:编写自动重连监控脚本
⚠️ 警告:以下脚本会执行进程检查和重启操作,生产环境使用前请先在测试环境验证。
sudo cat > /usr/local/bin/frpc_monitor.sh << 'EOF'
#!/bin/bash
# frpc进程监控与自动重启脚本
# 建议通过cron定期执行:*/5 * * * * /usr/local/bin/frpc_monitor.sh >> /var/log/frpc_monitor.log 2>&1
PROCESS_NAME="frpc"
LOG_FILE="/var/log/frpc_monitor.log"
FRPC_BIN="/usr/local/bin/frpc"
FRPC_CONFIG="/etc/frp/frpc.ini"
log_msg() {
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> $LOG_FILE
}
# 检查进程是否存在
if ! pgrep -f "$PROCESS_NAME -c $FRPC_CONFIG" > /dev/null; then
log_msg "frpc进程未运行,正在启动..."
# 启动frpc
$FRPC_BIN -c $FRPC_CONFIG >> /var/log/frpc.log 2>&1 &
sleep 3
# 验证启动是否成功
if pgrep -f "$PROCESS_NAME -c $FRPC_CONFIG" > /dev/null; then
log_msg "frpc启动成功,PID: $(pgrep -f "$PROCESS_NAME -c $FRPC_CONFIG")"
else
log_msg "frpc启动失败,请检查日志 /var/log/frpc.log"
fi
else
log_msg "frpc进程运行正常,PID: $(pgrep -f "$PROCESS_NAME -c $FRPC_CONFIG")"
fi
EOF
sudo chmod +x /usr/local/bin/frpc_monitor.sh
预期输出:
# 测试脚本执行
sudo /usr/local/bin/frpc_monitor.sh
# 查看日志
cat /var/log/frpc_monitor.log
2024-01-15 10:30:01 - frpc进程未运行,正在启动...
2024-01-15 10:30:04 - frpc启动成功,PID: 12345
步骤5:配置crontab定时任务
设置每5分钟执行一次监控脚本,实现自动检测和重启。
# 编辑crontab
sudo crontab -e
# 添加以下行(每5分钟检测一次)
*/5 * * * * /usr/local/bin/frpc_monitor.sh >> /var/log/frpc_monitor.log 2>&1
# 或者直接追加
echo '*/5 * * * * /usr/local/bin/frpc_monitor.sh >> /var/log/frpc_monitor.log 2>&1' | sudo tee -a /var/spool/cron/crontabs/root
# 验证crontab配置
sudo crontab -l
预期输出:
# crontab -l 输出
# Edit this file to introduce tasks to be run by cron.
#
# /etc/crontab: system-wide crontab
...
*/5 * * * * /usr/local/bin/frpc_monitor.sh >> /var/log/frpc_monitor.log 2>&1
步骤6:启动服务并验证状态
完成所有配置后,启动frpc服务并验证运行状态。
# 启动frpc服务
sudo systemctl start frpc
# 查看服务状态
sudo systemctl status frpc
预期输出:
● frpc.service - Frp Client Service
Loaded: loaded (/etc/systemd/system/frpc.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2024-01-15 10:35:00 CST; 5s ago
Main PID: 12888 (frpc)
Tasks: 5 (limit: 4915)
Memory: 8.5M
CPU: 112ms
CGroup: /system.slice/frpc.service
└─12888 /usr/local/bin/frpc -c /etc/frp/frpc.ini
Jan 15 10:35:00 server systemd[1]: Started Frp Client Service.
# 查看frpc进程
ps aux | grep frpc
root 12888 0.0 0.2 12345 6789 ? S 10:35 0:00 /usr/local/bin/frpc -c /etc/frp/frpc.ini
# 查看端口监听(假设配置了SSH穿透)
netstat -tlnp | grep frpc
tcp 0 0 0.0.0.0:6000 0.0.0.0:* LISTEN 12888/frpc
步骤7:配置日志轮转防止磁盘占满
日志文件会不断增长,需要配置logrotate进行自动轮转。
# 创建logrotate配置
sudo cat > /etc/logrotate.d/frpc << 'EOF'
/var/log/frpc.log /var/log/frpc_monitor.log {
daily
missingok
rotate 7
compress
delaycompress
notifempty
create 0644 root root
sharedscripts
postrotate
systemctl reload frpc > /dev/null 2>&1 || true
endscript
}
EOF
预期输出:
# 测试logrotate配置
sudo logrotate -d /etc/logrotate.d/frpc
验证后会显示模拟执行的日志轮转操作,确认配置正确后正式生效。
三、常见问题FAQ
Q1:frpc进程在后台运行,但systemctl status显示failed怎么办?
这种情况一般是配置文件中存在语法错误或者端口被占用。先别急着重启,直接看日志:
# 查看详细错误信息
sudo journalctl -u frpc -n 50 --no-pager
# 常见原因排查
# 1. 检查端口占用
sudo netstat -tlnp | grep <端口号>
# 2. 检查配置文件语法
/usr/local/bin/frpc -c /etc/frp/frpc.ini --check
Q2:监控脚本检测不到frpc进程,但ps明明能看到?
pgrep匹配的问题,你的frpc启动参数和脚本里写的不一致就会匹配失败。改用更宽松的匹配方式:
# 把这行:
if ! pgrep -f "$PROCESS_NAME -c $FRPC_CONFIG" > /dev/null; then
# 改成这样:
if ! pgrep -f "frpc" > /dev/null; then
或者直接用pgrep不带任何参数,只要进程名包含frpc就能匹配到。
Q3:服务器重启后frpc没自启,什么情况?
先确认enable过没有,别以为配置了service文件就自动enable了:
# 检查是否enable
systemctl is-enabled frpc
# 如果没enable,执行
systemctl enable frpc
# 如果enable了还是不启动,检查network依赖是否正确
systemctl list-dependencies frpc
有些云服务器网络服务启动慢,frpc配置了After=network.target可能等不到网络就启动失败了,建议改成After=network-online.target。
Q4:如何实现frpc配置热重载不用重启服务?
新版frpc支持热重载SIGHUP信号,直接改配置文件然后发信号:
# 修改配置后,执行
sudo kill -HUP $(pgrep frpc)
# 查看输出确认重载成功
sudo journalctl -u frpc --no-pager -n 10
四、总结
frp自动化核心三板斧:systemd服务管理+监控脚本+cron定时检测。搞完这套,frp断线你自己都不知道什么时候断的,系统自己就拉起来了。要点记住:服务文件配置Restart=on-failure是灵魂,监控脚本匹配进程别太严格,日志轮转一定要配不然磁盘早晚会满。
延伸阅读: