上周文章我们使用Go Module配置项目,做了一个基于gin的Hello World,今天我们把这个项目部署到树莓派上,作为我们的一个服务,这样带来了一个问题,树莓派一般在家里放着,我怎么能访问到呢?今天的文章就解决这个问题。
首先,我们编译一下上次的项目,使之能够在树莓派上运行,go build直接支持交叉编译,执行下面的命令
GOARCH=arm GOOS=linux go build main.go
在树莓派的/home/pi目录下创建一个test目录
cd ~
mkdir test
使用scp命令将编译出来的main传到树莓派上
scp main pi@树莓派IP:/home/pi/test
树莓派上运行main,启动服务,这样就可以通过树莓派的IP访问到服务了。先终止程序,接下来,我们编写一个服务文件,使这个服务作为系统服务启动。
[Unit]
Description=test api
Wants=network-online.target
After=network-online.target
[Service]
Restart=on-failure
RestartSec=5s
WorkingDirectory=/home/pi/test/
ExecStart=/home/pi/test/main
[Install]
WantedBy=multi-user.target
将该文件放在/etc/systemd/system目录下,命名为test.service,然后执行下面的命令
sudo systemctl daemon-reload
sudo systemctl enable test.service
sudo systemctl start test.service
服务就创建好了,而且可以自启动。可以尝试访问一下。可是,如果我在公司,想访问到这个服务,那该怎么办?更进一步,我希望ssh访问树莓派,又该怎么办?这时候可以使用ssh反向代理。关于反向代理的原理学习,可以看看这篇文章。下面我们开始实际操作,前提需要有一个性能不需要太好,网络带宽足够且可以公网访问或者具备域名的计算机或者树莓派。
首先登录这台公网可访问的机器,编辑/etc/ssh/sshd_config文件,修改
GatewayPorts yes
重启ssh服务
sudo systemctl restart sshd
然后ssh登录树莓派,安装autossh
sudo apt-get install autossh
配置免密登录,在树莓派上执行
ssh-copy-id -i .ssh/id_rsa.pub 用户名@公网服务器ID
编写一个autossh-tunnel.service文件,放在/etc/systemd/system
[Unit]
Description=AutoSSH tunnel service - SSH
After=network.target
[Service]
Environment="AUTOSSH_GATETIME=0"
ExecStart=/usr/bin/autossh -M 10030 -o "ServerAliveInterval=5" -o "ServerAliveCountMax=2" -o "ExitOnForwardFailure yes" -NR 18080:localhost:8080 -NR 10022:localhost:22 -p22 公网主机用户名@公网主机IP
User=pi
[Install]
WantedBy=multi-user.target
同样需要启动服务
sudo systemctl daemon-reload
sudo systemctl enable autossh-tunnel
sudo systemctl start autossh-tunnel
这样,通过公网主机就能访问到树莓派上8080端口的服务和ssh了。如果访问8080端口服务,可以使用
http://公网主机IP:18080/ping
如果访问ssh,可以使用命令
ssh pi@公网主机IP -p10022
ssh我们平时经常用,没想到它还有这样巧妙的功能,所以再小的再熟悉的事物,多去了解,都会有让我们惊艳的地方。