mongrel_jcluster 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/COPYING +506 -0
- data/LICENSE +506 -0
- data/README +15 -0
- data/Rakefile +53 -0
- data/bin/mongrel_jcluster_ctl +64 -0
- data/lib/mongrel_jcluster/init.rb +192 -0
- data/resources/defaults.yaml +2 -0
- data/resources/mongrel_jcluster +41 -0
- data/tools/rakehelp.rb +105 -0
- metadata +70 -0
data/README
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
== Mongrel JCluster Plugin
|
2
|
+
|
3
|
+
Tool to help start/stop/restart multiple mongrel servers in the same JVM using JRuby to use behind a load balancer like Apache 2.2 (mod_proxy_balancer), Lighttpd, Pound, Pen or Balance. This plugin adds an option to specify a number of Mongrel servers to launch, a range of ports, and a configuration file for the cluster. Use "-h" to see command syntax.
|
4
|
+
|
5
|
+
Configure cluster and write configuration file:
|
6
|
+
mongrel_rails jcluster::configure
|
7
|
+
|
8
|
+
Start cluster:
|
9
|
+
mongrel_rails jcluster::start
|
10
|
+
|
11
|
+
Restart cluster:
|
12
|
+
mongrel_rails jcluster::restart
|
13
|
+
|
14
|
+
Stop cluster:
|
15
|
+
mongrel_rails jcluster::stop
|
data/Rakefile
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'rake'
|
2
|
+
require 'rake/testtask'
|
3
|
+
require 'rake/clean'
|
4
|
+
require 'rake/gempackagetask'
|
5
|
+
require 'rake/rdoctask'
|
6
|
+
require 'tools/rakehelp'
|
7
|
+
require 'fileutils'
|
8
|
+
include FileUtils
|
9
|
+
|
10
|
+
setup_tests
|
11
|
+
setup_clean ["pkg", "lib/*.bundle", "*.gem", ".config"]
|
12
|
+
|
13
|
+
setup_rdoc ['README', 'LICENSE', 'COPYING', 'lib/**/*.rb', 'doc/**/*.rdoc']
|
14
|
+
|
15
|
+
desc "Does a full compile, test run"
|
16
|
+
task :default => [:test, :package]
|
17
|
+
|
18
|
+
version="0.0.1"
|
19
|
+
name="mongrel_jcluster"
|
20
|
+
|
21
|
+
setup_gem(name, version) do |spec|
|
22
|
+
spec.summary = "Mongrel plugin that provides commands for managing multiple Mongrel processes in a JVM."
|
23
|
+
spec.description = spec.summary
|
24
|
+
spec.author="Bradley Taylor & Ola Bini"
|
25
|
+
spec.add_dependency('gem_plugin', '>= 0.2.1')
|
26
|
+
spec.add_dependency('mongrel', '>= 0.3.13.4')
|
27
|
+
spec.files += Dir.glob("resources/**/*")
|
28
|
+
spec.has_rdoc = false
|
29
|
+
spec.files += Dir.glob("bin/*")
|
30
|
+
spec.files += Dir.glob("examples/*")
|
31
|
+
spec.default_executable = "mongrel_jcluster_ctl"
|
32
|
+
spec.executables = ["mongrel_jcluster_ctl"]
|
33
|
+
end
|
34
|
+
|
35
|
+
|
36
|
+
task :install => [:test, :package] do
|
37
|
+
sh %{sudo gem install pkg/#{name}-#{version}.gem}
|
38
|
+
end
|
39
|
+
|
40
|
+
task :uninstall => [:clean] do
|
41
|
+
sh %{sudo gem uninstall #{name}}
|
42
|
+
end
|
43
|
+
|
44
|
+
task :gem_source do
|
45
|
+
mkdir_p "pkg/gems"
|
46
|
+
|
47
|
+
FileList["**/*.gem"].each { |gem| mv gem, "pkg/gems" }
|
48
|
+
FileList["pkg/*.tgz"].each {|tgz| rm tgz }
|
49
|
+
rm_rf "pkg/#{name}-#{version}"
|
50
|
+
|
51
|
+
sh %{ generate_yaml_index.rb -d pkg }
|
52
|
+
end
|
53
|
+
|
@@ -0,0 +1,64 @@
|
|
1
|
+
#!/usr/bin/env jruby
|
2
|
+
# Copyright (c) 2006 Bradley Taylor, bradley@fluxura.com
|
3
|
+
|
4
|
+
require 'optparse'
|
5
|
+
|
6
|
+
def run(command, verbose)
|
7
|
+
Dir.chdir @options[:conf_path] do
|
8
|
+
confs = Dir.glob("*.yml")
|
9
|
+
confs += Dir.glob("*.conf")
|
10
|
+
confs.each do |conf|
|
11
|
+
cmd = "jruby -S mongrel_rails jcluster::#{command} -c #{conf}"
|
12
|
+
cmd += " -v" if verbose
|
13
|
+
puts cmd if verbose
|
14
|
+
output = `sh -c '#{cmd}'`
|
15
|
+
puts output if verbose
|
16
|
+
puts "mongrel_rails jcluster::#{command} returned an error." unless $?.success?
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
@options = {}
|
22
|
+
@options[:conf_path] = "/etc/mongrel_jcluster"
|
23
|
+
@options[:verbose] = false
|
24
|
+
|
25
|
+
OptionParser.new do |opts|
|
26
|
+
opts.banner = "Usage: #{$0} (start|stop|restart) [options]"
|
27
|
+
|
28
|
+
opts.on("-c", "--conf_path PATH", "Path to mongrel_jcluster configuration files") { |value| @options[:conf_path] = value }
|
29
|
+
opts.on('-v', '--verbose', "Print all called commands and output.") { |value| @options[:verbose] = value }
|
30
|
+
|
31
|
+
if ARGV.empty?
|
32
|
+
puts opts
|
33
|
+
exit
|
34
|
+
else
|
35
|
+
@cmd = opts.parse!(ARGV)
|
36
|
+
if @cmd.nil?
|
37
|
+
puts opts
|
38
|
+
exit
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
|
44
|
+
if @options[:conf_path] == nil && !File.directory?(@options[:conf_path])
|
45
|
+
puts "Invalid path to mongrel_jcluster configuration files: #{@options[:conf_path]}"
|
46
|
+
exit
|
47
|
+
end
|
48
|
+
|
49
|
+
case @cmd[0]
|
50
|
+
when "start":
|
51
|
+
puts "Starting all mongrel_jclusters..."
|
52
|
+
run "start", @options[:verbose]
|
53
|
+
when "stop":
|
54
|
+
puts "Stopping all mongrel_jclusters..."
|
55
|
+
run "stop", @options[:verbose]
|
56
|
+
when "restart":
|
57
|
+
puts "Restarting all mongrel_jclusters..."
|
58
|
+
run "stop", @options[:verbose]
|
59
|
+
run "start", @options[:verbose]
|
60
|
+
else
|
61
|
+
puts "Unknown command."
|
62
|
+
end
|
63
|
+
|
64
|
+
exit
|
@@ -0,0 +1,192 @@
|
|
1
|
+
require 'gem_plugin'
|
2
|
+
require 'mongrel'
|
3
|
+
require 'yaml'
|
4
|
+
|
5
|
+
module JCluster
|
6
|
+
|
7
|
+
module ExecBase
|
8
|
+
include Mongrel::Command::Base
|
9
|
+
|
10
|
+
def validate
|
11
|
+
valid_exists?(@config_file, "Configuration file does not exist. Run mongrel_rails cluster::configure.")
|
12
|
+
return @valid
|
13
|
+
end
|
14
|
+
|
15
|
+
def read_options
|
16
|
+
@options = {
|
17
|
+
"environment" => ENV['RAILS_ENV'] || "development",
|
18
|
+
"port" => 3000,
|
19
|
+
"pid_file" => "log/mongrel.pid",
|
20
|
+
"servers" => 2,
|
21
|
+
"jport" => 19222,
|
22
|
+
"jkey" => "aggfeeeeeeeeeeeeeergergwer35t45t327283428738fewgfygdsf8yesr834"
|
23
|
+
}
|
24
|
+
conf = YAML.load_file(@config_file)
|
25
|
+
@options.merge! conf if conf
|
26
|
+
end
|
27
|
+
|
28
|
+
def start
|
29
|
+
read_options
|
30
|
+
port = @options["port"].to_i - 1
|
31
|
+
pid = @options["pid_file"].split(".")
|
32
|
+
puts "Starting JRuby server..."
|
33
|
+
system("sh -c 'jrubysrv -p #{@options["jport"]} -k #{@options["jkey"]} </dev/null >jrubyserver.stdout.log 2>jrubyserver.stderr.log &'")
|
34
|
+
sleep 1
|
35
|
+
puts "Starting #{@options["servers"]} Mongrel servers..."
|
36
|
+
1.upto(@options["servers"].to_i) do |i|
|
37
|
+
argv = [ "mongrel_rails" ]
|
38
|
+
argv << "start"
|
39
|
+
argv << "-e #{@options["environment"]}" if @options["environment"]
|
40
|
+
argv << "-p #{port+i}"
|
41
|
+
argv << "-a #{@options["address"]}" if @options["address"]
|
42
|
+
argv << "-l #{@options["log_file"]}" if @options["log_file"]
|
43
|
+
argv << "-P #{pid[0]}.#{port+i}.#{pid[1]}"
|
44
|
+
argv << "-c #{@options["cwd"]}" if @options["cwd"]
|
45
|
+
argv << "-t #{@options["timeout"]}" if @options["timeout"]
|
46
|
+
argv << "-m #{@options["mime_map"]}" if @options["mime_map"]
|
47
|
+
argv << "-r #{@options["docroot"]}" if @options["docroot"]
|
48
|
+
argv << "-n #{@options["num_procs"]}" if @options["num_procs"]
|
49
|
+
argv << "-B" if @options["debug"]
|
50
|
+
argv << "-S #{@options["config_script"]}" if @options["config_script"]
|
51
|
+
argv << "--user #{@options["user"]}" if @options["user"]
|
52
|
+
argv << "--group #{@options["group"]}" if @options["group"]
|
53
|
+
argv << "--prefix #{@options["prefix"]}" if @options["prefix"]
|
54
|
+
cmd = argv.join " "
|
55
|
+
|
56
|
+
puts cmd if @verbose
|
57
|
+
output = `sh -c 'jrubycli -p #{@options["jport"]} -k #{@options["jkey"]} -S #{cmd}'`
|
58
|
+
unless $?.success?
|
59
|
+
puts cmd unless @verbose
|
60
|
+
puts output
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def stop
|
66
|
+
read_options
|
67
|
+
port = @options["port"].to_i - 1
|
68
|
+
pid = @options["pid_file"].split(".")
|
69
|
+
puts "Stopping #{@options["servers"]} Mongrel servers..."
|
70
|
+
output = `sh -c 'jrubycli -p #{@options["jport"]} -k #{@options["jkey"]} -t'`
|
71
|
+
unless $?.success?
|
72
|
+
puts cmd unless @verbose
|
73
|
+
puts output
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
end
|
78
|
+
|
79
|
+
class Start < GemPlugin::Plugin "/commands"
|
80
|
+
include ExecBase
|
81
|
+
|
82
|
+
def configure
|
83
|
+
options [
|
84
|
+
['-C', '--config PATH', "Path to cluster configuration file", :@config_file, "config/mongrel_jcluster.yml"],
|
85
|
+
['-v', '--verbose', "Print all called commands and output.", :@verbose, false]
|
86
|
+
]
|
87
|
+
end
|
88
|
+
|
89
|
+
def run
|
90
|
+
start
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
class Stop < GemPlugin::Plugin "/commands"
|
95
|
+
include ExecBase
|
96
|
+
|
97
|
+
def configure
|
98
|
+
options [
|
99
|
+
['-C', '--config PATH', "Path to cluster configuration file", :@config_file, "config/mongrel_jcluster.yml"],
|
100
|
+
['-f', '--force', "Force the shutdown.", :@force, false],
|
101
|
+
['-v', '--verbose', "Print all called commands and output.", :@verbose, false]
|
102
|
+
]
|
103
|
+
end
|
104
|
+
|
105
|
+
def run
|
106
|
+
stop
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
class Restart < GemPlugin::Plugin "/commands"
|
111
|
+
include ExecBase
|
112
|
+
|
113
|
+
def configure
|
114
|
+
options [
|
115
|
+
['-C', '--config PATH', "Path to cluster configuration file", :@config_file, "config/mongrel_jcluster.yml"],
|
116
|
+
['-f', '--force', "Force the shutdown.", :@force, false],
|
117
|
+
['-v', '--verbose', "Print all called commands and output.", :@verbose, false]
|
118
|
+
]
|
119
|
+
end
|
120
|
+
|
121
|
+
def run
|
122
|
+
stop
|
123
|
+
start
|
124
|
+
end
|
125
|
+
|
126
|
+
end
|
127
|
+
|
128
|
+
class Configure < GemPlugin::Plugin "/commands"
|
129
|
+
include Mongrel::Command::Base
|
130
|
+
|
131
|
+
def configure
|
132
|
+
options [
|
133
|
+
["-e", "--environment ENV", "Rails environment to run as", :@environment, nil],
|
134
|
+
['-p', '--port PORT', "Starting port to bind to", :@port, 3000],
|
135
|
+
['-a', '--address ADDR', "Address to bind to", :@address, nil],
|
136
|
+
['-l', '--log FILE', "Where to write log messages", :@log_file, nil],
|
137
|
+
['-P', '--pid FILE', "Where to write the PID", :@pid_file, "log/mongrel.pid"],
|
138
|
+
['-c', '--chdir PATH', "Change to dir before starting (will be expanded)", :@cwd, nil],
|
139
|
+
['-t', '--timeout SECONDS', "Timeout all requests after SECONDS time", :@timeout, nil],
|
140
|
+
['-m', '--mime PATH', "A YAML file that lists additional MIME types", :@mime_map, nil],
|
141
|
+
['-r', '--root PATH', "Set the document root (default 'public')", :@docroot, nil],
|
142
|
+
['-n', '--num-procs INT', "Number of processor threads to use", :@num_procs, nil],
|
143
|
+
['-B', '--debug', "Enable debugging mode", :@debug, nil],
|
144
|
+
['-S', '--script PATH', "Load the given file as an extra config script.", :@config_script, nil],
|
145
|
+
['-N', '--num-servers INT', "Number of Mongrel servers", :@servers, 2],
|
146
|
+
['-C', '--config PATH', "Path to cluster configuration file", :@config_file, "config/mongrel_jcluster.yml"],
|
147
|
+
['-R', '--jport PORT', "Local port where JRuby server should run", :@jport, 19222],
|
148
|
+
['-K', '--jkey KEY', "Key to use for connecting to JRuby server", :@jkey, nil],
|
149
|
+
['', '--user USER', "User to run as", :@user, nil],
|
150
|
+
['', '--group GROUP', "Group to run as", :@group, nil],
|
151
|
+
['', '--prefix PREFIX', "Rails prefix to use", :@prefix, nil]
|
152
|
+
]
|
153
|
+
end
|
154
|
+
|
155
|
+
def validate
|
156
|
+
@servers = @servers.to_i
|
157
|
+
|
158
|
+
valid?(@servers > 0, "Must give a valid number of servers")
|
159
|
+
valid_dir? File.dirname(@config_file), "Path to config file not valid: #{@config_file}"
|
160
|
+
|
161
|
+
return @valid
|
162
|
+
end
|
163
|
+
|
164
|
+
def run
|
165
|
+
@options = {
|
166
|
+
"port" => @port,
|
167
|
+
"servers" => @servers,
|
168
|
+
"pid_file" => @pid_file
|
169
|
+
}
|
170
|
+
|
171
|
+
@options["log_file"] = @log_file if @log_file
|
172
|
+
@options["debug"] = @debug if @debug
|
173
|
+
@options["num_procs"] = @num_procs if @num_procs
|
174
|
+
@options["docroot"] = @docroot if @docroots
|
175
|
+
@options["address"] = @address if @address
|
176
|
+
@options["timeout"] = @timeout if @timeout
|
177
|
+
@options["environment"] = @environment if @environment
|
178
|
+
@options["mime_map"] = @mime_map if @mime_map
|
179
|
+
@options["config_script"] = @config_script if @config_script
|
180
|
+
@options["cwd"] = @cwd if @cwd
|
181
|
+
@options["user"] = @user if @user
|
182
|
+
@options["group"] = @group if @group
|
183
|
+
@options["prefix"] = @prefix if @prefix
|
184
|
+
@options["jkey"] = @jkey if @jkey
|
185
|
+
@options["jport"] = @jport if @jport
|
186
|
+
|
187
|
+
puts "Writing configuration file to #{@config_file}."
|
188
|
+
File.open(@config_file,"w") {|f| f.write(@options.to_yaml)}
|
189
|
+
end
|
190
|
+
end
|
191
|
+
end
|
192
|
+
|
@@ -0,0 +1,41 @@
|
|
1
|
+
#!/bin/bash
|
2
|
+
#
|
3
|
+
# Copyright (c) 2006 Bradley Taylor, bradley@railsmachine.com
|
4
|
+
#
|
5
|
+
# mongrel_jcluster Startup script for Mongrel clusters.
|
6
|
+
#
|
7
|
+
# chkconfig: - 85 15
|
8
|
+
# description: mongrel_jcluster manages multiple Mongrel processes for use \
|
9
|
+
# behind a load balancer.
|
10
|
+
#
|
11
|
+
|
12
|
+
CONF_DIR=/etc/mongrel_jcluster
|
13
|
+
RETVAL=0
|
14
|
+
|
15
|
+
|
16
|
+
# Gracefully exit if the controller is missing.
|
17
|
+
which mongrel_jcluster_ctl >/dev/null || exit 0
|
18
|
+
|
19
|
+
# Go no further if config directory is missing.
|
20
|
+
[ -d "$CONF_DIR" ] || exit 0
|
21
|
+
|
22
|
+
case "$1" in
|
23
|
+
start)
|
24
|
+
mongrel_jcluster_ctl start -c $CONF_DIR
|
25
|
+
RETVAL=$?
|
26
|
+
;;
|
27
|
+
stop)
|
28
|
+
mongrel_jcluster_ctl stop -c $CONF_DIR
|
29
|
+
RETVAL=$?
|
30
|
+
;;
|
31
|
+
restart)
|
32
|
+
mongrel_jcluster_ctl restart -c $CONF_DIR
|
33
|
+
RETVAL=$?
|
34
|
+
;;
|
35
|
+
*)
|
36
|
+
echo "Usage: mongrel_jcluster {start|stop|restart}"
|
37
|
+
exit 1
|
38
|
+
;;
|
39
|
+
esac
|
40
|
+
|
41
|
+
exit $RETVAL
|
data/tools/rakehelp.rb
ADDED
@@ -0,0 +1,105 @@
|
|
1
|
+
|
2
|
+
def make(makedir)
|
3
|
+
Dir.chdir(makedir) do
|
4
|
+
sh(PLATFORM =~ /win32/ ? 'nmake' : 'make')
|
5
|
+
end
|
6
|
+
end
|
7
|
+
|
8
|
+
|
9
|
+
def extconf(dir)
|
10
|
+
Dir.chdir(dir) do ruby "extconf.rb" end
|
11
|
+
end
|
12
|
+
|
13
|
+
|
14
|
+
def setup_tests
|
15
|
+
Rake::TestTask.new do |t|
|
16
|
+
t.libs << "test"
|
17
|
+
t.test_files = FileList['test/test*.rb']
|
18
|
+
t.verbose = true
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
|
23
|
+
def setup_clean otherfiles
|
24
|
+
files = ['build/*', '**/*.o', '**/*.so', '**/*.a', 'lib/*-*', '**/*.log'] + otherfiles
|
25
|
+
CLEAN.include(files)
|
26
|
+
end
|
27
|
+
|
28
|
+
|
29
|
+
def setup_rdoc files
|
30
|
+
Rake::RDocTask.new do |rdoc|
|
31
|
+
rdoc.rdoc_dir = 'doc/rdoc'
|
32
|
+
rdoc.options << '--line-numbers'
|
33
|
+
rdoc.rdoc_files.add(files)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
|
38
|
+
def setup_extension(dir, extension)
|
39
|
+
ext = "ext/#{dir}"
|
40
|
+
ext_so = "#{ext}/#{extension}.#{Config::CONFIG['DLEXT']}"
|
41
|
+
ext_files = FileList[
|
42
|
+
"#{ext}/*.c",
|
43
|
+
"#{ext}/*.h",
|
44
|
+
"#{ext}/extconf.rb",
|
45
|
+
"#{ext}/Makefile",
|
46
|
+
"lib"
|
47
|
+
]
|
48
|
+
|
49
|
+
task "lib" do
|
50
|
+
directory "lib"
|
51
|
+
end
|
52
|
+
|
53
|
+
desc "Builds just the #{extension} extension"
|
54
|
+
task extension.to_sym => ["#{ext}/Makefile", ext_so ]
|
55
|
+
|
56
|
+
file "#{ext}/Makefile" => ["#{ext}/extconf.rb"] do
|
57
|
+
extconf "#{ext}"
|
58
|
+
end
|
59
|
+
|
60
|
+
file ext_so => ext_files do
|
61
|
+
make "#{ext}"
|
62
|
+
cp ext_so, "lib"
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
|
67
|
+
def base_gem_spec(pkg_name, pkg_version)
|
68
|
+
pkg_version = pkg_version
|
69
|
+
pkg_name = pkg_name
|
70
|
+
pkg_file_name = "#{pkg_name}-#{pkg_version}"
|
71
|
+
Gem::Specification.new do |s|
|
72
|
+
s.name = pkg_name
|
73
|
+
s.version = pkg_version
|
74
|
+
s.platform = Gem::Platform::RUBY
|
75
|
+
s.has_rdoc = true
|
76
|
+
s.extra_rdoc_files = [ "README" ]
|
77
|
+
|
78
|
+
s.files = %w(COPYING LICENSE README Rakefile) +
|
79
|
+
Dir.glob("{bin,doc/rdoc,test,lib}/**/*") +
|
80
|
+
Dir.glob("ext/**/*.{h,c,rb}") +
|
81
|
+
Dir.glob("examples/**/*.rb") +
|
82
|
+
Dir.glob("tools/*.rb")
|
83
|
+
|
84
|
+
s.require_path = "lib"
|
85
|
+
s.extensions = FileList["ext/**/extconf.rb"].to_a
|
86
|
+
s.bindir = "bin"
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
def setup_gem(pkg_name, pkg_version)
|
91
|
+
spec = base_gem_spec(pkg_name, pkg_version)
|
92
|
+
yield spec if block_given?
|
93
|
+
|
94
|
+
Rake::GemPackageTask.new(spec) do |p|
|
95
|
+
p.gem_spec = spec
|
96
|
+
p.need_tar = true
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
def setup_win32_gem(pkg_name, pkg_version)
|
101
|
+
spec = base_gem_spec(pkg_name, pkg_version)
|
102
|
+
yield spec if block_given?
|
103
|
+
|
104
|
+
Gem::Builder.new(spec).build
|
105
|
+
end
|