1

nginx + thin + Rails 3.2 セットアップがあります。現在、キャッシュされたページを直接提供できるようにnginxをセットアップしようとしています。

ただし、nginx は以下の nginx 構成ファイルで *.html リクエストを Rails に渡します。HTMLファイルはパブリックフォルダーに存在し、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

より一般的な理論的な回答を次に示します (編集者は、上記の回答で説明するために私の編集を拒否しました)。

Nginxには、ngx_staticデフォルトでオンになっているモジュールがあります。このモジュールは、コンテンツ フェーズの最後に実行されます。そのロケーション ブロック内の他のコンテンツ コマンドがリクエストで機能しない場合、静的ファイルを提供します。また、uri がスラッシュで終わっていない場合にのみ機能します。

したがって、静的ファイルを提供するには、コンテンツ フェーズの終わりまでに uri が有効なパス名であることを確認する必要があり、同じロケーション ブロック内のものを提供できる他のコンテンツ フェーズ コマンドはありません。

私の場合、キャッシュされたページにアクセスしたいのでtry_files、uriを書き換えるために使用できます。content フェーズtry_filesの直前のフェーズで動作し、ファイルの存在を確認します。それらのいずれかが存在する場合、uri はそのファイルに変更されます。その後、コンテンツ フェーズでサービスが提供されます。

存在する場合は静的ファイルを提供したい場合、または存在しない場合は動的コンテンツを提供したい場合はどうすればよいですか? 通常、動的コンテンツを提供すると、静的ファイルが提供されなくなります。この場合、別のロケーション ブロックを使用できます。で静的ファイルが見つからない場合はtry_files、別の場所ブロックにジャンプします (例@thinでは、すべての動的コンテンツが提供されます。しかし、静的ファイルが存在する場合は、元の場所ブロックに留まり、コンテンツ フェーズに入ると、他のコンテンツ提供コマンドがない場合、静的ファイルが提供されます。

于 2012-09-12T03:41:21.957 に答える