aboutsummaryrefslogtreecommitdiffstats
path: root/railties/lib
diff options
context:
space:
mode:
authorJoshua Peek <josh@joshpeek.com>2009-10-05 11:16:24 -0500
committerJoshua Peek <josh@joshpeek.com>2009-10-05 11:16:24 -0500
commit570f055c44a0b6da973f63689f8fedbef9fe32d3 (patch)
tree72d59dbe672653fefcdabda37c24bcb5b80b2b98 /railties/lib
parent20d6938453f439531a13e2ef1fd0905edf56294c (diff)
downloadrails-570f055c44a0b6da973f63689f8fedbef9fe32d3.tar.gz
rails-570f055c44a0b6da973f63689f8fedbef9fe32d3.tar.bz2
rails-570f055c44a0b6da973f63689f8fedbef9fe32d3.zip
Yank FCGI Handler from core
http://github.com/rails/fcgi_handler
Diffstat (limited to 'railties/lib')
-rwxr-xr-xrailties/lib/rails/commands/ncgi/listener86
-rw-r--r--railties/lib/rails/fcgi_handler.rb241
-rw-r--r--railties/lib/rails/generators/rails/app/app_generator.rb16
-rwxr-xr-xrailties/lib/rails/generators/rails/app/templates/dispatchers/dispatch.fcgi24
-rwxr-xr-xrailties/lib/rails/generators/rails/app/templates/dispatchers/dispatch.rb10
-rwxr-xr-xrailties/lib/rails/generators/rails/app/templates/dispatchers/gateway.cgi97
-rw-r--r--railties/lib/rails/tasks/framework.rake5
7 files changed, 0 insertions, 479 deletions
diff --git a/railties/lib/rails/commands/ncgi/listener b/railties/lib/rails/commands/ncgi/listener
deleted file mode 100755
index 7079ef78a6..0000000000
--- a/railties/lib/rails/commands/ncgi/listener
+++ /dev/null
@@ -1,86 +0,0 @@
-#!/usr/bin/env ruby
-
-require 'stringio'
-require 'fileutils'
-require 'fcgi_handler'
-
-def message(s)
- $stderr.puts "listener: #{s}" if ENV && ENV["DEBUG_GATEWAY"]
-end
-
-class RemoteCGI < CGI
- attr_accessor :stdinput, :stdoutput, :env_table
- def initialize(env_table, input = nil, output = nil)
- self.env_table = env_table
- self.stdinput = input || StringIO.new
- self.stdoutput = output || StringIO.new
- super()
- end
-
- def out(stream) # Ignore the requested output stream
- super(stdoutput)
- end
-end
-
-class Listener
- include DRbUndumped
-
- def initialize(timeout, socket_path)
- @socket = File.expand_path(socket_path)
- @mutex = Mutex.new
- @active = false
- @timeout = timeout
-
- @handler = RailsFCGIHandler.new
- @handler.extend DRbUndumped
-
- message 'opening socket'
- DRb.start_service("drbunix:#{@socket}", self)
-
- message 'entering process loop'
- @handler.process! self
- end
-
- def each_cgi(&cgi_block)
- @cgi_block = cgi_block
- message 'entering idle loop'
- loop do
- sleep @timeout rescue nil
- die! unless @active
- @active = false
- end
- end
-
- def process(env, input)
- message 'received request'
- @mutex.synchronize do
- @active = true
-
- message 'creating input stream'
- input_stream = StringIO.new(input)
- message 'building CGI instance'
- cgi = RemoteCGI.new(eval(env), input_stream)
-
- message 'yielding to fcgi handler'
- @cgi_block.call cgi
- message 'yield finished -- sending output'
-
- cgi.stdoutput.seek(0)
- output = cgi.stdoutput.read
-
- return output
- end
- end
-
- def die!
- message 'shutting down'
- DRb.stop_service
- FileUtils.rm_f @socket
- Kernel.exit 0
- end
-end
-
-socket_path = ARGV.shift
-timeout = (ARGV.shift || 90).to_i
-
-Listener.new(timeout, socket_path)
diff --git a/railties/lib/rails/fcgi_handler.rb b/railties/lib/rails/fcgi_handler.rb
deleted file mode 100644
index 77dce5f325..0000000000
--- a/railties/lib/rails/fcgi_handler.rb
+++ /dev/null
@@ -1,241 +0,0 @@
-require 'fcgi'
-require 'logger'
-require 'rails/dispatcher'
-require 'rbconfig'
-
-class RailsFCGIHandler
- SIGNALS = {
- 'HUP' => :reload,
- 'INT' => :exit_now,
- 'TERM' => :exit_now,
- 'USR1' => :exit,
- 'USR2' => :restart
- }
- GLOBAL_SIGNALS = SIGNALS.keys - %w(USR1)
-
- attr_reader :when_ready
-
- attr_accessor :log_file_path
- attr_accessor :gc_request_period
-
- # Initialize and run the FastCGI instance, passing arguments through to new.
- def self.process!(*args, &block)
- new(*args, &block).process!
- end
-
- # Initialize the FastCGI instance with the path to a crash log
- # detailing unhandled exceptions (default RAILS_ROOT/log/fastcgi.crash.log)
- # and the number of requests to process between garbage collection runs
- # (default nil for normal GC behavior.) Optionally, pass a block which
- # takes this instance as an argument for further configuration.
- def initialize(log_file_path = nil, gc_request_period = nil)
- self.log_file_path = log_file_path || "#{RAILS_ROOT}/log/fastcgi.crash.log"
- self.gc_request_period = gc_request_period
-
- # Yield for additional configuration.
- yield self if block_given?
-
- # Safely install signal handlers.
- install_signal_handlers
-
- @app = Dispatcher.new
-
- # Start error timestamp at 11 seconds ago.
- @last_error_on = Time.now - 11
- end
-
- def process!(provider = FCGI)
- mark_features!
-
- dispatcher_log :info, 'starting'
- process_each_request provider
- dispatcher_log :info, 'stopping gracefully'
-
- rescue Exception => error
- case error
- when SystemExit
- dispatcher_log :info, 'stopping after explicit exit'
- when SignalException
- dispatcher_error error, 'stopping after unhandled signal'
- else
- # Retry if exceptions occur more than 10 seconds apart.
- if Time.now - @last_error_on > 10
- @last_error_on = Time.now
- dispatcher_error error, 'retrying after unhandled exception'
- retry
- else
- dispatcher_error error, 'stopping after unhandled exception within 10 seconds of the last'
- end
- end
- end
-
- protected
- def process_each_request(provider)
- request = nil
-
- catch :exit do
- provider.each do |request|
- process_request(request)
-
- case when_ready
- when :reload
- reload!
- when :restart
- close_connection(request)
- restart!
- when :exit
- close_connection(request)
- throw :exit
- end
- end
- end
- rescue SignalException => signal
- raise unless signal.message == 'SIGUSR1'
- close_connection(request)
- end
-
- def process_request(request)
- @processing, @when_ready = true, nil
- gc_countdown
-
- with_signal_handler 'USR1' do
- begin
- ::Rack::Handler::FastCGI.serve(request, @app)
- rescue SignalException, SystemExit
- raise
- rescue Exception => error
- dispatcher_error error, 'unhandled dispatch error'
- end
- end
- ensure
- @processing = false
- end
-
- def logger
- @logger ||= Logger.new(@log_file_path)
- end
-
- def dispatcher_log(level, msg)
- time_str = Time.now.strftime("%d/%b/%Y:%H:%M:%S")
- logger.send(level, "[#{time_str} :: #{$$}] #{msg}")
- rescue Exception => log_error # Logger errors
- STDERR << "Couldn't write to #{@log_file_path.inspect}: #{msg}\n"
- STDERR << " #{log_error.class}: #{log_error.message}\n"
- end
-
- def dispatcher_error(e, msg = "")
- error_message =
- "Dispatcher failed to catch: #{e} (#{e.class})\n" +
- " #{e.backtrace.join("\n ")}\n#{msg}"
- dispatcher_log(:error, error_message)
- end
-
- def install_signal_handlers
- GLOBAL_SIGNALS.each { |signal| install_signal_handler(signal) }
- end
-
- def install_signal_handler(signal, handler = nil)
- if SIGNALS.include?(signal) && self.class.method_defined?(name = "#{SIGNALS[signal]}_handler")
- handler ||= method(name).to_proc
-
- begin
- trap(signal, handler)
- rescue ArgumentError
- dispatcher_log :warn, "Ignoring unsupported signal #{signal}."
- end
- else
- dispatcher_log :warn, "Ignoring unsupported signal #{signal}."
- end
- end
-
- def with_signal_handler(signal)
- install_signal_handler(signal)
- yield
- ensure
- install_signal_handler(signal, 'DEFAULT')
- end
-
- def exit_now_handler(signal)
- dispatcher_log :info, "asked to stop immediately"
- exit
- end
-
- def exit_handler(signal)
- dispatcher_log :info, "asked to stop ASAP"
- if @processing
- @when_ready = :exit
- else
- throw :exit
- end
- end
-
- def reload_handler(signal)
- dispatcher_log :info, "asked to reload ASAP"
- if @processing
- @when_ready = :reload
- else
- reload!
- end
- end
-
- def restart_handler(signal)
- dispatcher_log :info, "asked to restart ASAP"
- if @processing
- @when_ready = :restart
- else
- restart!
- end
- end
-
- def restart!
- config = ::Config::CONFIG
- ruby = File::join(config['bindir'], config['ruby_install_name']) + config['EXEEXT']
- command_line = [ruby, $0, ARGV].flatten.join(' ')
-
- dispatcher_log :info, "restarted"
-
- # close resources as they won't be closed by
- # the OS when using exec
- logger.close rescue nil
- Rails.logger.close rescue nil
-
- exec(command_line)
- end
-
- def reload!
- run_gc! if gc_request_period
- restore!
- @when_ready = nil
- dispatcher_log :info, "reloaded"
- end
-
- # Make a note of $" so we can safely reload this instance.
- def mark_features!
- @features = $".clone
- end
-
- def restore!
- $".replace @features
- # TODO: Reloading the application should be the "Application"s
- # responsibility
- ActionDispatch::Callbacks.new(lambda {}, true)
- ActionController::Routing::Routes.reload
- end
-
- def run_gc!
- @gc_request_countdown = gc_request_period
- GC.enable; GC.start; GC.disable
- end
-
- def gc_countdown
- if gc_request_period
- @gc_request_countdown ||= gc_request_period
- @gc_request_countdown -= 1
- run_gc! if @gc_request_countdown <= 0
- end
- end
-
- def close_connection(request)
- request.finish if request
- end
-end
diff --git a/railties/lib/rails/generators/rails/app/app_generator.rb b/railties/lib/rails/generators/rails/app/app_generator.rb
index b2322f90b4..78b4b057ae 100644
--- a/railties/lib/rails/generators/rails/app/app_generator.rb
+++ b/railties/lib/rails/generators/rails/app/app_generator.rb
@@ -18,9 +18,6 @@ module Rails::Generators
class_option :template, :type => :string, :aliases => "-m",
:desc => "Path to an application template (can be a filesystem path or URL)."
- class_option :with_dispatchers, :type => :boolean, :aliases => "-D", :default => false,
- :desc => "Add CGI/FastCGI/mod_ruby dispatchers code"
-
class_option :skip_activerecord, :type => :boolean, :aliases => "-O", :default => false,
:desc => "Skip ActiveRecord files"
@@ -113,19 +110,6 @@ module Rails::Generators
directory "public", "public", :recursive => false # Do small steps, so anyone can overwrite it.
end
- def create_dispatch_files
- return unless options[:with_dispatchers]
-
- template "dispatchers/dispatch.rb", "public/dispatch.rb"
- chmod "public/dispatch.rb", 0755, :verbose => false
-
- template "dispatchers/dispatch.rb", "public/dispatch.cgi"
- chmod "public/dispatch.cgi", 0755, :verbose => false
-
- template "dispatchers/dispatch.fcgi", "public/dispatch.fcgi"
- chmod "public/dispatch.fcgi", 0755, :verbose => false
- end
-
def create_public_image_files
directory "public/images"
end
diff --git a/railties/lib/rails/generators/rails/app/templates/dispatchers/dispatch.fcgi b/railties/lib/rails/generators/rails/app/templates/dispatchers/dispatch.fcgi
deleted file mode 100755
index f5b3b71875..0000000000
--- a/railties/lib/rails/generators/rails/app/templates/dispatchers/dispatch.fcgi
+++ /dev/null
@@ -1,24 +0,0 @@
-<%= shebang %>
-#
-# You may specify the path to the FastCGI crash log (a log of unhandled
-# exceptions which forced the FastCGI instance to exit, great for debugging)
-# and the number of requests to process before running garbage collection.
-#
-# By default, the FastCGI crash log is RAILS_ROOT/log/fastcgi.crash.log
-# and the GC period is nil (turned off). A reasonable number of requests
-# could range from 10-100 depending on the memory footprint of your app.
-#
-# Example:
-# # Default log path, normal GC behavior.
-# RailsFCGIHandler.process!
-#
-# # Default log path, 50 requests between GC.
-# RailsFCGIHandler.process! nil, 50
-#
-# # Custom log path, normal GC behavior.
-# RailsFCGIHandler.process! '/var/log/myapp_fcgi_crash.log'
-#
-require File.dirname(__FILE__) + "/../config/environment"
-require 'fcgi_handler'
-
-RailsFCGIHandler.process!
diff --git a/railties/lib/rails/generators/rails/app/templates/dispatchers/dispatch.rb b/railties/lib/rails/generators/rails/app/templates/dispatchers/dispatch.rb
deleted file mode 100755
index 48e888113a..0000000000
--- a/railties/lib/rails/generators/rails/app/templates/dispatchers/dispatch.rb
+++ /dev/null
@@ -1,10 +0,0 @@
-<%= shebang %>
-
-require File.dirname(__FILE__) + "/../config/environment" unless defined?(RAILS_ROOT)
-
-# If you're using RubyGems and mod_ruby, this require should be changed to an absolute path one, like:
-# "/usr/local/lib/ruby/gems/1.8/gems/rails-0.8.0/lib/dispatcher" -- otherwise performance is severely impaired
-require "dispatcher"
-
-ADDITIONAL_LOAD_PATHS.reverse.each { |dir| $:.unshift(dir) if File.directory?(dir) } if defined?(Apache::RubyRun)
-Dispatcher.dispatch
diff --git a/railties/lib/rails/generators/rails/app/templates/dispatchers/gateway.cgi b/railties/lib/rails/generators/rails/app/templates/dispatchers/gateway.cgi
deleted file mode 100755
index bdc1055a22..0000000000
--- a/railties/lib/rails/generators/rails/app/templates/dispatchers/gateway.cgi
+++ /dev/null
@@ -1,97 +0,0 @@
-<%= shebang %>
-
-require 'drb'
-
-# This file includes an experimental gateway CGI implementation. It will work
-# only on platforms which support both fork and sockets.
-#
-# To enable it edit public/.htaccess and replace dispatch.cgi with gateway.cgi.
-#
-# Next, create the directory log/drb_gateway and grant the apache user rw access
-# to said directory.
-#
-# On the next request to your server, the gateway tracker should start up, along
-# with a few listener processes. This setup should provide you with much better
-# speeds than dispatch.cgi.
-#
-# Keep in mind that the first request made to the server will be slow, as the
-# tracker and listeners will have to load. Also, the tracker and listeners will
-# shutdown after a period if inactivity. You can set this value below -- the
-# default is 90 seconds.
-
-TrackerSocket = File.expand_path(File.join(File.dirname(__FILE__), '../log/drb_gateway/tracker.sock'))
-DieAfter = 90 # Seconds
-Listeners = 3
-
-def message(s)
- $stderr.puts "gateway.cgi: #{s}" if ENV && ENV["DEBUG_GATEWAY"]
-end
-
-def listener_socket(number)
- File.expand_path(File.join(File.dirname(__FILE__), "../log/drb_gateway/listener_#{number}.sock"))
-end
-
-unless File.exist? TrackerSocket
- message "Starting tracker and #{Listeners} listeners"
- fork do
- Process.setsid
- STDIN.reopen "/dev/null"
- STDOUT.reopen "/dev/null", "a"
-
- root = File.expand_path(File.dirname(__FILE__) + '/..')
-
- message "starting tracker"
- fork do
- ARGV.clear
- ARGV << TrackerSocket << Listeners.to_s << DieAfter.to_s
- load File.join(root, 'script', 'tracker')
- end
-
- message "starting listeners"
- require File.join(root, 'config/environment.rb')
- Listeners.times do |number|
- fork do
- ARGV.clear
- ARGV << listener_socket(number) << DieAfter.to_s
- load File.join(root, 'script', 'listener')
- end
- end
- end
-
- message "waiting for tracker and listener to arise..."
- ready = false
- 10.times do
- sleep 0.5
- break if (ready = File.exist?(TrackerSocket) && File.exist?(listener_socket(0)))
- end
-
- if ready
- message "tracker and listener are ready"
- else
- message "Waited 5 seconds, listener and tracker not ready... dropping request"
- Kernel.exit 1
- end
-end
-
-DRb.start_service
-
-message "connecting to tracker"
-tracker = DRbObject.new_with_uri("drbunix:#{TrackerSocket}")
-
-input = $stdin.read
-$stdin.close
-
-env = ENV.inspect
-
-output = nil
-tracker.with_listener do |number|
- message "connecting to listener #{number}"
- socket = listener_socket(number)
- listener = DRbObject.new_with_uri("drbunix:#{socket}")
- output = listener.process(env, input)
- message "listener #{number} has finished, writing output"
-end
-
-$stdout.write output
-$stdout.flush
-$stdout.close
diff --git a/railties/lib/rails/tasks/framework.rake b/railties/lib/rails/tasks/framework.rake
index 17e16f26fd..16dd0af44e 100644
--- a/railties/lib/rails/tasks/framework.rake
+++ b/railties/lib/rails/tasks/framework.rake
@@ -110,11 +110,6 @@ namespace :rails do
invoke_from_app_generator :create_prototype_files
end
- desc "Generate dispatcher files in RAILS_ROOT/public"
- task :generate_dispatchers do
- invoke_from_app_generator :create_dispatch_files
- end
-
desc "Add new scripts to the application script/ directory"
task :scripts do
invoke_from_app_generator :create_script_files