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;
}
希望对其他人有所帮助。
西蒙
我在 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;
}
希望对其他人有所帮助。
西蒙