我们正在使用 nginx 为 Web 应用程序提供服务。它将通过 https 传入的所有内容代理到在本地主机上监听的服务器。
现在我想要 nginx 充当代理并从 s3 提供我们的 css 文件。
因为我想根据查询文件的主机名提供不同的文件(同时始终提供相同的 html 内容),所以无法直接从 s3 提供文件
在这种情况下最佳做法是什么?
答案1
最佳做法是不要通过服务器将流量路由到 S3,这只会减慢速度。您可以使用如下 URL 结构通过 SSL 从 S3 加载资产:https://s3.amazonaws.com/example-bucket-name/example.jpg
还建议从单独的域提供静态内容,因为浏览器对给定域的并行连接数量有限。
在单独的域中提供静态内容的另一个原因是通过“无 cookie”域来提高性能。您的应用可能使用 cookie,并且浏览器在每次请求时都会为其设置一个 cookie 标头。在 S3 域上不会出现这种情况,因为它不会设置 cookie。
使用备用域名作为 CDN 很常见。人们往往不会注意到,因为 URL 不会出现在位置栏中,只会出现在源代码中。
答案2
我使用这个块让它工作了。问题是我没有使用解析器。
location ~ \.css {
# Important to resolve host of s3
resolver 8.8.8.8;
# we can only ever GET/HEAD these resources
limit_except GET {
deny all;
}
# cookies are useless on these static, public resources
proxy_ignore_headers set-cookie;
proxy_hide_header set-cookie;
proxy_set_header cookie "";
proxy_hide_header x-amz-delete-marker;
proxy_hide_header x-amz-id-2;
proxy_hide_header x-amz-request-id;
proxy_hide_header x-amz-version-id;
# only rely on last-modified (which will never change)
proxy_hide_header etag;
# heavily cache results locally
proxy_cache_valid 200 28d;
proxy_cache_valid 403 24h;
proxy_cache_valid 404 24h;
# s3 replies with 403 if an object is inaccessible; essentially not found
proxy_intercept_errors on;
error_page 403 =404 /_error/http-404.html;
# go get it from s3
proxy_pass https://s3.eu-central-1.amazonaws.com/bucket-name/$host/style.css;
# annotate response about when it was originally retrieved
add_header x-cache '$upstream_cache_status $upstream_http_date';
# heavily cache results downstream
expires max;
}