当前位置: 首页 > 知识库问答 >
问题:

linux - 如何在nginx内部发送接口请求呢?

长孙硕
2024-06-06

问题场景:
我想实现在nginx的upstream服务组中获取当服务器是否轮询到了backup;如果轮询到我就在nginx的配置文件中发送一个接口请求,类似于飞书(钉钉)的消息通知 告诉当前的服务已经backup了

实现的方式:
我本地是mac的开发环境下载了openresry通过lua脚本进行请求接口,下载了resty.http实现了请求,因为请求的地址是https的,我本地使用mkcert生成了一个免费的SSL的证书,但是请求的时候一直报错:无法解析域名

下方是伪代码:

worker_processes  1;error_log  /usr/local/etc/openresty/logs/error.log;error_log  /usr/local/etc/openresty/logs/info.log info;events {    worker_connections  1024;}http {    include       mime.types;    default_type  application/octet-stream;    sendfile        on;    keepalive_timeout  65;    server {        listen 443 ssl;        listen [::]:443 ssl;        server_name demo.com;        ssl_certificate      /Users/yangfan/demo.com.pem;        ssl_certificate_key  /Users/yangfan/demo.com-key.pem;        location / {            root   html;            index  index.html index.htm;        }        location /fs {            content_by_lua_file /usr/local/etc/openresty/tests/upstream.lua;        }        error_page   500 502 503 504  /50x.html;        location = /50x.html {            root   html;        }    }}

lua的代码:

local http = require "resty.http"local cjson = require "cjson"local httpc = http.new()local userData = {    msg_type = "post",    content = {        post = {            zh_cn = {                title = "222",                content = {                    {                        tag = "text",                        text = "222222",                    },                    {                        tag = "at",                        user_id = "all",                    },                },            },        },    },}local jsonStr = cjson.encode(userData)local res, err = httpc:request_uri("https://open.f.xxxx.cn/open-apis/bot/v2/hook/xxxxxx", {    method = "POST",    body = jsonStr,    headers = {        ["Content-Type"] = "application/json",    },})if res == nil then    ngx.log(ngx.INFO,"=====================>>>>>>>>>>>>>>>>>1111111111 ".. err)else    ngx.log(ngx.INFO,"=====================>>>>>>>>>>>>>>>>>000000000000 ".. res)    ngx.log(ngx.INFO,"=====================>>>>>>>>>>>>>>>>>33333333333333 ".. err)end

疑惑:

  • 目前整个链路是对的吗?我是本地启动openresty进行访问的?
  • 还有别的方式可以实现我当前的需求吗?

共有2个答案

缑高朗
2024-06-06

你应该做的是在nginx之外持续的ping primary 是不是不通。

监控系统应该游离在系统之外

曹子平
2024-06-06

答案

针对你的问题,有几个方面需要注意:

  1. 无法解析域名
    如果请求时遇到“无法解析域名”的错误,这通常意味着DNS解析失败。确保你请求的URL(如https://open.f.xxxx.cn/open-apis/bot/v2/hook/xxxxxx)是正确的,并且DNS可以正确解析。你可以使用pingnslookup命令来测试域名解析是否正常。
  2. Lua脚本错误处理
    在Lua脚本中,如果resnil,则err变量应该包含错误信息。你应该检查err的内容来了解为什么请求失败。此外,你的日志输出语句中,当res不为nil时,你重复输出了err,这是不必要的,因为err只在resnil时才有意义。
  3. 配置文件的检查
    确认Nginx和OpenResty的配置文件是否正确无误,并且Lua脚本的路径是正确的。
  4. SSL证书
    确保你的SSL证书是有效的,并且被你的Nginx/OpenResty服务器正确加载。如果证书无效或配置不正确,可能会导致请求失败。
  5. 其他实现方式
    除了使用Lua脚本在Nginx内部发送请求外,还有其他方式可以实现你的需求:

    • 使用Nginx的第三方模块:有些Nginx模块支持在Nginx配置中直接发送HTTP请求,例如ngx_http_json_filter_module
    • 后端服务处理:在你的上游服务中处理轮询逻辑,并在需要时发送通知。这样,Nginx只负责转发请求,而业务逻辑由后端服务处理。
    • 使用外部服务:你也可以使用外部的监控或告警服务来监控Nginx的状态,并在状态改变时发送通知。

针对你的代码和配置

  • 代码和配置看起来是合理的,但是你需要检查DNS解析、SSL证书、Lua脚本路径和错误处理等方面。
  • 确保你的Lua脚本可以正确执行。你可以尝试在
    -Lua 脚本检查中添加Nginx更多的的错误日志日志输出,,它以便可能会更好地提供了解关于请求为什么的执行请求过程失败的。更多信息。

最后,请注意,由于你的代码和配置包含敏感信息(如URL和证书路径),请确保在实际环境中不要公开这些信息。

 类似资料:
  • 我试图在端口80上建立一个连接localhost并发送一个简单的http get请求,同时运行wireshark并查看报头。下面是我的代码: 但当我编译并运行它时,它会给我带来很多错误。这是Errros的图像。发生此错误后,我将send函数更改为这个 send(sockfd,“get/http/1.1\r\n host:localhost\r\n\r\n”,strlen(“get/http/1.1

  • 我在网上找到了这个脚本: 但我不明白如何与PHP一起使用它,也不明白params变量内部的内容是什么,也不明白如何使用它。我能帮个忙吗?

  • 问题内容: 我正在尝试发出POST请求,但无法完成。另一端什么也没收到。 这是应该如何工作的吗?我知道该功能,但我想我不能使用它,因为它不能用测试,对吗? 问题答案: 您基本上有正确的想法,只是发送错误的表格。该表格属于请求的正文。

  • 问题内容: 在Java中,如何编写HTTP请求消息并将其发送到HTTP WebServer? 问题答案: 你可以使用。 示例(从此处开始),进行了改进。包括在链接腐烂的情况下:

  • 问题内容: 我正在学习Java套接字。我正在尝试向Facebook发送HTTPS GET请求,如下所示: 然后,我尝试侦听来自服务器的传入数据,如下所示: 但是我没有从服务器获得任何返回数据。为什么? 问题答案: 两个答案。 您正在尝试与HTTPS服务器通信。这要求您建立一个SSL / TLS通道。这在纯套接字上确实很难>>您必须实现连接协商,密钥链的客户端验证,会话加密/解密等。 一个更合理的方

  • Nginx反向代理转发到内网穿透的本地服务失败。 我的nginx部署在阿里云服务器上,然后想将请求转发到内网穿透的本地服务上,总是404,网上找了很多文章,也不知道是哪里出现了问题,求解! 这是域名对应的本地服务IP端口。 http://orzzzsy.nat300.top -> 127.0.0.1:9999 阿里服务器能够访问我内网穿透的域名,获取到数据 我预期是能够通过访问nginx服务器,也