反向代理时,如何让Nginx传递外部DNS名称?

反向代理时,如何让Nginx传递外部DNS名称?,nginx,dns,Nginx,Dns,我正在尝试使用Nginx wrap,这是一个由我们的一个客户托管的、文档记录不完整、喜怒无常的API。尽管我尽了最大的努力,但我还是无法让Nginx将我们想要发出的请求的入站格式(带有两个参数作为URL参数的get请求)转换为我们需要提交给这个API的内容(带有一个请求体的POST请求,该请求体将参数编码为JSON blob) 我在Python代码中有一个对该API的工作调用,但我不知道在Nginx设置中复制该行为的失败之处。这里的想法是将这个请求从缓慢的Python代码包装到Nginx Pyt

我正在尝试使用Nginx wrap,这是一个由我们的一个客户托管的、文档记录不完整、喜怒无常的API。尽管我尽了最大的努力,但我还是无法让Nginx将我们想要发出的请求的入站格式(带有两个参数作为URL参数的get请求)转换为我们需要提交给这个API的内容(带有一个请求体的POST请求,该请求体将参数编码为JSON blob)

我在Python代码中有一个对该API的工作调用,但我不知道在Nginx设置中复制该行为的失败之处。这里的想法是将这个请求从缓慢的Python代码包装到Nginx

Python代码如下所示:

REMOTE_URI = 'https://api.mycompany.com/services/some/api/endpoint/here/'

async def get_promotion_data(customer_id, product_id):
    params = {'AccountNumber': customer_id,
              'ProductIdentifier': product_id}

    async with aiohttp.ClientSession() as session:
        async with session.post(REMOTE_URI,
                                headers={'Content-Type': 'application/json'},
                                data=json.dumps(params)) as response:

            data = await response.json()

            if not data:
                return {}

            return data
我在Nginx中实现这一点的最佳尝试是:

location /internal/wrapper {
    proxy_set_header   Host      api.mycompany.com;
    proxy_set_header Connection "";
    proxy_connect_timeout 100ms;
    proxy_read_timeout 5s;
    proxy_method POST;
    proxy_set_body '{"AccountNumber":"${arg_customer_id}","ProductIdentifier":"${arg_product_id}"}';
    proxy_set_header X-Content-Type application/json;
    proxy_pass https://api.mycompany.com/services/some/api/endpoint/here/;
}
然而,当我调用Nginx包装版本时,它总是返回一个504,表示与上游的连接超时。(我已经尝试在Nginx中增加代理超时;我们连接的API速度非常快,所以这几乎肯定不是问题所在。)

通过使用像
curl
这样的工具直接调用API,我的最佳猜测是,客户端的某些东西是基于URL中的主机名进行路由的。当我尝试做
curl“https://api.mycompany.com/services/some/api/endpoint/here/“
它返回一个响应,表明我正在使用正确的服务器。当我做
curl“https://123.123.123.123/services/some/api/endpoint/here/“
我在其他地方收到了很多重定向

Nginx似乎正在解析域并直接调用IP,而不是显式地传递主机名。在
error.log
文件中,它记录了它尝试(并超时)的上游是
123.123.123
而不是
api.mycompany.com
。这也是为什么我尝试添加
主机
头作为代理传递的一部分


也许我错过了别的什么?是否有其他方法告诉Nginx在代理时如何处理主机名?

事实证明,这里有几个错误。首先,JSON内容类型的头是
content-type
,而不是
X-content-type
。更重要的是,我需要在上添加
proxy\u ssl\u server\u name。事实证明,关于主机名是这里的一个问题,我是对的,真正的问题是Nginx在发出HTTPs请求时没有发送服务器名