我正在使用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浏览器。
答案 0 :(得分:0)
我假设每个app实例(上游)也使用nginx作为代理。
你应该把它放在负责每个app实例(上游)的nginx中,而不是负载均衡器的nginx配置中
location ~ ^/assets/ {
expires 1y;
add_header Cache-Control public;
add_header ETag "";
break;
}