Nginx proxy_pass到aws Api网关

yis*_*aiz 6 ssl proxy nginx amazon-web-services aws-api-gateway

我想配置Nginx反向代理服务器,它将把HTTP获得的所有请求重定向到我的AWS Api网关端点,即HTTPS(它是一个GET方法).(如果你想知道原因,原因是我有一个AWS Lambda函数,我希望第三方供应商通过Api Gateway调用,但他目前有一个与AWS的ssl_handshake的错误,可能是因为SNI.所以我会给他这个HTTP代理服务器).

我尝试过这样的事情:

server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  MY_SERVER_NAME;
        root         /usr/share/nginx/html;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_pass https://SOMETHING.execute-api.REGION.amazonaws.com/dev/RESOURCE/METHOD;               
                proxy_ssl_server_name on;
                proxy_ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
                proxy_buffering off;
        }
}
Run Code Online (Sandbox Code Playgroud)

但是当我尝试打电话时,我现在从CloudFront获得403

http://MY_SERVER_NAME
Run Code Online (Sandbox Code Playgroud)

我觉得我在Nginx的SSL配置中遗漏了一些东西,但我不确定是什么.

Ott*_*tto 5

您的问题是您将要发送到AWS API Gateway的HTTP Host标头设置为错误的值。

API网关需要将HTTP主机标头设置为其自己的主机,例如 SOMETHING.execute-api.REGION.amazonaws.com

因此,您应该具有:

proxy_set_header Host $proxy_host;
Run Code Online (Sandbox Code Playgroud)

代替:

proxy_set_header Host $host;
Run Code Online (Sandbox Code Playgroud)

实际上,您不必显式设置代理主机标头,因为如果未设置,Nginx会将其默认设置为$ proxy_host

请参阅Nginx 文档