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

NGINX proxy_pass 5xx errors showing html file hosted on S3+CloudFront

我在 nginx 1.4.6 配置上苦苦挣扎,因为我无法代理传递 5xx 和 4xx 错误设置托管在 S3 存储桶中的 html 文件,使用 CDN 地址而不是而是直接存储桶地址。 我想这样做,这样如果我更改分发的来源,我就不必手动更改所有服务器中的所有 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 分发,其来源是 S3 存储桶 mybucket,带有 CNAME 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;
}

但这不起作用,我不明白为什么。

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

谢谢, 西蒙

我终于自己找到了解决方案。

我在服务器上下文中添加了 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;
}

希望对其他人有所帮助。

西蒙