Rails页面使用nginx独角兽缓存多个服务器

时间:2013-12-03 08:22:20

标签: ruby-on-rails caching nginx unicorn

我在Rails 4上使用页面缓存gem。我有一个运行nginx的web服务器,运行unicorn和rails的app服务器,以及运行postgre的db server。

在应用服务器上生成页面缓存时,nginx将不会提供静态文件。只有在我设置

之后
config.serve_static_assets = true

页面缓存将在生产中工作。考虑到现在rails正在为静态文件服务,我认为这不是理想的。

如何让nginx提供位于应用服务器上的页面缓存?

这是我的nginx配置:

upstream unicorn {
  server <%= app_private_ip %>:8080 fail_timeout=0;
}

server {

  # listen [::]:80 ipv6only=on default_server;

  listen 80 default deferred;
  server_name <%= domain %>;
  # rewrite ^(.*) https://<%= domain %>$1 permanent;


  root <%= current_path %>/public;
  sendfile on;

  if (-f $document_root/system/maintenance.html) {
    return 503;
  }
  error_page 503 @maintenance;
  location @maintenance {
    rewrite  ^(.*)$  /system/maintenance.html last;
    break;
  }

  location ^~ /assets/ {
    gzip_static on;
    expires max;
    add_header Cache-Control public;
  }

  try_files $uri/index.html $uri @unicorn;
  location @unicorn {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    proxy_pass http://unicorn;
  }

  error_page 500 502 503 504 /500.html;
  client_max_body_size 4G;
  keepalive_timeout 10;
  server_tokens off;

}

server {
  listen                443;
  server_name           <%= domain %>;
  ssl                   on;
  ssl_certificate       /home/<%= user %>/ssl/<%= domain %>.pem;
  ssl_certificate_key   /home/<%= user %>/ssl/<%= domain %>.key;


  root <%= current_path %>/public;
  sendfile on;

  if (-f $document_root/system/maintenance.html) {
    return 503;
  }
  error_page 503 @maintenance;
  location @maintenance {
    rewrite  ^(.*)$  /system/maintenance.html last;
    break;
  }


  location ^~ /assets/ {
    gzip_static on;
    expires max;
    add_header Cache-Control public;
  }

  try_files $uri/index.html $uri @unicorn;
  location @unicorn {
    proxy_set_header  X-Real-IP       $remote_addr;
    proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header  X-Forwarded-Proto https;
    proxy_set_header  Host $http_host;
    proxy_redirect    off;
    proxy_pass        http://unicorn;
  }

  error_page 500 502 503 504 /500.html;
  client_max_body_size 4G;
  keepalive_timeout 10;
  server_tokens off;
}

2 个答案:

答案 0 :(得分:0)

nginx try_files指令允许您设置级联方法来解析不同位置/后端的URI的静态文件。

看起来您需要将try_files指令移到location块中才能正常工作:

location / {
  try_files $uri @unicorn;
}

这应该告诉nginx在将请求传递给你的独角兽后端之前尝试通过URI在本地解析路径。

答案 1 :(得分:0)

页面缓存gem要求您将缓存目录设置为“public / cache” application.rb中;

config.action_controller.page_cache_directory = "#{Rails.root.to_s}/public/cache"

所以你的try_files行应该是;

try_files /cache/$uri/index.html /cache/$uri @unicorn;

否则你可以将page_cache_directory设置为; "#{Rails.root.to_s}/public"并且不会更改您当前的nginx配置。