Nginx Proxy Manager
Nginx Proxy Manager 是一个 Nginx 的可视化代理管理器,自带面板,操作极其简单,非常适合配合 Docker 搭建的应用使用。
version: '3.8'
name: proxy
services:
nginx:
image: 'jc21/nginx-proxy-manager:latest'
restart: unless-stopped
container_name: nginx
ports:
- '80:80'
- '81:81'
- '443:443'
volumes:
- /data/docker/nginx:/data
- /data/docker/letsencrypt:/etc/letsencrypt
networks:
appnet:
external: true
其他需要被 Nginx 反代的服务理论上不需要配置 ports
暴露端口,只需要都加入同一个 docker 网络,在 Nginx 配置的使用域名指向即可。
另外 Nginx Proxy Manager 可以一键申请 SSL 证书,并且会自动续期。注意,申请证书时,Let’s Encrypt 会访问域名进行校验,所以先通过 Cloudflare 配置可外部访问之后,再进行配置证书。
Cloudflare Tunnel
创建 Tunnel
首先进入Cloudflare 管理面板的 Zero Trust - Network - Tunnels:
- 点击 Create a tunnel,创建一个 Cloudflared 类型的 Tunnel,点击下一步
- 输入 Tunnel 名称,点击下一步
- 页面将会显示各个平台的安装方式,在这里可以找到 Tunnel 的 token
安装 cloudflared
根据指引的安装方式启动连接成功后,页面 Connectors 将会显示连接的实例。
更多安装指南:https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/downloads/
Docker 启动
以下为 Docker 启动案例:
- 网络模式设置成
host
- Transport协议设置成 http2:默认 cloudflared 以 quic 协议建立链接,如果当前网络环境 UDP 链接使用有问题则设置成 http2
- 增加 DNS 配置:如果当前环境的 DNS 无法解析 cloudflare 相关域名(如 clash 的 fake-ip 模式影响),则可以指定 DNS。
version: '3.0'
name: cloudflare
services:
cloudflared_tunnel:
restart: always
container_name: cloudflare_tunnel
hostname: cloudflare_tunnel
image: cloudflare/cloudflared:latest
command: tunnel --no-autoupdate --metrics=127.0.0.1:3333 run --token xxx
network_mode: host
user: "0:0"
environment:
PUID: 0
PGID: 0
TUNNEL_TRANSPORT_PROTOCOL: http2
dns:
- 1.2.4.8
networks:
appnet:
external: true
配置路由
Step 1 【Nginx Proxy Manager】:新增一个 Proxy Host
- 配置 Publicly Accessible
- 不配置 SSL
Step 2【Cloudflare】进入Tunnel 配置页面,找到对应 Tunnel 点击 Configure 进入 Tunnel 配置,这里我们要配置 Public hostnames
- 分别填写域名(需已经使用 Cloudflare 解析)
- 转发目标 Service 的 URL(注意,此时必须先选择 HTTP 协议,因为还未申请成功 SSL)
Step 3 【Nginx Proxy Manager】找到对应的 Proxy 配置
- 切换到 SSL 选择 Request a new SSL Certification
- 选择 Force HTTPS(根据实际情况)
- 稍等片刻,证书就申请和配置好了
Step 4 【Cloudflare】进入 Tunnel 配置页面,找到对应 Public hostname,点击 Configure
- 将 Service 的 Type 切换成 HTTPS(如果不切换且 Nginx 配置了 Force HTTPS,就会无限重定向)
- 展开 AddAdditional application settings - TLS - 在 Origin Server Name 中填入对应反代的域名,否则 Nginx 不能正确转发。(部分域名敏感的应用还需配置 HTTP Settings 的
HTTP Host Header
才能正确识别,根据实际情况配置)
大功告成,到此内网的服务就可以通过 Cloudflare 和 Nginx Proxy Manager 映射到外网。
内网访问速度优化
在内网访问已经配置好映射的域名的时候,也会被解析至 Cloudflare 然后通过 Tunnel 转发,这影响了访问速度,如果内网是使用类似 Adguard 的解析服务,可以通过重写 DNS,将域名直接指向 Nginx Proxy Manager,减少链路长度,提升访问体验。
其他解析服务如 Clash、dnsmasq,甚至于在路由或者PC上配置 hosts 也能达到同样效果