本文最后更新于 2024-09-26,文章内容距离上一次更新已经过去了很久啦,可能已经过时了,请谨慎参考喵。

前情提要

接上文:

https://blog.imbhj.com/archives/ycIYpHSh

我的博客、社区、文档等,都是在我自己本地的服务器上部署的,然后通过 FRP 内网穿透来进行外部访问,然后就有一个严峻的问题,那就是如何实现 https 访问

鼓捣了半天之后,还是用 frp 本身自带的一个 httpTohttps 插件来实现了 https,但同样的,也带来了一个问题,那就是如果我访问某个服务,没有加 https:// 的前缀的话,实际上是访问不到的,只会出现 FRP 的 404 页面,而且是移动端会出现,PC 端的浏览器貌似会自动跳转 https

而且最麻烦的其实是这样做的话,就必须把 ssl 证书配置在客户端,免费的证书三个月到期,还得给每个客户端都要单独更新 ssl 证书,实在是太麻烦了,那么我就想到我可以直接在服务端用 nginx 来反代,直接给 nginx 来配置 ssl 证书,这样客户端都只需要穿透一个 http 端口即可,服务端完成 ssl 证书的装配

正文

Docker 和 Docker-Compose 的安装就不赘述了,可以参考:

https://blog.imbhj.com/archives/gIr7eDrw

docker-compose.yml

version: '3.8'
services:
  app:
    image: 'jc21/nginx-proxy-manager:latest'
    restart: unless-stopped
    ports:
      - '80:80'
      - '81:81'
      - '443:443'
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt

NGINX 默认是要占用 80,443 端口的,所以还需要修改 FRP 的服务端配置文件,将 http/https 端口修改一下。

docker-compose up -d

# If using docker-compose-plugin
docker compose up -d

访问 http://127.0.0.1:81 ,默认账户为:

Email:    admin@example.com
Password: changeme

20240902192510.png

装了一个 docker,还没跑容器呢,这小鸡的内存已经受不了了,,,部署 nginx 还是暂缓吧。。。。。。

20240926更新

其实后来发现这个占用很小,并没有想象中的那么大,现在部署了 nginx proxy manager 之后内存还是没跑满 1G

今天更新的内容就是如何设置反向代理

在上文中,容器启动之后,打开 web 页面,输入默认的账户名和密码,登录之后首先会要求设置用户名和密码,这里就不赘述了

首先选择到 SSL Certificates 页面,点击添加 SSL 证书:

20240926204512.png

我这里是在别的网站申请的证书,所以选择的是上传本地证书:

填写证书的域名,上传证书文件和私钥文件,保存即可

当然也可以直接在控制台生成免费的 LS 证书,我等证书过期了再配置这个吧,就不用每次还要上传了。

然后转到首页,点击 Hosts,点击 Proxy Hosts

进入到反代配置页面,点击右侧的 Add Proxy Host:

图中是一个示例,需要注意的是,这个示例在 frpc 客户端中是以 tcp 协议穿透到 frps 服务端的 3001 端口的

  • test.imbhj.com 就是要部署这个 3001 端口监听的服务的域名

  • 协议就选择 http 即可,因为该服务是以 http/https 对外服务的

  • x.x.x.x 就是 frps 服务端部署所在主机的公网 IP

  • 3001 就是我们要部署的服务或 frpc 客户端穿透到的端口

下面三个按钮的功能可以自行百度,但是推荐全部开启。

然后选择上方的 SSL 模块,选择刚才添加的证书,开启强制 https,保存即可:

这样就完成了一个反代的添加。

那么对于 frpc 客户端不想使用 tcp 协议来穿透的服务,怎么进行反代呢?在 frpc 和客户端的配置如下:

[[proxies]]
name = "bbs"
type = "http"
localIP = "127.0.0.1"
localPort = 4567
subdomain = "bbs"
[[proxies]]
name = "blog"
type = "http"
localIP = "127.0.0.1"
localPort = 2345
subdomain = "blog"

对于需要这种穿透的服务,其实就是把对应域名的监听,转发到了 frps 的服务端口,那么反代就很好做了,就是把所有的子域名,比如这个配置里的 bbs.imbhj.comblog.imbhj.com 全部都反代到 frps 的服务端口 8080:

就可以使用如图的配置方法,直接将所有以通配符的形式解析到 8080 端口

注意我这里的 frps 端口是 8080,请根据实际情况进行修改

同样,配置好 SSL 保存即可,对于 http 和 tcp 同时解析会不会发生冲突,我亲测没有,但可能确实是会影响

所以建议如果要使用 http 协议进行穿透,那么最好使用单独域名或者三级域名,以避免这种情况。