使用Nginx从远程rails上游服务器提供静态资产

时间:2014-06-17 17:05:27

标签: ruby-on-rails nginx asset-pipeline load-balancing

我正在使用Nginx作为使用远程TCP连接的多个上游后端Rails服务器的http负载均衡器。它们都托管相同的应用程序,并使用位于public/assets目录下的相同静态预编译资产。

现在,我正在使用Rails资产管道文档页面here上提供的建议的nginx配置来解决为这些远程连接提供静态资产的问题。

upstream backend {
        ip_hash;
        server upstream1.example.com:8080;
}

server {
        client_max_body_size 100M;
        listen 80;
        server_name "example.com";

        location / {
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Real-IP  $remote_addr;
                proxy_set_header Host $http_host;
                proxy_redirect off;

                if (!-f $request_filename) {
                        proxy_pass http://backend;
                        break;
                }
        }
        location ~ ^/assets/ {
         expires 1y;
         add_header Cache-Control public;

         add_header ETag "";
         break;
       }

}

通过设置上述配置,在浏览器中手动导航到资产,例如“example.com/assets/image-1ae4dda6436928deeb4bc903fd421572.jpg”似乎会导致Nginx尝试从负载平衡服务器加载文件,而不是远程服务器,这是我的错误日志的输出:

  

2014/06/17 12:55:27 [错误] 5953#0:* 1 open()   “/etc/nginx/html/assets/image-1ae4dda6436928deeb4bc903fd421572.jpg”   失败(2:没有这样的文件或目录),客户端:205.200.252.55,服务器:   example.com,请求:“GET   /assets/image-1ae4dda6436928deeb4bc903fd421572.jpg HTTP / 1.1“,主持人:   “example.com”

有任何变通方法吗?我打算使用cloudfront来提供我所有的静态资产,但我很确定我需要一个中央服务器来提供最初的所有文件,以使其正常运行并避免在浏览器上出现跨域字体问题Firefox和IE浏览器。

1 个答案:

答案 0 :(得分:0)

我假设每个app实例(上游)也使用nginx作为代理。

你应该把它放在负责每个app实例(上游)的nginx中,而不是负载均衡器的nginx配置中

location ~ ^/assets/ {
     expires 1y;
     add_header Cache-Control public;

     add_header ETag "";
     break;
   }