diff --git a/Gemfile b/Gemfile index e2a648b0..8231da2a 100644 --- a/Gemfile +++ b/Gemfile @@ -67,7 +67,14 @@ gem 'http_accept_language' # Routes for JS files gem 'js-routes', '~> 1.1.0' +# Use Puma webserver for the application. +gem 'puma' + group :test do + + # Use Thin webserver for konacha tests. + gem 'thin' + # Easier test writing gem "shoulda-matchers", '~> 2.8.0' @@ -80,8 +87,6 @@ group :test do # Test coverage report gem 'codeclimate-test-reporter', require: nil - # For Konacha - gem 'thin' end # Startup script generation (server process manager) diff --git a/Gemfile.lock b/Gemfile.lock index 0aba83b9..32119b05 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -216,6 +216,7 @@ GEM cliver (~> 0.3.1) multi_json (~> 1.0) websocket-driver (>= 0.2.0) + puma (3.8.2) rack (1.6.4) rack-test (0.6.3) rack (>= 1.0) @@ -371,6 +372,7 @@ DEPENDENCIES mocha pg (~> 0.18.1) poltergeist (~> 1.7.0) + puma rails (= 4.2.4) rails-html-sanitizer (~> 1.0) railsstrap (~> 3.3.4) @@ -390,4 +392,4 @@ DEPENDENCIES web-console (~> 2.0.0) BUNDLED WITH - 1.11.2 + 1.14.6 diff --git a/Procfile b/Procfile index e905ce60..528ca4bf 100644 --- a/Procfile +++ b/Procfile @@ -1 +1 @@ -web: bundle exec rails s -p $PORT -e $RAILS_ENV \ No newline at end of file +web: bundle exec puma -C config/puma.rb \ No newline at end of file diff --git a/config/application.rb b/config/application.rb index 7d9b0b4d..a1b5ef41 100644 --- a/config/application.rb +++ b/config/application.rb @@ -23,5 +23,8 @@ class Application < Rails::Application # Do not swallow errors in after_commit/after_rollback callbacks. config.active_record.raise_in_transactional_callbacks = true + + require "#{Rails.root}/lib/core_extensions/rack/handler" + end end diff --git a/config/initializers/konacha.rb b/config/initializers/konacha.rb index 91ccef7a..c2c8f862 100644 --- a/config/initializers/konacha.rb +++ b/config/initializers/konacha.rb @@ -8,7 +8,7 @@ config.driver = :poltergeist end - # Use thin to run Konacha tests. This is needed because the tests hang frequently in Travis using the default (WEBRick) + # Use Thin to run Konacha tests. This is needed because the tests hang frequently in Travis using the default (WEBRick) # We can't just do 'Capybara.server' in the configure block because it will also apply to anything else run by # Capybara. So instead, override the Konacha.run method to change the server, and restore it after completion. module Konacha diff --git a/config/initializers/rack.rb b/config/initializers/rack.rb new file mode 100644 index 00000000..e69de29b diff --git a/config/puma.rb b/config/puma.rb new file mode 100644 index 00000000..fee2a65e --- /dev/null +++ b/config/puma.rb @@ -0,0 +1,15 @@ +workers Integer(ENV['WEB_CONCURRENCY'] || 2) +threads_count = Integer(ENV['RAILS_MAX_THREADS'] || 5) +threads threads_count, threads_count + +preload_app! + +rackup DefaultRackup +port ENV['PORT'] || 3000 +environment ENV['RACK_ENV'] || 'development' + +on_worker_boot do + # Worker specific setup for Rails 4.1+ + # See: https://devcenter.heroku.com/articles/deploying-rails-applications-with-the-puma-web-server#on-worker-boot + ActiveRecord::Base.establish_connection +end \ No newline at end of file diff --git a/lib/core_extensions/rack/handler.rb b/lib/core_extensions/rack/handler.rb new file mode 100644 index 00000000..38c30a99 --- /dev/null +++ b/lib/core_extensions/rack/handler.rb @@ -0,0 +1,15 @@ +# Monkey Patch for Rack to choose Puma as the default webserver. +# Without this, Thin takes precedence over Puma. +# Removing Thin would make this unnecessary. However, Thin is needed for Konacha. + +module Rack + require 'rack/handler/puma' + + module Handler + + def self.default argument + return Rack::Handler::Puma + end + + end +end \ No newline at end of file diff --git a/spec/lib/core_extensions/rack/handler_spec.rb b/spec/lib/core_extensions/rack/handler_spec.rb new file mode 100644 index 00000000..d2fcdd15 --- /dev/null +++ b/spec/lib/core_extensions/rack/handler_spec.rb @@ -0,0 +1,12 @@ +require 'rails_helper' +require "#{Rails.root}/lib/core_extensions/rack/handler" + +RSpec.describe Rack::Handler do + + describe 'default webserver' do + it 'should be puma' do + argument = 'argument' + expect(Rack::Handler.default argument).to eq(Rack::Handler::Puma) + end + end +end \ No newline at end of file