使用 Nginx 反向代理钉钉接口

借助 Nginx 的反向代理能力,在不修改代码的前提下,使内网应用可以通过前置机访问钉钉接口。

场景描述

  1. 应用使用了钉钉SDK,接口地址已经硬编码在SDK中,无法修改;

  2. 应用服务器无法直接访问钉钉官方接口,需要借助前置机间接访问;

  3. 接口使用了 oapi.dingtalk.comapi.dingtalk.com 两个域名,且均为 https 协议;

解决方案

大方向上考虑在前置机通过 Nginx 做一个钉钉接口的反向代理,并修改应用服务器 hosts 文件,将 oapi.dingtalk.comapi.dingtalk.com 指向前置机。

细节上通过 stream 方式进行代理避免自签名证书等工作,并借助 stream_ssl_preread_module 模块实现同时代理两个域名。

具体操作

  1. 在前置机的命令行输入 nginx -V 确认是否安装了 nginx 以及当前安装的版本是否支持 stream_ssl_preread_module 。如果输出的内容中已经包含 --with-stream_ssl_preread_module 就可以继续下面的操作,如果没有此模块或着尚未安装 nginx,可以从官网下载最新稳定版。

在我寻找方案的过程中,发现不少文章都提到 Nginx 没有自带 stream_ssl_preread_module 模块,需要自己编译。但事实上,目前 Nginx 官方网站下载的最新稳定版本(1.26,包括Linux 和 Windows 的版本)已经包含了该模块,并不需要自己编译。

  1. 确认前置机能访问钉钉接口
curl https://oapi.dingtalk.com

正常情况下,会得到如下返回

{"errcode":404,"errmsg":"请求的URI地址不存在"}
  1. 创建 Nginx 配置文件 /etc/nginx/conf.d/dingtalk.conf
stream {
    map $ssl_preread_server_name $name {
        oapi.dingtalk.com    oapi;
        api.dingtalk.com    api;
    }
    upstream oapi {
        server oapi.dingtalk.com:443;
    }
    upstream api {
        server api.dingtalk.com:443;
    }
    server {
        listen 443;
        ssl_preread on;
        proxy_pass $name;
    }
}

完成后记得重启 nginx。

如有其他需要,可参照该模块的配置说明

Module ngx_stream_ssl_preread_module

  1. 开通前置机的防火墙端口
firewall-cmd --permanent --add-port 443/tcp
firewall-cmd --reload
  1. 在应用服务器上修改 hosts 文件,假设前置机的 ip 是 192.168.100.100
echo 192.168.100.100 oapi.dingtalk.com >> /etc/hosts
echo 192.168.100.100 api.dingtalk.com >> /etc/hosts
  1. 通过 curl 测试效果
curl https://oapi.dingtalk.com

正常情况下,会得到如下返回

{"errcode":404,"errmsg":"请求的URI地址不存在"}

完成上述步骤后,你就实现了在不修改软件代码的前提下,借助前置机访问到钉钉接口了。

更多

我的第一个MCP,以及开发过程中的经验感悟

起心动念 上周开发完 sheetex 后,发了条朋友圈。有小伙伴建议搞个 MCP 玩,正好我本来也想学,于是这周就花了一天完成了 sheetex-mcp-server,一个将对话中生成的表格保存成 Excel 的 MCP 服务。 做之前快速调查了一下 smithery 和 modelscope ,发现已经有好几个 Excel 相关的:实现上既有调用本机上的 Office 软件进行操作的,也有用库读写文件的;功能就更加眼花缭乱,从简单读写数据,到插入图表,甚至可以截图保存。 看来是打不过了,好在只是做个练习,开搞。 一天下来,学到不少东西,也填了好几个坑,本文以坑为主。 那么下面就按顺序来了。 新手上路 Build an MCP Server 是官方的教程,新手入门刚刚好,它通过调用天气相关的接口演示了 MCP Server 的开发过程。

By 熊立丁

12KB的Excel导出库sheetex是怎么来的

这是一个关于前端 Excel 导出库 sheetex 的故事:我为什么要做这个库,它为什么会这么小,以及你是否值得一试。 如过你问我“为什么非要在前端导出”,那将是另一个故事。 我的数据导出史 不知道你是否还记得自己是从什么时候开始接触数据导出的? 我对自己的“数据导出史”还算有些印象:在还没有正式工作的时候,如果有人问我要数据,我会在数据库管理工具里写个查询语句,然后视对方的用途,导出成SQL 语句、CSV 文件或者Excel 等;待到工作了,需要开发面向最终用户的系统,就不能再这么手工处理,导出功能成为系统标配,用户点击一个按钮,就要下载到相应的文件。 最早是 CSV 格式,因为其生成相对容易,而且也可以通过 Excel 软件进行查看,加上主要是内部用户,偶有无法打开也只要简单培训就能解决。 但随着用户类型变得广泛起来,这种“偶尔”也逐渐变成无法忍受,那么干脆直接导出 Excel 文件吧,反正开源库也已经成熟,于是使用 SheetJS

By 熊立丁
浙ICP备15043004号-1