Мой сервер работает на JRuby on Rails на Tomcat с интерфейсом GWT, который подключается через gwt :: RequestBuilder. Кажется, что все работает нормально, когда я запускаю WEBrick, а также режим разработки на Tomcat, но в производственном режиме происходит странная вещь. Мой контроллер входа в систему выполняет действие, которое запускается при первом обращении к странице:
def is_logged_in
if session[:current_user]
# do some stuff and render response XML
else
puts "nothing status unauthorized"
render :nothing => true, :status => :unauthorized
end
end
В разработке все работает нормально, и я получаю 401 несанкционированную ошибку, и GWT поднимает ее и отображает экран входа в систему. На производстве я получаю 200 OK без тела XML-ответа, даже если в журналах сервера отображается «Ничего не авторизовано». Очистка временной папки Tomcat и папки веб-приложения не помогла. Что дает? Спасибо за любую помощь, и, надеюсь, я упустил что-то простое.
Для справки:
Я использую JRuby 1.6.6 и Tomcat7 в Windows 7 x64.
Gemfile
source 'http://rubygems.org'
gem 'rails', '3.0.3'
gem 'haml'
# Bundle edge Rails instead:
# gem 'rails', :git => 'git://github.com/rails/rails.git'
platforms :ruby do
gem 'mysql2'
end
platforms :jruby do
gem 'activerecord-jdbc-adapter'
gem 'jdbc-mysql', :require => false
end
group :development do
gem 'rspec-rails'
end
group :test do
gem 'rspec'
gem 'webrat'
end
# Use unicorn as the web server
# gem 'unicorn'
# Deploy with Capistrano
# gem 'capistrano'
# To use debugger (ruby-debug for Ruby 1.8.7+, ruby-debug19 for Ruby 1.9.2+)
# gem 'ruby-debug'
# gem 'ruby-debug19'
# Bundle the extra gems:
# gem 'bj'
# gem 'nokogiri'
# gem 'sqlite3-ruby', :require => 'sqlite3'
# gem 'aws-s3', :require => 'aws/s3'
# Bundle gems for the local environment. Make sure to
# put test-only gems in this group so their generators
# and rake tasks are available in development mode:
# group :development, :test do
# gem 'webrat'
# end
production.rb
Eiserver::Application.configure do
# Settings specified here will take precedence over those in config/application.rb
# The production environment is meant for finished, "live" apps.
# Code is not reloaded between requests
config.cache_classes = true
# Full error reports are disabled and caching is turned on
config.consider_all_requests_local = false
config.action_controller.perform_caching = true
# Specifies the header that your server uses for sending files
config.action_dispatch.x_sendfile_header = "X-Sendfile"
# For nginx:
# config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect'
# If you have no front-end server that supports something like X-Sendfile,
# just comment this out and Rails will serve the files
# See everything in the log (default is :info)
# config.log_level = :debug
# Use a different logger for distributed setups
# config.logger = SyslogLogger.new
# Use a different cache store in production
# config.cache_store = :mem_cache_store
# Disable Rails's static asset server
# In production, Apache or nginx will already do this
config.serve_static_assets = true
# Enable serving of images, stylesheets, and javascripts from an asset server
# config.action_controller.asset_host = "http://assets.example.com"
# Disable delivery errors, bad email addresses will be ignored
# config.action_mailer.raise_delivery_errors = false
# Enable threaded mode
# config.threadsafe!
# Enable locale fallbacks for I18n (makes lookups for any locale fall back to
# the I18n.default_locale when a translation can not be found)
config.i18n.fallbacks = true
# Send deprecation notices to registered listeners
config.active_support.deprecation = :notify
end
Обновление 1
Для дальнейшей проработки в надежде на то, что какая-то душа направит меня в правильном направлении, я на 98% уверен, что проблема заключается в коде Rails, а не в GWT, поскольку выполнение CURL для маршрута is_logged_in приводит к 200 OK, хорошо.
Обновление 2
Вот еще один лакомый кусочек, который я нашел, который, по крайней мере, возвращает меня в рабочее состояние, но все еще оставляет много открытых вопросов. Недавно я обновился до jruby-1.6.6, но на всякий случай сохранил версию jruby-1.6.0. Когда я дрогнул, используя старый jruby, все снова заработало. Но это только указывает на версию jruby и кучу драгоценных камней, из которых я понятия не имею, как начать искать виновника. Кто-нибудь достаточно знаком с линией плагинов, чтобы указать мне правильное направление?
Обновление 3
После откладывания и повторного посещения. Я почти уверен, что это связано с версиями драгоценных камней, которые надоедают. Я сгенерировал WAR с двумя версиями JRuby, 1.6.0 и 1.6.6. Код был идентичным, но у 1.6.0 не было проблем, в то время как у 1.6.6 была упомянутая выше проблема, которая, как оказалось, заключалась в том, что все контроллеры всегда выводили 200 ответов OK только в производственном режиме, независимо от того, какой код состояния я явно установил. Надеюсь, кто-то нашел исправление для этого и добавил его в более новые версии JRuby gem.