利用内网穿透访问内网树莓派CentOS的前后端分离项目

418 阅读11分钟

树莓派4B利用SD卡安装CentOS 7.9,docker拉起前后端分离项目,实现内网穿透访问

环境:

(1)一台华为云服务器:CentOS 7.9 + frp服务端 + 公网IP

(2)一台家庭树莓派4B:CentOS 7.9 + frp客户端 + docker(mysql,redis,nginx) + java

一、下载系统

mirrors.tuna.tsinghua.edu.cn/centos-alta…

image.png

从清华云镜像下载树莓派4b的centos 7.9镜像,解压得到raw文件,备用。

二、格式化tf卡

将tf插入SD适配器,连接上电脑, 使用内存卡修复工具SDFormatter.exe,将tf格式化,不要使用电脑自带的格式化,没用。

image.png image

三、烧录系统至tf卡

使用win32diskimager-1.0.0-install.exe烧入tf卡

image.png

四、扩展TF容量

利用diskgenius扩展后的容量如图

image.png

在SD卡根目录创建名称为SSH的文件(要先扩容再修改根目录里面的文件,否则在diskgenius会报错)

五、在家庭局域网下发现树莓派,并有线连接(无线连接后期更新)

有线连接完成之后,需要登录家里路由器的主页查看(这个需要自行百度路由器型号),我是用的华硕路由器,主页地址为router.asus.com,登录账户admin,密码123456,查看到树莓派的ip之后进行下一步。

image.png

我是用的有线连接,连接之后利用另一台在同一个局域网下的电脑,启动xshell软件,新建会话,输入用户名root密码centos;

进来之后首先查看磁盘的情况,命令df -h:

image.png

我的SD卡是16G的,扩容完毕这个/dev/root会接近16G,证明已经扩容完成了,到这里烧录系统之后产生的容量变小问题已经解决了。

六、将项目部署到内网服务器上,并且跑起来

这里参见我的掘金文章《MathChina项目部署文档》

关于树莓派arm下centos的docker-compose安装在这里着重说明几点:

这个是真滴麻烦 麻烦还好说 还一堆bug首先先安装一些常用的系统命令

先更新一下yum,运行

yum upgrade
yum -y install vim python3-devel python3-pip epel-release
yum -y install gcc automake autoconf libtool make
pip3 install --upgrade pip
pip3 install docker-compose

然后就是使用pip形式进行docker-compose进行下载 在arm端只能使用这种形式 不能使用其他形式 在这里强烈建议使用pip3 进行安装

运行pip3安装docker-compose时候,pynacl这个python系列的东西会卡住,你再开一个ssh窗口试试把它安装上基本就解决了

树莓派出现一下图片,安装docker-compose成功

image.png

image.png

然而,我又遇到了新的错误,再根据项目部署文档docker-compose up -d时,woc:::

image.png

上面这个问题是因为配置文件里面的mysql的image不适合arm架构,我们要安装下面这个:

mysql:
    image: biarms/mysql:latest

再后来报了一个错如图

image.png

拉起我自己的jar包失败了,查询原因是docker-compose版本太高了,我服了我好不容易安装好的docker-compose,卸载:

mysql:
    image: biarms/mysql:latest

卸载完成!

image.png

安装docker-compose的1.26.2版本

image.png

好家伙docker也卸载了5.0.3,换了一个4.4.4

这样再拉一下镜像试试

image.png

不出意外,又来了,去百度如何关闭SELinux

image.png

然后将--selinux-enabled 删除 或者--selinux-disabled

然后esc键:wq保存退出,再拉一下试试

直接拉不起来了

先安装jdk8

blog.csdn.net/qq_40826978…

利用java -jar系列命令拉起来

nohup java -jar pack-0.0.1-SNAPSHOT.jar > log.file 2>&1 &

不知道为啥别的写法不行,只能用这个了,定时上来清理一下log日志就行了,根目录如下

image.png

七、家里服务器关机之后再次拉起前后端项目(和以前非穿透项目不同,我这个项目的jar是单独拉起的,而redis,mysql,nginx是在docker的image里面拉起)

systemctl stop firewalld(关闭防火墙)
docker-compose up -d
nohup java -jar pack-0.0.1-SNAPSHOT.jar > log.file 2>&1 &
cd /root/frp/frp_0.38.0_linux_arm
nohup ./frpc -c ./frpc.ini > frplog.file 2>&1 &

(1)如果遇见:docker-compose失败的时候试试

sudo systemctl daemon-reload
sudo systemctl restart docker
sudo chmod +x /usr/local/bin/docker-compose

(2)如果遇见:certificate has expired or is not yet valid失败的时候试试

在docker拉取镜像时出现 x509 报错,一般都是证书问题或者系统时间问题导致,可以先执行看一下系统时间对不对,如果服务器系统时间跟现实实际时间对不上的话,一般就是系统时间问题,同步时间即可。

date
yum -y install ntpdate
ntpdate cn.pool.ntp.org

八、利用云服务器和frp实现内网穿透

frp下载:pan.baidu.com/s/1H8tANWFB…

提取码:1brk

(1)安装frp。树莓派关闭防火墙,华为云打开对应端口

双端的frp版本必须一致!!!

华为云是x86架构服务器,需要amd64版本,树莓派是arm架构,需要arm版本

利用xftp文件传输到/root/frp下,执行解压,进入对应文件夹

image.png

mkdir /root/frp
cd /root/frp
tar -zxvf  frp_0.38.0_linux_amd64.tar.gz(华为云)
tar -zxvf  frp_0.38.0_linux_arm.tar.gz(树莓派)
cd frp_0.38.0_linux_amd64(华为云)
cd frp_0.38.0_linux_arm(树莓派)

进入解压目录,这里主要关注4个文件,分别是frpc、frpc.ini和frps、frps.ini,前者两个文件是客户端所关注文件,后者两个文件是服务端所关注两个文件

(2)在云服务器和内网服务器编写配置文件

云服务器配置文件

[common]
bind_port = 7000
vhost_http_port = 8080
dashboard_addr = 0.0.0.0
dashboard_port = 7500
dashboard_user = (自己命名)
dashboard_pwd = (自己命名)

image.png

内网服务器(树莓派)配置文件(前后端分离了,就不要像网上的那些frp教程一样只拉http的,不拉后端了,必然会访问不了,这一步值50-100块钱,我自己花钱找人问的)

[common]
server_addr = (华为云公网IP)
server_port = 7000

[web](为了访问网站前端,http必须要有域名)
type = http
custom_domains = (华为云公网IP)
local_ip = (家里树莓派私网IP)
local_port = 80


[web2](为了访问网站后端,这里利用tcp,就不需要指定域名了,并且公网端口7777不能和私网8088一样)
type = tcp
local_ip = (家里树莓派私网IP)
local_port = 8088
remote_port = 7777

由于跨域请求,所以Vue的文件要稍作修改(以我自己项目为例,他需要和穿透到公网的后端进行交互所以是公网IP加公网端口)

image.png

切记先拉服务端,再拉客户端!!!

(3)云服务器centos server端命令

遇到端口占用要在两个服务器都释放端口进行下线

image.png

netstat -tln(检查端口占用)
lsof -i :7000(查看进程号PID,树莓派需要yum install lsof)
kill -9 23801(释放7000端口,这个进程PID根据自己修改)
cd /root/frp/frp_0.38.0_linux_amd64
nohup ./frps -c ./frps.ini > /dev/null 2>&1 &(运行这个命令需要进入frp路径里面,这个命令是不存放日志文件)
nohup ./frps -c ./frps.ini > frplog.file 2>&1 &(运行这个命令需要进入frp路径里面,这个命令是存放日志在frplog.file)
(4)家庭客户端内网服务器centos client端命令

遇到端口占用要在两个服务器都释放端口进行下线

netstat -tln(检查端口占用)
lsof -i :7000(查看进程号PID,树莓派需要yum install lsof)
kill -9 23801(释放7000端口)
cd /root/frp/frp_0.38.0_linux_arm
nohup ./frpc -c ./frpc.ini > frplog.file 2>&1 &
nohup ./frpc -c ./frpc.ini > /dev/null 2>&1 &

九、附录:frp配置文件字段合集

1、frpc客户端


[common]
server_addr = www.yourdomain.com 
#frps服务端地址
server_port = 7000
#frps服务端通讯端口,客户端连接到服务端内网穿透传输数据的端口
privilege_token = frp888
#特权模式密钥,客户端连接到FRPS服务端的验证密钥
log_file = frpc.log
#日志存放路径
log_level = info
#日志记录类别,可选:trace, debug, info, warn, error
log_max_days = 7
#日志保存天数
login_fail_exit = false
#设置为false,frpc连接frps失败后重连,默认为true不重连
protocol = kcp
#KCP协议在弱网环境下传输效率提升明显,但是对frps会有一些额外的流量消耗。服务端须先设置kcp_bind_port = 7000,www.yourdomain.com服务端已设置支持

[http_dsm]
#穿透服务名称,不能和其他已建立的相同,使用公共服务器的建议修改成复杂一点的名称,避免与其他人冲突,很多路由器内置frpc的默认服务名称为[web],很容易很其他人冲突
type = http
#穿透协议类型,可选:tcp,udp,http,https,stcp,xtcp,这个设置之前必须自行搞清楚应该是什么
local_ip = 192.168.1.2
#本地监听IP,可以是本机IP,也可以是本地的局域网内某IP,例如你的局域网是互通的,你可以在路由器上安装frpc,然后local_ip填的内网其他机器ip,这样也可以把内网其他机器穿透出去
local_port = 5000
#本地监听端口,通常有ssh端口22,远程桌面3389等等
use_compression = true
#对传输内容进行压缩,可以有效减小 frpc 与 frps 之间的网络流量,加快流量转发速度,但是会额外消耗一些 cpu 资源
use_encryption = true
#将 frpc 与 frps 之间的通信内容加密传输
custom_domains = dsm.yourdomain.com
#自定义域名访问穿透服务,一般域名设置了二级域名泛解析以后,这里填*.yourdomain.com即可,*自定义,如果不想用域名或者自行搭建frps没有域名,则穿透协议类型选择tcp,见以下tcp部分详解
#通过app访问的注意,DS file,DS video,DS audio,DS finder里地址栏默认都是5000端口,穿透后地址栏须填写为【穿透域名:80】,DS photo由于本地local_port为80,穿透后也为80的话直接写域名地址即可

[https_dsm]
type = https
local_ip = 192.168.1.2
local_port = 5001
use_compression = true
use_encryption = true
custom_domains =  dsm.yourdomain.com
#以上https配置同http,注意开启https(默认5001端口),证书配置在客户端,无证书的注意浏览器访问时添加信任

[http_transmission]
type = http
local_ip = 192.168.1.2
local_port = 9091
use_compression = true
use_encryption = true
custom_domains = tr.yourdomain.com
#transmission下载客户端

[http_rutorrent]
type = http
local_ip = 192.168.1.2
local_port = 80
use_compression = true
use_encryption = true
custom_domains = rt.yourdomain.com
#rutorrent下载客户端,用Download Station的类似,注意端口


[http_blog]
type = http
local_ip = 192.168.1.2
local_port = 80
use_compression = true
use_encryption = true
custom_domains = blog.yourdomain.com


[http_plex]
type = http
local_ip = 192.168.1.2
local_port = 32400
use_compression = true
use_encryption = true
custom_domains = plex.yourdomain.com
#plex视频服务器

[https_feixun]
privilege_mode = true
type = http
local_ip = 192.168.1.1
#路由器ip
local_port = 80
use_compression = true
use_encryption = true
authentication_timeout = 0
custom_domains = feixun.yourdomain.com
#穿透路由器


[tcp_ssh]
#ssh连接
type = tcp
local_ip = 192.168.1.2
local_port = 22
use_compression = true
use_encryption = true
remote_port = 3463
#远程端口,一般tcp和udp需要设置,不需要设置custom_domain,访问时为【frps服务器地址+远程端口】,没有域名的用这种方式通过【frps服务器地址+远程端口】即可实现访问

[udp]
type = udp
local_ip = 192.168.1.2
local_port = 53
use_compression = true
use_encryption = true
remote_port = 3453
访问时为【frps服务器地址+远程端口】


2.frps服务端


[common]
bind_addr = 0.0.0.0
#服务器IP,0.0.0.0为服务器全局所有IP可用,假如你的服务器有多个IP则可以这样做,或者填写为指定其中的一个服务器IP,支持IPV6
bind_port = 7000
#通讯端口,用于和客户端内网穿透传输数据的端口,可自定义
bind_udp_port = 7001
#UDP通讯端口,用于点对点内网穿透
kcp_bind_port = 7000
#用于KCP协议UDP通讯端口,在弱网环境下传输效率提升明显,但是会有一些额外的流量消耗。设置后frpc客户端须设置protocol = kcp
vhost_http_port = 80
#http监听端口,注意可能和服务器上其他服务用的80冲突,比如centos有些默认有Apache,可自定义
vhost_https_port = 443
#https监听端口,可自定义
dashboard_port = 7500
#通过浏览器查看 frp 的状态以及代理统计信息展示端口,可自定义
dashboard_user = admin
#信息展示面板用户名
dashboard_pwd = admin
#信息展示面板密码
log_max_days = 7
#最多保存多少天日志
privilege_token = frp888
#特权模式认证密钥
privilege_allow_ports = 1-65535
#端口白名单,为了防止端口被滥用,可以手动指定允许哪些端口被使用
max_pool_count = 100
#每个内网穿透服务限制最大连接池上限,避免大量资源占用,可自定义
authentication_timeout = 0
#frpc 所在机器和 frps 所在机器的时间相差不能超过 15 分钟,因为时间戳会被用于加密验证中,防止报文被劫持后被其他人利用,单位为秒,默认值为 900,即 15 分钟。如果修改为 0,则 frps 将不对身份验证报文的时间戳进行超时校验。国外服务器由于时区的不同,时间会相差非常大,这里需要注意同步时间或者设置此值为0
log_file = frps.log
log_level = info