Как запустить Rails 3.0 на jRuby за прокси-сервером Apache 2 mod_ajp - PullRequest
1 голос
/ 13 сентября 2011

Интересно, есть ли у кого-нибудь приложение jRuby Rails 3.0 для работы через прокси-сервер Apache 2 через монтирование AJP.Мне бы хотелось, чтобы работала следующая конфигурация, не раскомментируя последний оператор.

<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, но должно быть зафиксировано в статическом правиле обратного прокси-сервера HTTP для полного URI (показано в комментарии).Во-вторых, кажется, что не существует правильного способа предложить вывод активов помощников HTML на уровне согласно правилам обратного прокси.

Я мог бы сделать это, но это скорее похоже на эксплойт, очень похожий на статический реверсправило прокси:

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

Добавление RAILS_RELATIVE_URL_ROOT явно добавляет только к уже настроенной области развернутой warble WAR и не помогает сократить маршруты.

Для работы обязательно должны быть решения mod_proxy_ajpпрокси и обратный прокси с неточными маршрутами сопоставления.

Любые идеи о том, как решить эту проблему или указать мне направление на ресурс, освещающий проблему?

1 Ответ

1 голос
/ 13 сентября 2011

Раствор 1

Я думаю, что если вам нужна магия перезаписи HTTP, вам нужно переключиться с использования ajp и использовать прокси-сервер http, это исправляет пару угловых случаев при прокси между разными путями, он переписывает заголовки http, я не уверен, что прокси это делает ajp. Я бы просто попытался использовать приложение rails как ROOT.war или на виртуальном хосте или что-то на сервере tomcat, чтобы минимизировать источник ошибок при перенаправлении папки в качестве пользователя root. Всегда есть что-то, что не работает или нуждается в корректировке. Порты и локальные доменные имена дешевы.

Добавьте это в файл конфигурации вашей производственной среды:

config.action_controller.relative_url_root = '/app'

подробнее @ Чем заменить ActionController :: Base.relative_url_root?


Решение 2:

Если вы хотите, вы можете сбросить входящие пути в приложении rails с помощью небольшого промежуточного программного обеспечения стойки. Таким образом, приложение rails не будет ничего знать о том, что он не обслуживается в корневом пути. Вы также можете добавить config.serve_static_assets = true, чтобы рельсы обслуживали статические ресурсы в производственном режиме.

# 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
...