gpt4 book ai didi

ruby-on-rails - 如何在 mod_ajp Apache 2 代理后面的 jRuby 上运行 Rails 3.0

转载 作者:行者123 更新时间:2023-11-28 22:22:52 26 4
gpt4 key购买 nike

我想知道是否有人通过 AJP 安装获得了 jRuby Rails 3.0 应用程序以在 Apache 2 代理后面工作。我希望在不取消最后一条语句的注释的情况下使用以下配置。

<VirtualHost *:80>

ServerName app.example.com

ProxyRequests Off
ProxyPass / ajp://127.0.0.1:8009/app/
ProxyPassReverse / ajp://127.0.0.1:8009/app/

# ProxyPassReverse / http://app.example.com/app/

</VirtualHost>

首先,似乎没有办法在 Rails 应用程序中获取命名路由的相对重定向(即 restful_authentication 的登录和注销路由)。 Rails 应用程序甚至不会在 AJP 装载上 Hook 反向代理语句,但必须捕获完整 URI 的静态 HTTP 反向代理规则(在注释中显示)。其次,似乎没有合适的方法根据反向代理规则在一个级别上建议 HTML 助手的 Assets 输出。

我可以这样做,但感觉更像是一种利用,很像静态反向代理规则:

config.asset_path = proc { |path| path.gsub(/\/app\//, '/') }

添加 RAILS_RELATIVE_URL_ROOT 显然只会增加已部署的 warble WAR 的已配置范围,而无助于减少路由。

肯定有mod_proxy_ajp解决方案来运行不精确匹配路由的proxy和reverseproxy。

关于如何解决这个问题或为我指出涵盖该问题的资源方向的任何想法?

最佳答案

解决方案一

我认为,如果你需要 HTTP 重写魔法,你需要从使用 ajp 切换到使用 http 代理,它修复了不同路径之间代理的几个极端情况,它重写了 http header ,我不确定代理ajp 就是这样做的。我只是尝试将 Rails 应用程序作为 ROOT.war 或虚拟主机或 tomcat 服务器上的某些东西提供服务,以最大限度地减少将文件夹代理为根目录的错误源。总有一些东西不起作用或需要调整。端口和本地域名很便宜。

将此添加到您的生产环境配置文件中:

config.action_controller.relative_url_root = '/app'

查看更多 @ What is the replacement for ActionController::Base.relative_url_root?


解决方案 2:

如果您愿意,可以使用一些简单的机架中间件在 Rails 应用程序中重置传入路径。这样 Rails 应用程序就不会知道任何关于不在根路径中服务的信息。您可能还想添加 config.serve_static_assets = true 以使 Rails 在生产模式下提供静态 Assets 。

# application.rb
require "proxy_path_reset_filter"
config.middleware.use "ProxyPathResetFilter"
config.action_controller.relative_url_root = '/'

很抱歉徒手打字,但它应该可以工作。

 # proxy_path_reset_filter.rb
class ProxyPathResetFilter

def initialize(app)
@app = app
end

def call(env)
# some servers use REQUEST_URI and some use PATH_INFO for routing use both
if (env['REQUEST_URI'] || env['PATH_INFO']) =~ /^\/app\//
env.update({
'REQUEST_URI' => env['REQUEST_URI'].gsub(/^\/app\//, '/')),
'PATH_INFO' => env['PATH_INFO'].gsub(/^\/app\//, '/')) })
end
@app.call(env)
end

end

关于ruby-on-rails - 如何在 mod_ajp Apache 2 代理后面的 jRuby 上运行 Rails 3.0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7403870/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com