OpenResty - Lua 发起 HTTP 请求时无响应

从我的 nginx 中向某个 url 发起请求时,此请求的响应始终不存在。似乎请求未发送。

这是我的 nginx.conf

worker_processes  1;
error_log logs/error.log;
events {
    worker_connections 1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for" "$http_clientid"';

    access_log  logs/access.log  main;

    server {
        listen 8080;

        location /token-test {
          access_log logs/token.log main;

          content_by_lua_block {
            local cjson = require "cjson"
            local http = require "resty.http"
            local httpc = http.new()
            local ngx = ngx

            local res, err = httpc:request_uri("http://www.google.de", {method="GET"})

            if not res then
               ngx.say(cjson.encode({message = "获取响应错误",status = ngx.HTTP_INTERNAL_SERVER_ERROR }))
               return ngx.HTTP_INTERNAL_SERVER_ERROR
            end

            return ngx.HTTP_OK
          }
        }
  }
}

我得到了一个 200 响应状态,响应体如下:

{
  "status": 500,
  "message": "获取响应错误"
}

日志中没有错误。

为什么我会得到 200 响应而不是 500,为什么响应体包含未出现的条件块中的信息?

更新 我记录了错误: no resolver defined to resolve \"www.google.de\"

谢谢 Danny

点赞
用户9783845
用户9783845

没有定义可解析“www.google.de”的解析器。

您需要配置resolver

https://github.com/openresty/lua-nginx-module#tcpsockconnect

对于域名,此方法将使用Nginx核心的动态解析器来解析域名,而不会阻塞,并且需要像这样在nginx.conf文件中配置resolver指令:

resolver 8.8.8.8;  # 使用Google的公共DNS名称服务器

为什么我会得到200响应而不是500

您应该调用ngx.exit来中断请求的执行并返回状态码。

将以下内容替换为:

return ngx.HTTP_INTERNAL_SERVER_ERROR

使用以下内容:

ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR)
2021-03-24 16:36:10