2013-12-03 3 views
0

Я использую кеширование страницы на Rails 4. У меня есть веб-сервер, на котором работает nginx, сервер приложений, работающий с единорогом и рельсами, и сервер db, работающий с postgre.Rails page cache несколько серверов с nginx unicorn

Когда к серверу приложений генерируется кеш-страница, nginx не будет обслуживать статические файлы. Только после того, как я установил

config.serve_static_assets = true 

где кеш-страница будет работать в процессе производства. Я не думаю, что это идеально, но учитывая, что теперь рельсы обслуживают статический файл.

Как я могу заставить 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; 
} 

ответ

0

директива Nginx try_files позволяет установить каскадные способы разрешения статического файла для URI в разных местах/движков.

Похоже, что вам нужно, чтобы переместить try_files директиву в location блок для того, чтобы работать должным образом:

location/{ 
    try_files $uri @unicorn; 
} 

Это должно сказать Nginx, чтобы попытаться решить пути локально URI перед передачей запроса на ваш единорога бэкэндом ,

0

Кэширование страницы требует, чтобы кэш-каталог был «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.

Смежные вопросы