树莓派frp下Nginx反向代理实现https协议

何为frp?

我们的家里,宿舍通常是没有公网ip的,没有公网ip就相当于在互联网中没有门牌号,其他人不知道你的树莓派在那,那么就无法访问到树莓派上的服务啦。

如何解决呢?其实我们需要一个有公网ip第三方,当做一个桥梁,通过这个桥梁就可以从外网访问到你的树莓派了!

这个第三方可以是:花生壳,哲西云等等这样的内网穿透提供商!当然价格也不便宜。当然如果我们手上有一个vps,那么我们可以采用自己搭建内网穿透服务,我们可以采用开源项目 frp和NPS,当然我就介绍frp啦!

frp官方文档: https://gofrp.org/docs/

frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。

安装frp和配置开机自启我就不多说了,可以参考我的上一篇文章。

我简单介绍一下,准备的材料,简单的原理。

准备的材料

  1. 可以使用80,443端口的服务器 我这里采用的是阿里云轻量级服务器(香港,24元一个月),这里我强调一点的是:大陆地区由于一些不可抗拒的原因,使用80和443端口需要备案,非大陆地区就不用了,当然你有备案的大陆地区服务器是没问题的,大陆地区的服务器学生套餐一年购买可便宜了,我这边有一些原因导致我无法备案,所以无奈只能用这个了。备案算是有点麻烦的吧。

  2. 一个域名,买一个top或者其他域名不是很贵,我20块钱买了2年的,注意买域名的时候一定要名字起好,有buff加成。这里我采用的是我这个yingwiki.top域名下的二级域名blog.yingwiki.top。这个域名需要解析到vps

  3. frp 客户端和服务端 ,树莓派是arm架构,而服务器是amd64的所以下载的使用一定要注意

    注意版本

  4. 证书,我这里采用的我这里用的是Let’s Encrypt,毕竟免费,当然每3个月需要续签一次,我们可以安装certbot-auto来解决,安装这个的教程我就不写到这里,太多了。

  5. 足够的耐心和细心

补充

  • 我这里web服务部署的是halo博客系统,如果你也想安装halo博客到树莓派上,可以看我的这篇文章,部署halo到树莓派
  • 系统采用的是大佬的Kevin 宝塔镜像 使用极度方便

简单原理

http的默认端口是80,https的默认端口是443,所以我们日常在访问网站的时候都无需要加端口号,就想访问谷歌 www.google.com的时候没有这样访问吧,www.google.com:80。这里就有一个问题,服务器只有一个80,443端口,但是我一台服务器如何部署多个网页呢?其实可以将网页部署到别的没有使用的端口,例如8080,这样就可以你的域名:8080访问了但是多一个端口号非常不舒服。所以我们这里需要Nginx反向代理以下,将在我们访问80端口时,Nginx会根据我们访问的域名,接到不同端口中去!

我目前的服务器已经安装了一个web服务器了也就是我的博客,那么我如果想让树莓派上的web服务被互联网访问到,可以采取通过部署frps的服务器内网穿透,这样frp就想一个桥,我们可以通过frp访问树莓派上的web服务了,但是80,443已经被我用了,所以需要Nginx反向代理一下,服务器上的web服务和frp共用一个80,443端口

前面睡了那么多废话,如果你是个大佬的话,一句话解释就好了,用户访问nginx 80/443端口,nginx再去访问带非通用默认端口的frp地址返回给用户

安装

这里我就不多介绍了,我上一篇已经写过了,大家只需要看到,配置systemctl,设置开机自启之类的这里就足够了

配置开机自启的时候树莓派要root权限,所以先sudo -i,服务器直接用root用户就好了。

配置

frps 代表服务端,frp代表客户端

  1. 首先,我们要放开配置一下防火墙,由于我树莓派安装的是宝塔系统,所以配置起来异常方便

    我们肯需要准备一下几个端口

    自定义端口 要在0-65535之间 注意要避开常用的80,443等端口,建议自定义到1w以上!

    服务端

    • 80和443

    • frps服务的端口 ,这里我们可以采用开放 ,端口7000(注意,这个端口最好自定义一下,防止别人蹭网)

    • frps配置http端口 这里采用8080

    • frp的web管理页面的端口 7505 (注意,这个可以不要,为了安全端口也需要自定义)

image-20210119153318460

客户端

  • 本地的web服务端口 8080

image-20210119145044577

  1. 配置frp服务端配置文件

vi /usr/local/frp/frps.ini

   [common]
   # 设定的frp服务端端口
   bind_port = 7000
   
   #服务端看板的访问端口
   dashboard_port=7505
    #服务端看板账户
   dashboard_user=xxx
   #服务端看板账户密码
   dashboard_pwd= ******
   
   #自己设定的http访问端口
   vhost_http_port = 8080
   # 客服端最大连接数
   max_pool_count=5
   
   # 放和bind_port一样,用来减低延迟,不过额外消耗10%~20%流量 降低 tcp的延迟
   #kcp_bind_port = 7000

配置完毕启动

systemctl start frp

查看运行情况:

systemctl status frp,按下q退出,如下情况安装成功

image-20210119151459267

  1. 配置客户端配置文件(树莓派这边)

    vi /usr/local/frp/frpc.ini

    [common]
    #服务器IP地址
    server_addr = x.x.x.x
    #服务器端口,必须和frps.ini里的bind_port一样
    server_port = 7000
    #凭证token必须和frps.ini一样,
    privilege_token = *****
    # web这个就是名字而已可以随意设置
    [web]
    type = http
    local_ip = 127.0.0.1
    # Nginx的端口 
    remote_port = 80
    # 树莓派上的web端口
    local_port = 8080
    #自己的域名
    custom_domains = blog.yingwiki.top
    

    配置完毕启动

    systemctl start frp

    查看运行情况:

    systemctl status frp,按下q退出,如下情况安装成功

    image-20210119151751398

    到这一步,你可以浏览器输入你的域名:端口号访问你的博客服务了

  2. 配置Nginx

    这个证书我就不说了

    #重新定向到https
    server {
        listen       80;
    #自己的域名
        server_name  blog.yingwiki.top;
        rewrite ^(.*) https://$server_name$1 permanent;
        }
    #https 服务
    server 
    	{
    	      listen 443 ssl;
    #证书位置
      	ssl_certificate /usr/local/zs/fullchain.pem;
      	ssl_certificate_key /usr/local/zs/private.pem;
    #自己的域名
            server_name blog.yingwiki.top;
        location / {
            # 你的frp定义http端口和域名
            proxy_pass  http://blog.yingwiki.top:8080;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $http_host;
            proxy_set_header X-NginX-Proxy true;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_max_temp_file_size 0;
            proxy_redirect off;
            proxy_read_timeout 240s;
        }
        error_page   500 502 503 504  /50x.html; 
        location = /50x.html {
        root  
                /usr/share/nginx/html;
        }
    }
    

    配置完重载配置。

  3. 测试,收工

https://blog.yingwiki.top

blog

结语

其实这个我前天配置https的时候一直502,结果其实发现我们完全不需要配置到frp配置https,多此一举,可以直接Nginx配置https

放假咸鱼的第26天
微信小程序

努力成长的程序员