NGINX proxy_pass 5xx错误显示S3 + CloudFront上托管的html文件

时间:2018-10-08 11:22:37

标签: amazon-web-services nginx amazon-s3 amazon-cloudfront proxypass

我在nginx 1.4.6配置上苦苦挣扎,因为我无法使用CDN地址代替直接存储区地址来代理传递设置在S3存储区中的html文件的5xx和4xx错误。 我想这样做,以便如果更改发行版的来源,则不必手动更改所有服务器中的所有nginx配置。

我的工作配置的相关部分是:

error_page 400 404 @error;
error_page 502 503 @maintenance;

location @maintenance {
      rewrite ^(.*)$ /mybucket/error_pages/under_construction.html break;
                    proxy_pass https://s3-eu-west-1.amazonaws.com;
}

location @error {
      rewrite ^(.*)$ /mybucket/error_pages/under_construction.html break;
                    proxy_pass https://s3-eu-west-1.amazonaws.com;
}

但是如您所见,我不得不使用S3存储桶的URL进行代理。 https://s3-eu-west-1.amazonaws.com

然后我创建了一个CloudFront发行版,其起源是带有CNAME mybucket的S3存储桶mybucket.mywebsite.com

然后我尝试将配置更改为此:

error_page 400 404 @error;
error_page 502 503 @maintenance;

location @maintenance {
      rewrite ^(.*)$ /error_pages/under_construction.html break;
                    proxy_pass https://mybucket.mywebsite.com;
}

location @error {
      rewrite ^(.*)$ /error_pages/under_construction.html break;
                    proxy_pass https://mybucket.mywebsite.com;
}

但这不起作用,我也不知道为什么。

对此有何建议? 这是可行的做法吗?

谢谢, 西蒙妮(Simone)

1 个答案:

答案 0 :(得分:0)

我终于找到了解决方法。

我在服务器上下文中添加了proxy_ssl_server_name on;(因为它在我的配置的多个部分中使用,因此它是全局包含的),以启用通过TLS服务器名称指示扩展名(SNI,RFC 6066)传递服务器名称与代理HTTPS服务器建立连接时。 这是必需的,因为代理目标是具有http到https重定向和SSL的CloudFront分发。

不幸的是,该选项是从nginx 1.7.0引入的,因此我还必须将nginx版本更新为最新版本(在我的情况下为1.14),并添加了nginx ppa。

设置该配置后,您就可以使用此语法而不会出现问题。

error_page 400 404 @error;
error_page 502 503 @maintenance;

location @maintenance {
      rewrite ^(.*)$ /error_pages/under_construction.html break;
                    proxy_pass https://mybucket.mywebsite.com;
}

location @error {
      rewrite ^(.*)$ /error_pages/under_construction.html break;
                    proxy_pass https://mybucket.mywebsite.com;
}

希望它可以帮助其他人。

Simone