Docker部署NginxProxyManager
前情提要
接上文:
我的博客、社区、文档等,都是在我自己本地的服务器上部署的,然后通过 FRP 内网穿透来进行外部访问,然后就有一个严峻的问题,那就是如何实现 https 访问
鼓捣了半天之后,还是用 frp 本身自带的一个 httpTohttps 插件来实现了 https,但同样的,也带来了一个问题,那就是如果我访问某个服务,没有加 https:// 的前缀的话,实际上是访问不到的,只会出现 FRP 的 404 页面,而且是移动端会出现,PC 端的浏览器貌似会自动跳转 https
而且最麻烦的其实是这样做的话,就必须把 ssl 证书配置在客户端,免费的证书三个月到期,还得给每个客户端都要单独更新 ssl 证书,实在是太麻烦了,那么我就想到我可以直接在服务端用 nginx 来反代,直接给 nginx 来配置 ssl 证书,这样客户端都只需要穿透一个 http 端口即可,服务端完成 ssl 证书的装配
正文
Docker 和 Docker-Compose 的安装就不赘述了,可以参考:
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
装了一个 docker,还没跑容器呢,这小鸡的内存已经受不了了,,,部署 nginx 还是暂缓吧。。。。。。
20240926更新
其实后来发现这个占用很小,并没有想象中的那么大,现在部署了 nginx proxy manager 之后内存还是没跑满 1G
今天更新的内容就是如何设置反向代理
在上文中,容器启动之后,打开 web 页面,输入默认的账户名和密码,登录之后首先会要求设置用户名和密码,这里就不赘述了
首先选择到 SSL Certificates 页面,点击添加 SSL 证书:
我这里是在别的网站申请的证书,所以选择的是上传本地证书:
填写证书的域名,上传证书文件和私钥文件,保存即可
当然也可以直接在控制台生成免费的 LS 证书,我等证书过期了再配置这个吧,就不用每次还要上传了。
然后转到首页,点击 Hosts,点击 Proxy Hosts
进入到反代配置页面,点击右侧的 Add Proxy Host:
图中是一个示例,需要注意的是,这个示例在 frpc 客户端中是以 tcp 协议穿透到 frps 服务端的 3001
端口的
test.imbhj.com
就是要部署这个3001
端口监听的服务的域名协议就选择
http
即可,因为该服务是以http/https
对外服务的x.x.x.x
就是 frps 服务端部署所在主机的公网 IP3001
就是我们要部署的服务或 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.com
、 blog.imbhj.com
全部都反代到 frps 的服务端口 8080:
就可以使用如图的配置方法,直接将所有以通配符的形式解析到 8080 端口
注意我这里的 frps 端口是 8080,请根据实际情况进行修改
同样,配置好 SSL 保存即可,对于 http 和 tcp 同时解析会不会发生冲突,我亲测没有,但可能确实是会影响
所以建议如果要使用 http 协议进行穿透,那么最好使用单独域名或者三级域名,以避免这种情况。