我在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;
}
答案 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配置。