【问题标题】:Nginx pass all requests to specific S3 fileNginx 将所有请求传递给特定的 S3 文件
【发布时间】:2014-03-15 15:43:53
【问题描述】:

我有一个 S3 存储桶,其中包含我网站的静态内容,我有一个 EC2 实例来接收到该网站的所有流量。

我想让对 EC2 的每个请求都从我的 S3 返回一个特定文件,但我想让 URL 与用户插入的 URL 相同。

示例:假设我的文件位于 /path/index.html 如果用户向 www.mydomain.com 发出请求,我想提供该文件,如果用户向 www.mydomain.com/some/random/path/ 发出请求,我仍然想提供同一个文件。最后一个要求是位置保持不变。也就是说,即使提供了相同的文件,用户仍会在浏览器中看到 www.mydoamin.com 和 www.mydoamin.com/some/random/path/。

这是我到目前为止的 nginx 配置文件,它似乎不起作用:

server {
    listen 80;
    ssl off;

    location / {
            proxy_http_version     1.1;
            proxy_set_header       Host 'some-host.s3.amazonaws.com';
            proxy_set_header       Authorization '';
            proxy_hide_header      x-amz-id-2;
            proxy_hide_header      x-amz-request-id;
            proxy_hide_header      Set-Cookie;
            proxy_ignore_headers   "Set-Cookie";
            proxy_buffering        off;
            proxy_intercept_errors on;


            resolver               8.8.4.4 8.8.8.8 valid=300s;
            resolver_timeout       10s;

            proxy_pass             http://some-host.s3.amazonaws.com/front-end/index.html;
    }
}

对如何进行这项工作有任何想法吗?

谢谢!

【问题讨论】:

  • 您想使用代理来保留您的域。看起来你已经有了。要将相同的规则应用于他们选择的任何路径,我认为您可以只使用 url 重写(不要与重定向混淆)。更简单的是,我认为您可以像 location /* 这样的位置进行模式匹配,然后代理 url 将保留用户输入的任何内容
  • 如果这里只有静态文件可以尝试缓存:gist.github.com/mikhailov/9639593
  • @mikhailov 谢谢!这是一个 AngularJS 网站。因此,该站点由静态文件组成,但会不断更新。大多数站点的文件都是版本化和缓存的,但我不缓存 index.html 文件,因为我希望用户始终获得它的最新版本。

标签: amazon-web-services nginx amazon-ec2 amazon-s3


【解决方案1】:

我最终使用了一个变量。这解决了问题:

server {
    listen 80;
    ssl off;

    location / {
            proxy_http_version     1.1;
            proxy_set_header       Host 'some-host.s3.amazonaws.com';
            proxy_set_header       Authorization '';
            proxy_hide_header      x-amz-id-2;
            proxy_hide_header      x-amz-request-id;
            proxy_hide_header      Set-Cookie;
            proxy_ignore_headers   "Set-Cookie";
            proxy_buffering        off;
            proxy_intercept_errors on;

            resolver               172.16.0.23 valid=300s;
            set $indexfile         "some-host.s3.amazonaws.com/front-end/index.html";
            proxy_pass             http://$indexfile;
    }
}

【讨论】:

  • 效果很好,但我仍然有一个问题,为什么我们不能在 proxypass 指令中指定完整的 URL,例如:proxy_pass "some-host.s3.amazonaws.com/front-end/index.html"; 而是使用变量来代替?
  • @ArtemDolobanko 根据nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_passproxy_pass 中使用变量时,“无法确定要替换的请求 URI 的部分”。在这种情况下,Nginx 传递指令中的 URI。我不确定它无法确定更换哪个部件的根本原因是什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-27
  • 1970-01-01
  • 1970-01-01
  • 2014-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多