1
0
Fork 0
mirror of https://github.com/puma/puma.git synced 2022-11-09 13:48:40 -05:00

Release that has better Rails servicing support. Might not work in win32.

git-svn-id: svn+ssh://rubyforge.org/var/svn/mongrel/trunk@32 19e92222-5c0b-0410-8929-a290d50e31e9
This commit is contained in:
zedshaw 2006-02-12 03:37:38 +00:00
parent 996d104665
commit 67a0d9e933
5 changed files with 123 additions and 97 deletions

52
README
View file

@ -11,30 +11,31 @@ scream without too many portability issues.
== Status
The 0.3 release is the first official release to start supporting Ruby on Rails
and to have a more complete DirHandler for serving directories of files. This release
is actually closer to a full functioning web server than the previous releases.
The 0.3.1 release support Ruby On Rails much better than previously, and also
sports the beginning of a command and plugin infrastructure. This last part
isn't documented yet.
The Rails support is pretty rough right now, but check out the bin/mongrel_rails file,
which should be installed into your PATH if you use a gem. You should be able to
do the following to run your Rails applications:
After you've installed (either with gem install mongrel or via source) you should
have the mongrel_rails command available in your PATH. Then you just do the following:
> cd myrailsapp
> mongrel_rails 0.0.0.0 3000
> cd myrailsapp
> mongrel_rails start
And then hit http://localhost:3000/ to see your app. One thing is that if you have
a public/index.html file then you'll get that served instead of your Rails application.
This will start it in the foreground so you can play with it. It runs your application
in production mode. To get help do:
People with the daemons gem installed will see that mongrel_rails will go into the
background. You can kill it with:
> mongrel_rails start -h
> kill -TERM `cat log/mongrel-3000.pid`
Finally, you can then start in background mode (probably won't work in win32):
Where "3000" is whatever port you told it to listen on when you ran it.
> mongrel_rails start -d
The file serving is still a little rough and the redirects might not work well, but
try it out and tell me about any weird errors. File uploads will definitely have some
problems.
And you can stop it whenever you like with:
> mongrel_rails stop
All of which should be done from your application's directory. It writes the
PID of the process you ran into log/mongrel.pid.
== Install
@ -82,16 +83,13 @@ type mapping is missing though.*
== Speed
The 0.2.1 release probably consists of the most effort I've ever put into
tuning a Ruby library for speed. It consists of nearly everything I could think
of to make Mongrel the fastest Ruby HTTP library possible. I've tried about
seven different architectures and IO processing methods and none of them
make it any faster. In short: Mongrel is amazingly fast considering Ruby's speed
limitations.
Like previous releases 0.3.1 continues the trend of making things
as fast as possible. It currently might be a little slower than
other releases but should hold up pretty good against at least
WEBrick (especially when running Rails).
This release also brings in controllable threads that you can scale to meet your
needs to do your processing. Simple pass in the HttpServer.new third optional
parameter:
As before you can control the number of processor threads (and thus
ActiveRecord database connections) with:
h = Mongrel::HttpServer.new("0.0.0.0", "3000", 40)
@ -101,8 +99,6 @@ limited processors also means that you can use ActiveRecord as-is and it will
create a matching database connection for each processor thread. More on
this in future releases.
With this release I'm hoping that I've created a nice solid fast as hell core
upon which I can build the remaining features I want in Mongrel.
== The Future

View file

@ -24,6 +24,8 @@ end
setup_extension("http11", "http11")
summary = "An experimental fast simple web server for Ruby."
summary = "A small fast HTTP library and server that runs Rails, Camping, and Nitro apps."
test_file = "test/test_ws.rb"
setup_gem("mongrel", "0.3", "Zed A. Shaw", summary, ['mongrel_rails'], test_file)
setup_gem("mongrel", "0.3.1", "Zed A. Shaw", summary, ['mongrel_rails'], test_file) do |spec|
spec.add_dependency('daemons', '>= 0.4.2')
end

View file

@ -83,6 +83,7 @@ class RailsHandler < Mongrel::HttpHandler
end
class StartCommand < Mongrel::Command::Command
def configure
@ -109,15 +110,16 @@ class StartCommand < Mongrel::Command::Command
cwd = Dir.pwd
if @daemon
STDERR.puts "Running as Daemon at #@address:#@port"
puts "Running as Daemon at #@address:#@port"
Daemonize.daemonize(log_file=@log_file)
open(File.join(cwd,@pid_file),"w") {|f| f.write(Process.pid) }
# change back to the original starting directory
Dir.chdir(cwd)
else
STDERR.puts "Running at #@address:#@port"
puts "Running at #@address:#@port"
end
ENV['RAILS_ENV'] = @environment
require 'config/environment'
h = Mongrel::HttpServer.new(@address, @port)
@ -127,12 +129,43 @@ class StartCommand < Mongrel::Command::Command
begin
h.acceptor.join
rescue Interrupt
STDERR.puts "Interrupted."
puts "Interrupted."
end
end
end
class StopCommand < Mongrel::Command::Command
def configure
options [
["-d", "--daemonize", "Whether to run in the background or not", :@daemon, false],
['-P', '--pid FILE', "Where to write the PID", :@pid_file, "log/mongrel.pid"]
]
end
def validate
valid_exists? @pid_file, "PID file #@pid_file does not exist. Not running?"
return @valid
end
def run
pid = open(@pid_file).read.to_i
print "Stopping Mongrel at PID #{pid}..."
begin
Process.kill("INT", pid)
rescue Errno::ESRCH
puts "Process does not exist. Not running."
end
File.unlink(@pid_file)
puts "Done."
end
end
Mongrel::Command::Registry.instance.run ARGV

View file

@ -4,13 +4,21 @@ require 'pluginfactory'
module Mongrel
# Contains all of the various commands that are used with
# Mongrel servers.
module Command
# A Command pattern implementation used to create the set of command available to the user
# from Mongrel. The script uses objects which implement this interface to do the
# user's bidding.
#
# Implementing a command is fairly easy. Refer to some of the stock commands in the
# lib/mongrel/command directory for examples.
# Creating a new command is very easy, and you can do it without modifying the source
# of Mongrel thanks to PluginFactory. What you do is the following:
#
# 1.
class Command
include PluginFactory
@ -48,16 +56,18 @@ module Mongrel
# I need to add my own -v definition to prevent the -h from exiting by default as well.
@opt.on_tail("--version", "Show version") do
@done_validating = true
puts "No version yet."
if VERSION
puts "Version #{VERSION}"
end
end
@opt.parse! argv
end
# Tells the PluginFactory where to look for additional commands. By default
# it's just a "mongrel" directory wherever we are located.
# it's just a "plugins" directory wherever we are located.
def self.derivativeDirs
return ["mongrel"]
return ["plugins"]
end
# Returns true/false depending on whether the command is configured properly.
@ -80,7 +90,7 @@ module Mongrel
# Validates the given expression is true and prints the message if not, exiting.
def valid?(exp, message)
if not @done_validating and (not exp)
STDERR.puts message
failure message
@valid = false
@done_validating = true
end
@ -101,6 +111,11 @@ module Mongrel
def valid_dir?(file, message)
valid?(file != nil && File.directory?(file), message)
end
# Just a simple method to display failure until something better is developed.
def failure(message)
STDERR.puts "!!! #{message}"
end
end
@ -117,7 +132,7 @@ module Mongrel
results = []
list.keys.each do |key|
results << key unless match.match(key.to_s)
results << key.to_s unless match.match(key.to_s)
end
return results.sort
@ -125,13 +140,13 @@ module Mongrel
# Prints a list of available commands.
def print_command_list
puts "Available commands are:\n"
puts "Available commands are:\n\n"
self.commands.each do |name|
puts " - #{name}\n"
end
puts "Each command takes -h as an option to get help."
puts "\nEach command takes -h as an option to get help."
end
@ -152,7 +167,7 @@ module Mongrel
begin
command = Command.create(cmd_name, args)
rescue FactoryError
STDERR.puts :command, "INVALID COMMAND."
STDERR.puts "INVALID COMMAND: #$!"
print_command_list
return
end
@ -162,7 +177,7 @@ module Mongrel
# needed so the command is already valid so we can skip it.
if not command.done_validating
if not command.validate
STDERR.puts :command, "#{cmd_name} reported an error. Use -h to get help."
STDERR.puts "#{cmd_name} reported an error. Use -h to get help."
return false
else
command.run
@ -171,30 +186,6 @@ module Mongrel
return true
end
# Runs the command like normal, but redirects $stdout and $stderr to the
# requested log file (which should be a file like object opened by you).
# It also marks the start and end times in the log file.
def run_redirect(log, args)
res = false
begin
oldstdout = $stdout
oldstderr = $stderr
log.write ">>>>>> #{Time.now}\n"
$stdout = log
$stderr = log
res = run(args)
log.write "<<<<<< #{Time.now}\n"
ensure
$stdout = oldstdout
$stderr = oldstderr
return res
end
end
end
end
end

View file

@ -65,35 +65,39 @@ end
def setup_gem(pkg_name, pkg_version, author, summary, executables, test_file)
pkg_version = pkg_version
pkg_name = pkg_name
pkg_file_name = "#{pkg_name}-#{pkg_version}"
spec = Gem::Specification.new do |s|
s.name = pkg_name
s.version = pkg_version
s.platform = Gem::Platform::RUBY
s.author = author
s.summary = summary
s.test_file = test_file
s.has_rdoc = true
s.extra_rdoc_files = [ "README" ]
s.files = %w(COPYING LICENSE ext/http11/MANIFEST README Rakefile setup.rb) +
Dir.glob("{bin,doc,test,lib}/**/*") +
Dir.glob("ext/**/*.{h,c,rb}") +
Dir.glob("examples/**/*.rb") +
Dir.glob("tools/*.rb")
pkg_version = pkg_version
pkg_name = pkg_name
pkg_file_name = "#{pkg_name}-#{pkg_version}"
spec = Gem::Specification.new do |s|
s.name = pkg_name
s.version = pkg_version
s.platform = Gem::Platform::RUBY
s.author = author
s.summary = summary
s.test_file = test_file
s.has_rdoc = true
s.extra_rdoc_files = [ "README" ]
s.require_path = "lib"
s.extensions = FileList["ext/**/extconf.rb"].to_a
s.executables = executables
s.bindir = "bin"
end
Rake::GemPackageTask.new(spec) do |p|
p.gem_spec = spec
p.need_tar = true
s.files = %w(COPYING LICENSE ext/http11/MANIFEST README Rakefile setup.rb) +
Dir.glob("{bin,doc,test,lib}/**/*") +
Dir.glob("ext/**/*.{h,c,rb}") +
Dir.glob("examples/**/*.rb") +
Dir.glob("tools/*.rb")
s.require_path = "lib"
s.extensions = FileList["ext/**/extconf.rb"].to_a
s.executables = executables
s.bindir = "bin"
if block_given?
yield s
end
end
Rake::GemPackageTask.new(spec) do |p|
p.gem_spec = spec
p.need_tar = true
end
end