Ruby on rails 使用Apache ReverseProxy在TorqueBox上复制Rails应用程序路径中的上下文

Ruby on rails 使用Apache ReverseProxy在TorqueBox上复制Rails应用程序路径中的上下文,ruby-on-rails,ruby,apache,ruby-on-rails-4,torquebox,Ruby On Rails,Ruby,Apache,Ruby On Rails 4,Torquebox,我在一个场景中苦苦挣扎,在这个场景中,我有几个应用程序要在一个单独的TorqueBox实例上运行。定义应用程序并将其部署到config/torquebox.yml中的根(“/”)上下文时,应用程序将正常执行,没有明显的问题。起初我认为这是ApacheReverseProxy的一个问题,但现在我认为这可能是Rails和/或TorqueBox的问题,但我找不到明确的答案或原因 此配置如下所示: config/torquebox.yml包含: web: context: / Apache代理的h

我在一个场景中苦苦挣扎,在这个场景中,我有几个应用程序要在一个单独的TorqueBox实例上运行。定义应用程序并将其部署到
config/torquebox.yml
中的根(“/”)上下文时,应用程序将正常执行,没有明显的问题。起初我认为这是ApacheReverseProxy的一个问题,但现在我认为这可能是Rails和/或TorqueBox的问题,但我找不到明确的答案或原因

此配置如下所示:

config/torquebox.yml
包含:

web:
  context: /
Apache代理的httpd虚拟主机配置为:

ProxyPass / http://127.0.0.1:8080/
ProxyPassReverse / http://127.0.0.1:8080/
有了这个,我可以访问
http://sub.domain.tld/
,带有
posts
posts/new
的路线很好。这大致是通过以下方式实现的(我只执行了一些修改,以使反向代理正常工作)

但当我切换到
torquebox\u test\u rails\u production
的环境下运行时,事情开始变得非常奇怪。我不得不相信,由于某种原因,rails将上下文的副本附加到路径上是错误的。解释:

我将
config/torquebox.yml
更改为:

web:
  context: /torquebox_test_rails_production
config.relative_url_root = "/torquebox_test_rails_production"
以及Apache的httpd虚拟主机配置,以:

ProxyPass / http://127.0.0.1:8080/torquebox_test_rails_production/
ProxyPassReverse / http://127.0.0.1:8080/torquebox_test_rails_production/
当我这样做时,
http://sub.domain.tld/
仍然可以加载,但是当我转到
POST
时,我注意到(在
日志/production.log
中)一个失败的GET请求:

INFO -- : Started GET "/torquebox_test_rails_production/torquebox_test_rails_production/stylesheets/application.css"
FATAL -- : 
ActionController::RoutingError (No route matches [GET] "/torquebox_test_rails_production/stylesheets/application.css"):
  actionpack (4.1.1) lib/action_dispatch/middleware/debug_exceptions.rb:21:in `call'
  actionpack (4.1.1) lib/action_dispatch/middleware/show_exceptions.rb:30:in `call'
  railties (4.1.1) lib/rails/rack/logger.rb:38:in `call_app'
  railties (4.1.1) lib/rails/rack/logger.rb:20:in `call'
  activesupport (4.1.1) lib/active_support/tagged_logging.rb:68:in `tagged'
  activesupport (4.1.1) lib/active_support/tagged_logging.rb:26:in `tagged'
  activesupport (4.1.1) lib/active_support/tagged_logging.rb:68:in `tagged'
  railties (4.1.1) lib/rails/rack/logger.rb:20:in `call'
  actionpack (4.1.1) lib/action_dispatch/middleware/request_id.rb:21:in `call'
  rack (1.5.2) lib/rack/methodoverride.rb:21:in `call'
  rack (1.5.2) lib/rack/runtime.rb:17:in `call'
  rack (1.5.2) lib/rack/sendfile.rb:112:in `call'
  railties (4.1.1) lib/rails/engine.rb:514:in `call'
  railties (4.1.1) lib/rails/application.rb:144:in `call'
正如您所注意到的,它复制了路径上的上下文

此时,URL仍然正确,只需
http://sub.domain.tld/posts
,但当我在脚手架测试中单击“新建帖子”时,应用程序会尝试将浏览器重定向到
http://sub.domain.tld/torquebox_test_rails_production/posts/new
。显然,这种重定向/复制不应该发生。在日志中,我现在看到:

INFO -- : Started GET "/torquebox_test_rails_production/torquebox_test_rails_production/posts/new"
FATAL -- : 
ActionController::RoutingError (No route matches [GET] "/torquebox_test_rails_production/posts/new"):
  actionpack (4.1.1) lib/action_dispatch/middleware/debug_exceptions.rb:21:in `call'
  actionpack (4.1.1) lib/action_dispatch/middleware/show_exceptions.rb:30:in `call'
  railties (4.1.1) lib/rails/rack/logger.rb:38:in `call_app'
  railties (4.1.1) lib/rails/rack/logger.rb:20:in `call'
  activesupport (4.1.1) lib/active_support/tagged_logging.rb:68:in `tagged'
  activesupport (4.1.1) lib/active_support/tagged_logging.rb:26:in `tagged'
  activesupport (4.1.1) lib/active_support/tagged_logging.rb:68:in `tagged'
  railties (4.1.1) lib/rails/rack/logger.rb:20:in `call'
  actionpack (4.1.1) lib/action_dispatch/middleware/request_id.rb:21:in `call'
  rack (1.5.2) lib/rack/methodoverride.rb:21:in `call'
  rack (1.5.2) lib/rack/runtime.rb:17:in `call'
  rack (1.5.2) lib/rack/sendfile.rb:112:in `call'
  railties (4.1.1) lib/rails/engine.rb:514:in `call'
  railties (4.1.1) lib/rails/application.rb:144:in `call'
我在这里尝试的另一件事是将
config.relative\u url\u root
添加到配置中。我通过以下两种方式实现了这一点:

RAILS_RELATIVE_URL_ROOT="/torquebox_test_rails_production"
并在
config/environments/production.rb
中将其设置为:

web:
  context: /torquebox_test_rails_production
config.relative_url_root = "/torquebox_test_rails_production"
我认为应该通过上下文设置来设置它自己,从而实现它的目的,但我认为值得一试

我还从中得到了一个似乎与我相同的提示,但是从
torquebox.yml中删除
context
,仅仅拥有主机名也不能解决问题。相反,它似乎消除了将上下文加倍到路径的问题,但我在
log/production.log
中仍然出现以下错误:

INFO -- : Started GET "/torquebox_test_rails_production/posts"
FATAL -- : 
ActionController::RoutingError (No route matches [GET] "/torquebox_test_rails_production/posts"):
  actionpack (4.1.1) lib/action_dispatch/middleware/debug_exceptions.rb:21:in `call'
  actionpack (4.1.1) lib/action_dispatch/middleware/show_exceptions.rb:30:in `call'
  railties (4.1.1) lib/rails/rack/logger.rb:38:in `call_app'
  railties (4.1.1) lib/rails/rack/logger.rb:20:in `call'
  activesupport (4.1.1) lib/active_support/tagged_logging.rb:68:in `tagged'
  activesupport (4.1.1) lib/active_support/tagged_logging.rb:26:in `tagged'
  activesupport (4.1.1) lib/active_support/tagged_logging.rb:68:in `tagged'
  railties (4.1.1) lib/rails/rack/logger.rb:20:in `call'
  actionpack (4.1.1) lib/action_dispatch/middleware/request_id.rb:21:in `call'
  rack (1.5.2) lib/rack/methodoverride.rb:21:in `call'
  rack (1.5.2) lib/rack/runtime.rb:17:in `call'
  rack (1.5.2) lib/rack/sendfile.rb:112:in `call'
  railties (4.1.1) lib/rails/engine.rb:514:in `call'
  railties (4.1.1) lib/rails/application.rb:144:in `call'
然后,我还尝试在
production.rb
中定义
config.relative\u url\u root
,正如前面提到的,结果与刚才提到的错误完全相同


你知道这里发生了什么会引发这种行为吗

我手头没有Apache配置可供测试,但您的ProxyPass和ProxyPassReverse中是否有尾随斜杠,而torquebox.yml中的web上下文中没有尾随斜杠

所以不是

ProxyPass / http://127.0.0.1:8080/torquebox_test_rails_production/
ProxyPassReverse / http://127.0.0.1:8080/torquebox_test_rails_production/
试一试


这里的解决方案是,我需要在主机定义中使用根上下文(“/”),然后从mod_代理配置中删除该上下文

因此,最终,在
config/torquebox.yml
中,以下内容起到了作用:

web:
  context: /
  host: sub.domain.tld
以及虚拟主机的httpd mod_proxy部分中的以下内容:

<Location />
    ProxyPass http://127.0.0.1:8080/
    ProxyPassReverse http://127.0.0.1:8080/
</Location>

ProxyPasshttp://127.0.0.1:8080/
ProxyPassReversehttp://127.0.0.1:8080/

不幸的是,在
config/torquebox.yml
的上下文中添加一个尾随“/”仍然具有相同的行为。当我从proxypas url arg中删除后缀“/”时,我得到的结果是apache立即将上下文添加到url中,并在我的该站点访问日志中添加404。根据昨天IRC中
thumbs
的一些指示,尾随“/”基本上应该始终用于httpd反向代理传递conf。不要将Apache用于代理,而是尝试使用Nginx。它就是基于这个原因创建的,它的性能比Apache好。请参阅此处:@DamienRoche Nginx不是这种情况下的选项,但感谢您的建议。如果它是一个选项,我肯定会使用它。此外,这是使用HTTPD 2.4,所以它现在有效地与NGIX现在无论如何,这是一个耻辱。无论如何,祝你好运找到解决办法。