我们需要在ubuntu 12.04服务器上部署rails 3.2.12 app到sub uri nbhy. rails应用程序有3个引擎,其中一个是authentify,用于用户身份验证.主应用程序的根指向authentify的登录页面.这是主应用程序中的routes.rb:
root :to => "authentify::sessions#new"
match '/signin', :to => 'authentify::sessions#new'
match '/signout', :to => 'authentify::sessions#destroy'
match '/user_menus', :to => 'user_menus#index'
match '/view_handler', :to => 'authentify::application#view_handler'
该应用程序部署为基于uri nbhy在ubuntu 12.04上运行乘客和Nginx.在同一台服务器上,还有另一个rails app在自己的子uri中运行.以下是Nginx.conf中sub uri nbhy的配置:
server {
listen 80;
server_name 6.95.225.93;
root /var/www/;
passenger_enabled on;
rails_env production;
passenger_base_uri /by;
passenger_base_uri /nbhy;
#for rails >=3.1, assets pipeline
location ~ ^/assets/ {
expires max;
add_header Cache-Control public;
add_header ETag "";
break;
}
}
此外,在文档根/ var / www处创建符号链接nbhy,指向/ var / www / nbhyop / current / public.这是root / var / www /的输出:
total 8
lrwxrwxrwx 1 cjadmin www-data 28 Nov 3 2012 by -> /var/www/byop/current/public
drwxrwsr-x 4 cjadmin www-data 4096 Nov 4 2012 byop
lrwxrwxrwx 1 cjadmin www-data 30 May 16 21:27 nbhy -> /var/www/nbhyop/current/public
drwxrwsr-x 4 cjadmin www-data 4096 May 14 15:21 nbhyop
by是第一个部署到子URI的rails应用程序,运行正常.
输入http://6.95.225.93/nbhy后会显示登录页面.键入用户和密码后,页面被重定向到http://6.95.225.93/authentify/session,404 Not Found错误.在Nginx error.log中发现错误:
2013/05/13 16:29:25 [error] 2384#0: *1 open() "/var/www/authentify/session" Failed (2: No such file or directory), client: 192.168.1.1, server: 6.95.225.93, request: "POST /authentify/session HTTP/1.1", host: "6.95.225.93", referrer: "http://6.95.225.93/nbhy/"
显然/ var / www / authentify / session不会出现在正确的页面上,因为它缺少www和authentify之间的基础uri nbhy.根据我们的分析,authentify会话控制器中的create未被命中,即使使用正确的用户名和密码,用户也未经过身份验证,网址为http://6.95.225.93/nbhy.
另请注意,用户可以通过http://6.95.225.93/nbhy/authentify/session/new登录.登录后,页面将被重定向到http://6.95.225.93/user_menus,这将导致404 Not Found错误.但是如果我们在之间插入nbhy:http://6.95.225.93/nbhy/user_menus,那么它将成功打开用户菜单页面.对于任何进一步点击链接,手动插入nbhy将使链接工作(如果缺少nbhy).
在没有子uri的情况下部署rails应用程序时工作正常.
为什么路线上缺少子uri?有没有办法让我们在这里留下并消除错误?感谢帮助.
解决方法:
很可能authentify引擎正在重定向到/ user_menus,而不是/ nbhy / authentify.这是您编写的自定义Rails或Sinatra应用程序吗?如果是这样,您需要更改/配置authentify代码以始终附加托管Rails应用程序的当前子目录.您可以通过在代码中说ENV [‘RAILS_RELATIVE_URL_ROOT’]来获得乘客的信息.