我在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)
答案 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