刚刚注册了新域名fleetsnowfluff.page作为飞行雪绒同人网站,正巧服务器跑的鸣潮QQbot好几个服务有WebUI,默认情况下需要暴露服务器公网ip和port才能访问,发送给bot用户的登录url也是ip:port的形式,不够安全和美观,于是打算给新域名找点事做,创建一个子域名,专门托管这些WebUI。
创建子域名
先前使用Cloudflare托管域名。进入面板的DNS选项卡,添加DNS记录,类型选择A,名称即为子域名名称,IPv4地址填写服务器公网IP。
检查服务器IP和端口设置
使用反向代理后,无需暴露服务对应端口于公网。
检查各项服务监听地址为localhost或127.0.0.1,删除原先的端口设置(比如GsCore端口8765、NapCat端口6099等),只需确保http和https服务开放,用于Caddy服务。
注:如果服务器防火墙开启,需要同时正确配置安全组中入站规则和防火墙
# 以firewalld为例
# 永久关闭端口
sudo firewall-cmd --permanent --remove-port=8765/tcp
# 永久开启服务
sudo firewall-cmd --permanent --add-service=http
# 重启防火墙
sudo firewall-cmd --reload
# 查看当前永久规则
sudo firewall-cmd --permanent --list-all配置Caddy
Caddy是一个现代化的Web服务软件,可以提供网站服务、配置反向代理、自动配置HTTPS等。现在要做的就是通过Caddy的反向代理,把外部访问流量转发到内部运行的服务。
安装
参考官方安装文档
以我的CentOs服务器为例,运行:
dnf install dnf-plugins-core
dnf copr enable @caddy/caddy
dnf install caddy安装完成后,运行caddy version,返回版本号即为安装成功。
开始反向代理
后台运行Caddy:
sudo systemctl start caddy修改配置后重启Caddy:
sudo systemctl reload caddyCaddy的配置文件默认位于/etc/caddy/Caddyfile
基础反向代理
example-domain {
reverse_proxy 127.0.0.1:8765
}路径匹配
不同服务都有各自的固定路径,如果只设置代理地址,外部访问域名只能得到一片白屏,因此要进行路径转发。 例如:
example-domain {
# NapCat的WebUI地址,127.0.0.1:6099/webui/
# 不删除路径前缀的转发方式
handle /webui/* {
reverse_proxy 127.0.0.1:6099
}
}保存更改后重启Caddy服务,如果NapCat(或者其他服务)正常在127.0.0.1:6099挂载WebConsole,此时应该可以从外部访问example-domain/webui/。
然而,可能会发现某些资源或者服务没有正常加载,这是因为这些内容使用了不同的路径,同样需要通过Caddy进行转发。
找到静态资源的路径
打开浏览器的开发者工具,使用元素选择工具选中没有正常加载的静态资源,查看其位置。 
例如上图中的img,路径为/webstatic/ICON.png,设置对应路径转发使其能够正常显示:
example-domain {
# GsCore的WebUI地址,127.0.0.1:8765
handle /webstatic/* {
reverse_proxy 127.0.0.1:8765
}
}找到额外服务的路径
如果部分功能无法正常使用(比如WebUI登录、查看实时日志等),可能是因为有额外的请求地址。打开浏览器的开发者工具,切换到Network一项,重新尝试该功能,找到header里Status Code为红色、或者Content-Length为0的请求。
如上图这个请求,虽然Status Code是绿色OK,但是返回的Content-Length为0,说明路由没有匹配,根据Request URL设置对应路径转发使功能可正常使用:
example-domain {
# NapCat的WebUI地址,127.0.0.1:6099
handle /plugin/* {
reverse_proxy 127.0.0.1:8765
}
}设置重定向
为所有服务设置代理后,尝试访问不存在的页面会显示一片白屏,设置重定向,让所有尝试访问该类的用户都重定向到主域名。
example-domain {
# 前面所写的handle...
# 处理所有未匹配的路径
handle {
redir https://fleetsnowfluff.page 302
}
# 兜底处理异常情况
handle_errors {
redir https://fleetsnowfluff.page 302
}
}

