3

我正在尝试在两种情况下都使用Passenger从Apache迁移到nginx来托管Rails应用程序。该应用程序接受一个请求,这是一个图像 - 如果图像存在于 /system/logos/$requestedimage 那么它应该得到服务,或者它应该被允许在需要时点击 Rails 应用程序来生成它(然后它在哪里缓存到 /system/logos)。

在 Apache 中,我使用了以下内容:

RewriteCond %{DOCUMENT_ROOT}/system/logos/%{REQUEST_FILENAME} -f
RewriteRule ^/(.*)$ http://assets.clg.eve-metrics.com/system/logos/$1

这工作得很好。资产。子域是另一个子域,但具有相同的根,只是禁用了乘客,专门设置用于托管静态文件(过期)。

在 nginx 中,我使用以下内容:

server {
  listen 80;
  passenger_enabled on;
  server_name  clg.eve-metrics.com www.clg.eve-metrics.com;
  root /opt/www/clg/current/public;
  gzip             on;
  gzip_min_length  1000;
  gzip_proxied     expired no-cache no-store private auth;
  gzip_types       text/plain application/xml text/css application/javascript;
  gzip_disable     msie6;
  error_page   500 502 503 504  /50x.html;
  location = /50x.html {
  }
  if (-f $document_root/system/logos$request_filename) { 
    rewrite ^/(.*)$ http://assets.clg.eve-metrics.com/system/logos/$1 break;
  }
}

这不太好用。事实上。它永远不会重定向到缓存路径,也永远不会命中 Rails 应用程序。这就像 nginx 假设它是一个静态资产,所以不将它传递给乘客。有没有办法阻止这种行为,让它影响应用程序?

4

2 回答 2

4

我的 Rails 应用程序在 nginx 和乘客上运行。我已将我的 rails 缓存目录从默认移动/public/public/system/cache/. 为了使它工作,我必须将它插入到我的虚拟主机配置文件中:

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

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

我记得我也试图让它与 . 一起工作$request_filename,但没有让它工作。尝试$uri改用,看看它是否有效:-)

于 2009-07-24T16:48:52.973 回答
0

詹姆斯,请尝试这个配置文件 https://gist.github.com/711913 并注意这个位置配置:

  location ~* \.(png|gif|jpg|jpeg|css|js|swf|ico)(\?[0-9]+)?$ {
      access_log off;
      expires max;
      add_header Cache-Control public;
  }

如果您有正确的权限,乘客不会让 Rails 管理您的资产文件(运行 nginx 的用户应该有权直接访问文件)

于 2010-12-03T05:24:48.223 回答