https://github.com/fatedier/frp/releases/download/v0.37.0
amd版本:https://github.com/fatedier/frp/releases/download/v0.37.0/frp_0.37.0_linux_amd64.tar.gz
tar -zxvf frp_0.37.0_linux_amd64.tar.gz
mv frp_0.37.0_linux_amd64 frp
修改frps.ini
[common]
bind_port = 7000
dashboard_port = 7500
token = [email protected]
dashboard_user = admin
dashboard_pwd = [email protected]
vhost_http_port = 10080
vhost_https_port = 10443
./frps -c frps.ini
[common]
server_addr = frp.test.cn
server_port = 7000
token = [email protected]
[ubuntu_ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 7101
[ubuntu_nginx]
type = tcp
local_ip = 127.0.0.1
local_port = 7102
remote_port = 7102
# 解决应用无法获取真实ip目前支持 v1 和 v2 两个版本的 proxy protocol 协议。
proxy_protocol_version = v2
[ubuntu_mysql]
type = tcp
local_ip = 127.0.0.1
local_port = 3306
remote_port = 7103
[ubuntu_redis]
type = tcp
local_ip = 127.0.0.1
local_port = 6379
remote_port = 7104
[ubuntu_rabbitmq_5637]
type = tcp
local_ip = 127.0.0.1
local_port = 5672
remote_port = 7105
[ubuntu_rabbitmq_15672]
type = tcp
local_ip = 127.0.0.1
local_port = 15672
remote_port = 7106
[ubuntu_es_9200]
type = tcp
local_ip = 127.0.0.1
local_port = 9200
remote_port = 9200
[ubuntu_logstash_5044]
type = tcp
local_ip = 127.0.0.1
local_port = 5044
remote_port = 5044
[ubuntu_kibana_5601]
type = tcp
local_ip = 127.0.0.1
local_port = 5601
remote_port = 5601
[ubuntu_sentinel_8858]
type = tcp
local_ip = 127.0.0.1
local_port = 8858
remote_port = 8858
[ubuntu_emqx_1884]
type = tcp
local_ip = 127.0.0.1
local_port = 1884
remote_port = 1884
[ubuntu_wx_7443]
type = tcp
local_ip = 127.0.0.1
local_port = 7443
remote_port = 7443
# 目前支持 v1 和 v2 两个版本的 proxy protocol 协议。
proxy_protocol_version = v2
nohup ./frps -c frps.ini &
打开目录
root@sony-HP-Notebook:~# cd /usr/local/frp/systemd
root@sony-HP-Notebook:/usr/local/frp/systemd# ls -l
总用量 16
-rw-r--r-- 1 1001 docker 263 6月 3 2021 frpc.service
-rw-r--r-- 1 1001 docker 257 6月 3 2021 [email protected]
-rw-r--r-- 1 1001 docker 210 6月 3 2021 frps.service
-rw-r--r-- 1 1001 docker 208 6月 3 2021 [email protected]
cp -rp /usr/local/frp/systemd/frpc.service /etc/systemd/system/
重点是frpc的路径,以及失败重试
[Unit]
Description=Frp Client Service
After=network.target
[Service]
Type=simple
User=nobody
Restart=on-failure
RestartSec=5s
ExecStart=/usr/local/frp/frpc -c /usr/local/frp/frpc.ini
ExecReload=/usr/local/frp/frpc reload -c /usr/local/frp/frpc.ini
[Install]
WantedBy=multi-user.target
Systemctl daemon-reload
systemctl enable frpc.service
systemctl status frpc.service
# 启动
systemctl start frpc.service
参考:Ubuntu 20.04 设置开机自启脚本
rc-local.service 是系统自带的一个开机自启服务, 但是在 Ubuntu20 的 systemd 启动方式下,该服务默认没有开启。,启用它需要做些简单的配置。
在 路径下 /lib/systemd/system/rc-local.service 的 rc-local.service 的脚本,内容规定了 rc.local 的启动顺序和行为
在 路径下 /lib/systemd/system/rc-local.service 查看 rc-local.service 文件内容, 前面注释不看了,只看主要内容, 每个字段的解释
[Unit] # 区块:启动顺序与依赖关系
Description=/etc/rc.local Compatibility # 服务的描述,方便人们阅读
Documentation=man:systemd-rc-local-generator(8) # 一组用空格分隔的文档URI列表,这些文档是对此单元的详细说明
ConditionFileIsExecutable=/etc/rc.local # 指定了执行的文件, 表示服务要启动的程序(或脚本)
# 系统会检测指定的路径是否存在并且是一个可执行文件,必须使用绝对路径
After=network.target # 定义启动顺序。示该服务的依赖关系
# Before=xxx.service,代表本服务在xxx.service启动之前启动;
# After=xxx.service,代表本服务在xxx.service之后启动。
[Service] # 区块:启动行为,如何启动,启动类型。
Type=forking # 后台运行的形式
ExecStart=/etc/rc.local start # 指定启动单元的命令或者脚本, 启动服务的命令(命令必须写绝对路径)
TimeoutSec=0
RemainAfterExit=yes # 如果设置这个选择为真,服务会被认为是在激活状态
GuessMainPID=no
#这一段原文件没有,需要自己添加
[Install] # 区块,定义如何安装这个配置文件,即怎样做到开机启动
WantedBy=multi-user.target # WantedBy:表示该服务所在的 Target(服务组)
# multi-user.target 表示多用户命令行状态
Alias=rc-local.service # 指的是表示该服务所属 target
原本的文件是没有[Install] 所以我们需要增加[Install] 内容
最终内容为如下,注意切记不要有中文注释:
[Unit]
Description=/etc/rc.local Compatibility
Documentation=man:systemd-rc-local-generator(8)
ConditionFileIsExecutable=/etc/rc.local
After=network.target
[Service]
Type=forking
ExecStart=/etc/rc.local start
TimeoutSec=0
RemainAfterExit=yes
GuessMainPID=no
[Install]
WantedBy=multi-user.target
Alias=rc-local.service
上述命令只写了启动的,重启、停止等可以根据自己情况添加。
注意:启动、重启、停止命令全部要求使用绝对路径
ExecReload 为服务的重启命令
ExecStop 为服务的停止命令
PrivateTmp=True 表示给服务分配独立的临时空间
原始的 rc-local .service 文件的 Unit 段有行代码:
ExecStart=/etc/rc.local start
这行代码规定了这个service在开机启动时所执行的命令是:/etc/rc.local start。即运行 /etc/rc.local 脚本。不过可以看出,这个脚本的内容少了 [Install] 段,也就是说,没有定义如何做到开机启动,所以显然这是这个service是无效的。 因此我们就需要在后面帮他加上 [Install] 段
sudo vim /lib/systemd/system/rc-local.service
systemd 默认读取 /etc/systemd/system 下的配置文件, 所以还需要在 /etc/systemd/system 目录下创建软链接,执行下面的命令
$ sudo systemctl enable rc-local.service
Created symlink /etc/systemd/system/multi-user.target.wants/rc-local.service → /lib/systemd/system/rc-local.service.
# 上面的命令等效于一个软链接命令
ln -s /lib/systemd/system/rc-local.service /etc/systemd/system/rc-local.service
这条指令的实际意义是向 /etc/systemd/system 中添加一个 /lib/systemd/system 的软链接(软链接可以理解为快捷方式),看终端中这条指令运行后打印的信息就知道了。
systemd 默认从目录 /etc/systemd/system 读取配置文件。但是,里面存放的大部分文件都是符号链接,指向目录
/lib/systemd/system,真正的配置文件存放在这个目录。systemclt enable
命令用于在上面两个目录之间建立符号链接关系。.service 文件在 Linux
中存在于三个位置:/etc/systemd/system、/run/systemd/system、/lib/systemd/system,这三个目录的配置文件优先级依次从高到低,如果同一选项三个地方都配置了,优先级高的会覆盖优先级低的。另外:经过实际测试,不使用 systemclt enable 指令创建链接这一步其实也是可以实现开机启动的,这可能跟系统会在上述三种
system 目录下查找 service 并启动有关,只是启动顺序不同而已。
Ubuntu 20.04 默认不存在 /etc/rc.local,需要自己创建 touch /etc/rc.local,rc.local 中主要有两种方法添加开机启动内容
当前文件是 /usr/local/job/start.sh, start.sh 的内容是
#!/bin/sh
logFile='/usr/local/job/start_frp.log'
ltime=$(date "+%Y-%m-%d %H:%M:%S")
echo "${ltime} frp start ***********" >> "${logFile}"
./frpc -c frpc.ini &
echo "${ltime} frp started" >> "${logFile}"
cd /usr/local/job
./start.sh &
echo "${ltime} job started" >> "${logFile}"
exit 0
#!/bin/bash
# 将你需要执行的命令写在这里,禁止写入死循环命令
logFile='/usr/local/start.log'
ltime=$(date "+%Y-%m-%d %H:%M:%S")
echo "${ltime} 看到这行字,说明添加自启动脚本成功。" > "${logFile}"
cd /usr/local/job
./start.sh &
echo "${ltime} job started" >> "${logFile}"
exit 0
注意:调用 sh 脚本最后必须加上 & 是让脚本启动后在后台运行的作用, 否则可能会一直卡在开机界面,这个没有去测试过
sudo chmod 777 /etc/rc.local
# 或者
sudo chmod +x /etc/rc.local
使用 sudo systemctl status rc-local.service 查看 rc-local 服务的状态, 显示 loaded 和 enabled。