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