nginx try_files:404尝试添加扩展并回退到Passenger / Rails时

时间:2014-02-05 21:39:28

标签: ruby-on-rails nginx passenger

我在适当的nginx声明中苦苦挣扎 我想做的事情非常简单:对*.public.domain.com的任何请求,我都希望查找缓存文件,如果一个文件不可用,请将请求发送到Passenger / Rails过程

缓存文件(如果存在)附加.html以防止目录/文件冲突,因此/test应查找/test.html/test/2应查找{{1} }}。
缓存文件特定于子域​​,因此/test/2.html应该在abc.public.domain.com文件夹中查找。

以下是相关的nginx代码:

/sites/abc

在我的日志文件中,我看到nginx正在尝试加载没有.html扩展名的文件。例如,我看到了这一点: server { # listen/SSL stuff removed for brevity server_name *.public.domain.com; location ~ "^(.*)\.public\.domain\.com" { root /var/applications/app/current/sites/$1; try_files $request_uri.html $request_uri/index.html @passenger; } location @passenger { root /var/applications/app/current/public; passenger_enabled on; passenger_user www-data; } } 但没有尝试加载/var/applications/app/current/sites/abc/test" failed (2: No such file or directory)。所以看起来子域正则表达式和根声明工作正常;添加扩展名不是。

这就是问题1.

问题2是,在找不到文件时,nginx不会回退到test.html它抛出404而不是允许Rails处理请求并自己提供文件。

关于我做错了什么的任何想法?我已经阅读了很多关于@passenger;配置的内容,无法弄清楚错误的位置。

1 个答案:

答案 0 :(得分:0)

好吧,看起来经过多次摆弄我已经设法让这个工作。这是更新后的代码:

server {
  # listen/SSL stuff removed for brevity

  server_name *.public.domain.com;

  #location ~ "^(.*)\.public\.domain\.com" {
  #  root /var/applications/app/current/sites/$1;
  #  try_files $request_uri.html $request_uri/index.html @passenger;
  #}

  if ($host ~ "^(.*)\.public\.domain\.com" ) { set $subdomain $1; }
  root /var/applications/app/current/sites/$subdomain/;
  try_files $request_uri.html $request_uri/index.html @passenger;

  location @passenger {
      root /var/applications/app/current/public;
      passenger_enabled on;
      passenger_user www-data;
  }
}

我已经注释掉旧代码以便于参考,以防这对其他人有用。两个变化似乎已经成功了:

  1. 我在root添加了一个尾部斜杠。我没有在我读过的任何(很多)例子中看到这一点,但似乎这里有必要。 (这也很奇怪,因为在nginx看到正确的位置之前,减去延伸,所以我不确定为什么会有所作为,但我不会在口中看到礼物马。)
  2. 我删除了位置块。我不能确定发生了什么,但似乎nginx会在处理位置块中的try_files之前尝试加载匹配$ request_uri的文件,但在该块之外它会在尝试之前处理try_files加载不存在的文件。
  3. 为了记录,我反向代理这个服务器,这可能与我的问题有关。在模仿之后有一个nginx bug早期版本与request_uri中的try_files有关(查看更改日志是否与你相关)但是它们应该已经修复了最新版本,我是现在正在运行。

    我可能在这里犯了一些非常基本的错误,我很幸运地进入了一个工作版本,但我想我会记录这个,以防它对任何人都有用。