我在适当的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;
配置的内容,无法弄清楚错误的位置。
答案 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;
}
}
我已经注释掉旧代码以便于参考,以防这对其他人有用。两个变化似乎已经成功了:
root
添加了一个尾部斜杠。我没有在我读过的任何(很多)例子中看到这一点,但似乎这里有必要。 (这也很奇怪,因为在nginx看到正确的位置之前,减去延伸,所以我不确定为什么会有所作为,但我不会在口中看到礼物马。)try_files
之前尝试加载匹配$ request_uri的文件,但在该块之外它会在尝试之前处理try_files
加载不存在的文件。为了记录,我反向代理这个服务器,这可能与我的问题有关。在模仿之后有一个nginx bug早期版本与request_uri
中的try_files
有关(查看更改日志是否与你相关)但是它们应该已经修复了最新版本,我是现在正在运行。
我可能在这里犯了一些非常基本的错误,我很幸运地进入了一个工作版本,但我想我会记录这个,以防它对任何人都有用。