如果你使用了 官方机器人 的 webhook
连接方式,
并且你的机器人实际运行在 云服务器 上,
但是你的 koishi开发环境 却在日常使用的电脑上
那么你一定会遇到这样的问题:
由于官方机器人的 webhook 请求地址只能配置一个,
所以如果你想要使用webhook来进行开发调试的话。基本只有两个方法:
-
让开发模式和生产模式在同一个koishi实例,这样就可以保证开发的同时 原有功能 不会受影响
-
让开发模式和生产模式 单独各开一个koishi实例 ,这样就可以让他们各干各的,原有功能不受影响的同时还能开发新功能。
然而你很快就会注意到这样的问题:
你如果仅多开适配器,那就意味着你的生产模式和开发模式要在同一个实例,这....显然不可取
你如果多开koishi实例,会遇到这样的需求:需要反代同一个路径(因为可配置的请求地址就一个)到两个koishi地址。
换言之,你就需要解决的其实是: 流量如何转发到多后端
思路: 既然消息会下发到 q.qq.com配置的请求地址 里,
那么只需要让这个请求地址的内容 再下发到其他路径不就好了
解决方法:
第一步 流量镜像分发
使用 Nginx mirror 模块
mirror模块 从 Nginx1.13 开始就是内置了,
所以只要是 1.13 版本以后就可以直接使用,不需要重新编译nginx。
可以参见官方文档地址 → Module ngx_http_mirror_module
那么 在 1.13 版本以后的nginx里,
该如何修改配置文件 ,实现 流量镜像分发
呢?
假设,你的 koishi 生产模式和开发模式的地址分别是
http://127.0.0.1:8000/qq
http://127.0.0.1:15155/qq
这代表:
生产模式是运行在 8000 端口的,并且 adapter-qq 的监听路径是 `/qq`
开发模式是运行在 15155 端口的,并且 adapter-qq 的监听路径也是 `/qq`
这里有一份 对应的 示例 nginx.conf
文件内容
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
# 重定向所有 HTTP 请求到 HTTPS
server {
listen 80;
server_name localhost webhook.company;
return 301 https://$host$request_uri;
}
# HTTPS 服务器(443端口)
server {
listen 443 ssl;
server_name webhook.company;
ssl_certificate C:/server/nginx/ssl/cert.pem; # 你的证书路径
ssl_certificate_key C:/server/nginx/ssl/cert.key; # 你的私钥路径
# 处理 /qq 路径的请求,并镜像到 /qq1 和 /qq2
location /qq {
# 镜像请求到 /mirror_to_qq1
mirror /mirror_to_qq1;
# /qq 路径的反向代理(生产模式的koishi监听路径)
proxy_pass http://127.0.0.1:8000/qq;
# 支持 WebSocket 的必要头字段
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
# 传递客户端的真实 IP 地址等信息
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
# 镜像到 /qq1
location = /mirror_to_qq1 {
internal;
# /qq1 路径的反向代理 (开发模式的koishi监听路径)
proxy_pass http://127.0.0.1:15155/qq;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
}
像这样配置 nginx ,
我们就可以实现 让 http://127.0.0.1:8000/qq
和 http://127.0.0.1:15155/qq
的 koishi 都可以接收到用户消息了
那么如何在本地运行开发环境呢?
这里就不得不提到一个十分好用的好东西了!
FRP可以让你 借助云服务器的公网IP 实现穿透你的本地服务:
-
FRP穿透 → Releases · fatedier/frp · GitHub
-
Windows 的 FRP GUI → Releases · koho/frpmgr · GitHub
第二步 代理本地的koishi
首先我们下载了这两个项目的release内容:
-
frp_0.61.1_windows_amd64.zip → https://github.com/fatedier/frp/releases/download/v0.61.1/frp_0.61.1_windows_amd64.zip
-
frpmgr-1.19.2-x64.zip → https://github.com/koho/frpmgr/releases/download/v1.19.2/frpmgr-1.19.2-x64.zip
下载之后,我们得到了两个压缩包,
其中的 frp_0.61.1_windows_amd64.zip
是需要放在云服务器上的
而 frpmgr-1.19.2-x64.zip
是我们需要本地来使用的
如何使用呢?
首先把 frp_0.61.1_windows_amd64 解压后放到云服务器上的某个文件夹内
我们需要在云服务器上使用到的就是这两个文件:
frps.exe
:服务端穿透工具frps.toml
:服务端穿透工具的配置文件
你可以使用记事本打开 frps.toml
,
可以看到内容只有
bindPort = 7000
这代表 服务端frp 运行时候会使用的端口为 7000 ,
这里我们默认即可,无需修改(关闭记事本)
启动 frps.exe
在 资源管理器的地址栏输入
cmd
然后回车
就可以打开命令提示符的窗口
然后我们输入
frps.exe
即可通过调用 启动 frps.exe
然后我们就可以在配置本地的穿透内容啦
在本地 把 frpmgr-1.19.2-x64.zip
解压到一个文件夹里
解压后可以看到有一个 frpmgr.exe
我们可以直接双击运行
配置 frpmgr
先点击左下角的【新建配置】
然后我们填写这个客户端的名称,嘛随便都行
主要需要注意的是:
-
服务器地址: 需要填入配置了 frps.exe 的云服务器的公网IP
-
服务器端口:frps.toml 配置的 bindPort 端口(默认为 7000)
新建代理
先点击【添加】按钮,
然后我们填入对应的名称和地址和端口
注意:
-
本地地址: 就是你的本地地址啦
-
本地端口: 需要代理的服务运行的端口
-
远程端口: 你希望把这个本地端口映射到服务器上的哪个端口?(注意这里示例的是 15155 端口,这是因为上文中我们提及了,nginx.conf 里的 koishi开发模式的运行在
http://127.0.0.1:15155/qq
,你需要根据你实际的 nginx.conf 来填写哦)
然后就可以开启这个代理啦
有任何问题可以看日志哦
如果顺利,那么你在日志看到的内容应该是
start proxy success
不出意外的话,
你就可以在 云服务器 上 访问到 http://127.0.0.1:15155/qq
了
你可以在云服务器上的浏览器里输入 http://127.0.0.1:15155/qq
,可以看到你本地的开发模式的koishi哦
虽然 示例图片的服务器网络不是很好 但是可以看到标签页展示出了【koishi 控制台】的字样
应该是可以访问的!(无误,关掉浏览器)
然后我们就可以在本地开发模式的koishi实例里 接收到 webhook 的消息啦~
响应成功呢~
当然 生产模式的功能也维持住了呢(在云服务器上)
当然,你也可以通过一样的方法,把生产模式也放到本地来嗯
…