1

我有一个 nginx + Thin + Rails 3.2 设置。目前我正在尝试设置 nginx,以便它可以直接提供缓存页面。

但是 nginx 仍然在以下 nginx 配置文件中将 *.html 请求传递给 Rails。html 文件存在于 public 文件夹中,nginx 确实找到了它们,只是它们仍然传递给 Rails。

upstream site {
  server unix:/home/site/deploy/site/shared/pids/thin.0.sock;
}

server {
  listen 80;
  server_name www.example.com;
  rewrite ^(/.*) http://example.com$1 permanent;
}

# asset server
server {
  listen 80;
  server_name assets.example.com;
  expires max;
  add_header Cache-Control public;
  charset utf-8;
  root   /home/site/deploy/site/current/public/;
}

# frontend
server {
  listen 80;
  server_name .example.com;
  charset utf-8;

  root   /home/site/deploy/site/current/public/;
  index  index.html;

  location ~* ^.+.(jpg|jpeg|gif|png|swf|zip|rar|doc|xls|exe|pdf|ppt|txt|tar)$ {
    root /home/site/deploy/site/current/public/;
    expires max;
    break;
  }

  # serve static files
  if (-f $request_filename) {
    break;
  }

  gzip on;

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

    if (-f $request_filename) {
      break;
    }

    if (-f $document_root/cache/$host/$uri/index.html) {
      rewrite (.*) /cache/$host/$1/index.html break;
    }

    if (-f $document_root/cache/$host/$uri.html) {
      rewrite (.*) /cache/$host/$1.html break;
    }

    if (-f $document_root/cache/$host/$uri) {
      rewrite (.*) /cache/$host/$1 break;
    }

    proxy_pass http://site;
    break;
  }
}

我是 nginx 新手,这个配置文件是从我之前没有做过的项目中复制过来的,所以这可能是一个非常新手的问题。

4

2 回答 2

1

要允许 nginx 提供静态缓存页面,您需要使用try_files,让我分享一下配置:

upstream site {
  server          unix:/home/site/deploy/site/shared/pids/thin.0.sock fail_timeout=0;
}

server {
  listen          80;
  server_name     www.example.com;
  rewrite ^(/.*)  http://example.com$1 permanent;
}

server {
  listen          80;
  server_name     example.com;
  charset         utf-8;

  root            /home/site/deploy/site/current;
  try_files       $uri/index.html $uri @thin;

  gzip on;

  location @thin {
    proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header  Host $http_host;
    proxy_redirect    off;
    proxy_pass        http://site;
  }

  location ~* ^.+.(jpg|jpeg|gif|png|swf|zip|rar|doc|xls|exe|pdf|ppt|txt|tar)$ {
    root             /home/site/deploy/site/current/public/;
    expires          max;
    break;
  }
}
于 2012-07-03T14:35:23.453 回答
0

这是一个更一般的理论答案(SO编辑拒绝了我在上面的答案中解释的编辑。):

Nginx 有一个ngx_static默认开启的模块。该模块在内容阶段结束时运行。如果该位置块中没有其他内容命令可以在请求中工作,它将提供静态文件。它也仅在 uri 不以斜杠结尾时才有效。

因此,要提供静态文件,需要在content phase结束时确保 uri 是一个有效的路径名,并且没有其他 content phase 命令可以在同一位置块中提供内容。

就我而言,我想访问缓存页面,我可以用它try_files来重写 uri。在内容阶段try_files之前的一个阶段工作,它将检查文件是否存在。如果其中之一存在,则 uri 将更改为该文件。然后在内容阶段,它将被提供。

如果我想提供静态文件(如果存在)或提供动态内容(如果不存在)怎么办?通常提供动态内容会阻止提供静态文件。在这种情况下,可以使用不同的位置块。如果在 过程中没有找到静态文件try_files,我们跳转到另一个位置块(在示例@thin中,所有动态内容都在其中提供。但如果静态文件存在,我们将停留在原始位置块中,并且当我们进入内容阶段时,因为有没有其他内容服务命令,则提供静态文件。

于 2012-09-12T03:41:21.957 回答