所以我在cloudflare后面设置了一个nginx前端web服务器,我用它来转发请求到后端服务。一切基本上都在工作,但现在我添加了一个Lambda服务,用于身份验证和其他API的签名请求。
然而,一段时间后,对API网关后面的lambda的初始请求失败,HTTP错误代码为499。我能够弄清楚这是由于API网关DNS IP更改,理论上可以用nginx解析器(https://medium.com/driven-by-code/dynamic-dns-resolution-in-nginx-22133c22e3ab)解决。
然而,我试图修复它的任何方法都导致了两个错误情况之一:
- Auth API不工作或在后端缺少Header参数(我沿着一个API密钥,但被删除)
- 什么都不工作了(错误的auth API配置也会杀死其他API)
我相信我可能只是遗漏了一个小细节,所以我在这里分享我的代码,希望有人知道遗漏了什么。
这将一直有效,直到AWS更改API网关的IP
server {
listen 443 ssl;
server_name auth.mywebsite.com;
ssl_certificate /etc/nginx/ssl/mywebsite.pem;
ssl_certificate_key /etc/nginx/ssl/mywebsite.key;
location / {
return 301 https://mywebsite.com$request_uri;
}
location /v1/ {
proxy_pass https://{AWS-GATEWAY-ID}.execute-api.us-west-1.amazonaws.com/main/;
proxy_set_header Host $proxy_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
这会破坏后端的API key Header转发功能:
server {
listen 443 ssl;
server_name auth.mywebsite.com;
ssl_certificate /etc/nginx/ssl/mywebsite.pem;
ssl_certificate_key /etc/nginx/ssl/mywebsite.key;
location / {
return 301 https://mywebsite.com$request_uri;
}
location /v1/ {
resolver 8.8.8.8 valid=30s;
set $endpoint {AWS-GATEWAY-ID}.execute-api.us-west-1.amazonaws.com;
proxy_pass https://$endpoint/main/;
proxy_set_header Host $proxy_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
任何帮助真的很感激
1条答案
按热度按时间ewm0tg9j1#
好吧,我现在可以通过两步方法解决这个问题。
在nginx方面,我最终得到了以下代码:
这允许请求通过Lambda,但有一个限制:
之前的配置直接进行了代理传递,但在一段时间后解析失败,将从作为请求路径发送到lambda的完整URI中删除
/v1
。新的配置总是包含
/v1
。在花了大约2个小时试图更改nginx配置,使/v1
不是发送到后端的请求路径的一部分后,我放弃了,而是更改了lambda代码,以期望API版本也成为请求的一部分。上周一切都在预期中。