配置开机自启服务重启自动恢复中转服务
中转服务(如 frp、nps 或 socat)在服务器重启后若没有配置开机自启,会导致内网穿透、端口映射等功能中断,需要手动恢复。
本文以 frp 客户端为例,教你用 systemd 创建服务单元,让中转服务在服务器崩溃或重启后自动启动并保持稳定运行。
适用场景与准备条件
- 适用场景:你使用 frp、nps、socat 等软件将内网服务暴露到公网,希望服务器每次重启后无需人工干预,自动恢复转发。
- 准备条件:
- 一台 Linux 服务器(CentOS 7+ / Ubuntu 16+,已用 systemd 管理服务)
- 中转服务二进制文件已下载到
/usr/local/bin/(如 frpc) - 配置文件已准备(如
/etc/frp/frpc.toml) - 拥有 root 权限(或使用 sudo)
第一步:编写 systemd 服务单元
systemd 是大多数现代 Linux 发行版的初始系统(PID 1),它负责管理系统服务的启动和监控。
通过编写一个 .service 文件,可以定义中转程序的运行方式、重启策略和开机启动时机。
- 创建一个 frpc.service 文件(如果使用其他中转程序,替换对应名称):
sudo tee /etc/systemd/system/frpc.service <
参数说明:
After=network-online.target:确保网络完全就绪后再启动 frpc(避免刚启动时网络未通导致连接失败)。Restart=on-failure:仅当进程异常退出时自动重启,正常停止(如systemctl stop)不会触发自动重启。RestartSec=5s:每次重启前等待 5 秒,防止频繁重启。User=nobody:以低权限用户运行,降低安全风险(可根据需要改为其他用户)。LimitNOFILE=1048576:提高文件描述符限制,避免高并发连接时资源不足。
- 配置文件权限:
sudo chmod 644 /etc/systemd/system/frpc.service
第二步:启用并启动服务
- 重新加载 systemd 配置,使新单元生效:
sudo systemctl daemon-reload
- 设置开机自启:
sudo systemctl enable frpc.service
- 立即启动服务:
sudo systemctl start frpc.service
- 检查服务状态:
sudo systemctl status frpc.service
输出应该显示 Active: active (running),且 Enabled: enabled 表示已设置开机自启。
第三步:验证重启后自动恢复
- 手动重启服务器:
sudo reboot
- 等待服务器重新上线,登录后检查 frpc 是否已自动运行:
sudo systemctl is-active frpc.service # 应返回 active
sudo systemctl is-enabled frpc.service # 应返回 enabled
- 也可以通过查看日志确认启动状态:
sudo journalctl -u frpc.service -n 20 --no-pager
避坑指南(常见错误及解决方法)
- 服务启动后立即退出:常见原因是配置文件路径错误或权限不足。检查
ExecStart里的二进制路径和配置路径是否正确,使用-c参数指定配置文件;同时确认二进制有执行权限(chmod +x /usr/local/bin/frpc)。 - 网络未就绪导致连接失败:如果 frp 服务端要求严格时序,可将
After=network-online.target改为After=network.target或添加Requires=network-online.target,但通常After加Wants已足够。 - 多次重启后服务被 systemd 抑制:如果进程在短时间内反复崩溃,systemd 会限制重启频率。可以调整
StartLimitIntervalSec=60和StartLimitBurst=5参数,或直接使用Restart=always(不建议,除非明确知道进程属于“守护式”工作模式)。 - 用户权限问题:如果中转服务需要读写某些系统文件(如日志、socket 文件),使用
User=nobody可能导致没有写入权限。建议为服务创建专用用户frp,并赋予对应目录的权限。
常见问题解答(FAQ)
Q1:除了 frp,其他中转工具(如 nps、socat)也能用同样的方法实现开机自启吗?
可以。
只需将 ExecStart 中的命令改为对应工具的启动命令,调整配置路径即可。
例如 nps 客户端:ExecStart=/usr/local/bin/npc -server=xxx -vkey=xxx。
Q2:我不想用 systemd,还有其他简单的方法吗?
可以使用 /etc/rc.local(需要确保该脚本有执行权限且 rc-local.service 已启用),
在其中添加启动命令,
但 systemd 是更现代、
更推荐的方式,
支持自动重启和日志管理。
Q3:如何让服务在掉线后自动重连而不是重启动?
部分中转工具(如 frp 的 auto_connect 配置)内部有重连机制;
结合 systemd 的 Restart=on-failure 可以在进程退出的情况下兜底。
如果你的中转工具以守护进程方式运行(如 nohup),建议改用 systemd 统一管理。
Q4:服务日志在哪里看?
systemd 管理的服务日志统一由 journald 管理,执行 journalctl -u 服务名 查看。
也可以修改配置文件中的日志输出到文件(通过 ExecStart 中的重定向 >> /var/log/frpc.log 2>&1),但建议优先使用 journalctl。