scgi 0.6.0 → 0.7.0
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/README +42 -21
- data/bin/scgi_ctrl +214 -110
- metadata +5 -4
data/README
CHANGED
@@ -38,6 +38,7 @@ Subversion access is available at svn://code.jeremyevans.net/ruby-scgi/.
|
|
38
38
|
help keep your site alive under heavy load.
|
39
39
|
* Simple to configure with your web server. Even if you use clustering you'll
|
40
40
|
be able to manage your webserver and Rails application independently.
|
41
|
+
* Supports supervisor mode for rock solid upgrades without losing connections
|
41
42
|
* Reasonable defaults for almost everything based on user feedback.
|
42
43
|
* Completely free code licensed under Rails's own license.
|
43
44
|
* No external dependencies other than Ruby
|
@@ -60,13 +61,14 @@ have to request open ports. Sorry, no UNIX Domain sockets in SCGI.
|
|
60
61
|
|
61
62
|
== Comparison With WEBrick
|
62
63
|
|
63
|
-
In theory WEBrick should be able to run just as fast as
|
64
|
-
written in pure Ruby. They both do similar processing (although WEBrick's
|
65
|
-
a little more complicated). They both return about the same amount of
|
64
|
+
In theory WEBrick should be able to run just as fast as ruby-scgi. They are
|
65
|
+
both written in pure Ruby. They both do similar processing (although WEBrick's
|
66
|
+
are a little more complicated). They both return about the same amount of
|
67
|
+
data.
|
66
68
|
|
67
|
-
In practice WEBrick in production mode runs much slower than
|
68
|
-
mode. The (dis)advantage (depending on your point of view) is that
|
69
|
-
manage your webserver differently than you manage your application.
|
69
|
+
In practice WEBrick in production mode runs much slower than ruby-scgi in
|
70
|
+
production mode. The (dis)advantage (depending on your point of view) is that
|
71
|
+
you have to manage your webserver differently than you manage your application.
|
70
72
|
|
71
73
|
== Comparison With CGI
|
72
74
|
|
@@ -76,10 +78,10 @@ framework is loaded. This is very slow, but it's easy to install.
|
|
76
78
|
An alternative is to use the cgi2scgi program distributed with the SCGI source
|
77
79
|
available from http://www.mems-exchange.org/software/scgi/ along with the
|
78
80
|
Apache modules. This program basically is a small little C program that runs
|
79
|
-
quickly as a CGI, but passes it's requests to your
|
80
|
-
that fast, but if you're stuck with cgi-bin only access then this might be
|
81
|
-
the way to go. Since SCGI runs over TCP/IP you can even host your
|
82
|
-
totally different machine with this.
|
81
|
+
quickly as a CGI, but passes it's requests to your ruby-scgi backend. It's not
|
82
|
+
all that fast, but if you're stuck with cgi-bin only access then this might be
|
83
|
+
just the way to go. Since SCGI runs over TCP/IP you can even host your
|
84
|
+
ruby-scgi on a totally different machine with this.
|
83
85
|
|
84
86
|
== Running and Configuration
|
85
87
|
|
@@ -93,7 +95,7 @@ To stop the application:
|
|
93
95
|
|
94
96
|
To restart the application:
|
95
97
|
|
96
|
-
scgi_ctrl -d /path/to/rails/app
|
98
|
+
scgi_ctrl -d /path/to/rails/app restart
|
97
99
|
|
98
100
|
Note that restarting/stopping is controlled by a pid file (the location is
|
99
101
|
configurable). If the pidfile exists, it is read and the pids in it are
|
@@ -110,12 +112,14 @@ scgi_ctrl [option=value, ...] (start|stop)
|
|
110
112
|
-d, --directory Working directory [.]
|
111
113
|
-e, --environment Environment (for Rails) [production]
|
112
114
|
-f, --fork Number of listners on each port [1]
|
115
|
+
-k, --killtime Number of seconds to wait when killing children [2]
|
113
116
|
-l, --logfile Location of log file [log/scgi.log]
|
114
117
|
-m, --maxconns Maximum number of concurrent users [2**30-1]
|
115
118
|
-n, --number Number of ports to bind to [1]
|
116
119
|
-p, --port Starting port to bind to [9999]
|
117
120
|
-P, --pidfile Location of pid file [log/scgi.pid]
|
118
121
|
-r, --processor Type of processor to use [Rails]
|
122
|
+
-s, --supervise Whether to use a supervisor [No]
|
119
123
|
|
120
124
|
Note that the -d (--directory) option changes the working directory of the
|
121
125
|
process, so the -c, -l, and -P options are relative to that.
|
@@ -160,6 +164,12 @@ Here's a longer explanation of the options:
|
|
160
164
|
it is not stable, switch to multiple port clustering. It is possible to use
|
161
165
|
both as once.
|
162
166
|
|
167
|
+
-k, --killtime Number of seconds to wait when killing children [2]
|
168
|
+
|
169
|
+
This sets the time that ruby-scgi will wait when stopping or restarting
|
170
|
+
child processes. The time can actually be twice as long as this, if the
|
171
|
+
child processes are not shutting down cleanly.
|
172
|
+
|
163
173
|
-l, --logfile Location of log file [log/scgi.log]
|
164
174
|
|
165
175
|
This is the location of the log file, relative to the working directory.
|
@@ -201,14 +211,29 @@ Here's a longer explanation of the options:
|
|
201
211
|
path (the RUBYLIB environment variable). See RailsSCGIProcessor.rb for an
|
202
212
|
example.
|
203
213
|
|
214
|
+
-s, --supervise Whether to use a supervisor [No]
|
215
|
+
|
216
|
+
This starts a supervisor process in addition to the worker processes. The
|
217
|
+
supervisor process can then add and remove children using the same SCGI
|
218
|
+
listening socket, which means that there will be no downtime when you have
|
219
|
+
to upgrade your application. Using a supervisor restricts some of the
|
220
|
+
variables that will be updated when you use restart. You can change the
|
221
|
+
environment, fork, killtime, logfile, maxconns, and processor variables.
|
222
|
+
Note that if you use a supervisor, you should specify those variables in
|
223
|
+
the config file and not on the command line, otherwise it won't be
|
224
|
+
possible to update them. This is the only option that does not take an
|
225
|
+
argument on the command line. To set it in the config file, see below.
|
226
|
+
|
204
227
|
Each of the options can also be specified in the config file as a symbol. An
|
205
228
|
example config file would be:
|
206
229
|
|
207
230
|
---
|
208
231
|
:port: 4000
|
209
232
|
:fork: 3
|
233
|
+
:supervise: true
|
210
234
|
|
211
|
-
This sets up a single-port cluster on port 4000 with 3 listening
|
235
|
+
This sets up a supervised single-port cluster on port 4000 with 3 listening
|
236
|
+
processes.
|
212
237
|
|
213
238
|
== Example configurations
|
214
239
|
|
@@ -301,9 +326,9 @@ main attack vectors you should be aware of when running this:
|
|
301
326
|
* scgi_ctrl is fully configurable on the command line
|
302
327
|
* Clustering and processing are now built into scgi_ctrl
|
303
328
|
* DRb, Win32, and throttling are no longer supported
|
304
|
-
* Soft reconfiguration
|
305
|
-
* Restarting via SIGHUP is
|
306
|
-
* The only commands available to scgi_ctrl are start and
|
329
|
+
* Soft reconfiguration has changed (no SIGUSR1)
|
330
|
+
* Restarting via SIGHUP is only supported in supervise mode
|
331
|
+
* The only commands available to scgi_ctrl are start, stop, and restart
|
307
332
|
|
308
333
|
== FAQ
|
309
334
|
|
@@ -323,9 +348,5 @@ A: I haven't tried. If you have luck, let me know.
|
|
323
348
|
Q: Is there an easy way to reload? I don't want to take the whole thing down
|
324
349
|
just to deploy new code.
|
325
350
|
|
326
|
-
A:
|
327
|
-
|
328
|
-
connected and the processes can't shutdown before the new listening socket is
|
329
|
-
bound. This hasn't been a problem for me yet, but it is a possible race
|
330
|
-
condition. In case it affects you, you may have to run scgi_ctrl start again
|
331
|
-
if you get an error binding to a port.
|
351
|
+
A: Use supervise mode, which ensures that no connections will be lost when
|
352
|
+
updating your apps.
|
data/bin/scgi_ctrl
CHANGED
@@ -1,132 +1,236 @@
|
|
1
1
|
#!/usr/local/bin/ruby
|
2
2
|
require 'getoptlong'
|
3
3
|
require 'yaml'
|
4
|
+
require 'socket'
|
4
5
|
SCGI_DEFAULT_CONFIG = {:pidfile=>'log/scgi.pid', :number=>1, :port=>9999,
|
5
6
|
:processor=>'Rails', :fork=>1, :logfile=>'log/scgi.log', :maxconns=>2**30-1,
|
6
|
-
:bind=>'127.0.0.1', :
|
7
|
+
:bind=>'127.0.0.1', :cliconfig=>{}, :killtime=>2, :config=>'config/scgi.yaml'}
|
7
8
|
SCGI_CONFIG = {}
|
8
9
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
10
|
+
module SCGI
|
11
|
+
class Starter
|
12
|
+
def initialize
|
13
|
+
super
|
14
|
+
parse_options
|
15
|
+
end
|
16
|
+
|
17
|
+
def config_file_options(filename)
|
18
|
+
begin
|
19
|
+
config = YAML.load(File.read(filename))
|
20
|
+
config.is_a?(Hash) ? config : Hash.new
|
21
|
+
rescue
|
22
|
+
Hash.new
|
23
|
+
end
|
24
|
+
end
|
17
25
|
|
18
|
-
def get_processor(string)
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
end
|
26
|
+
def get_processor(string)
|
27
|
+
raise NameError, "#{string} is not a valid processor!" unless string =~ /\A[A-Z][A-ZA-z]*\z/
|
28
|
+
processor = "#{string}SCGIProcessor"
|
29
|
+
require processor
|
30
|
+
eval(processor)
|
31
|
+
end
|
32
|
+
|
33
|
+
def kill_children_forcefully(pids)
|
34
|
+
kill_pids('TERM', *pids)
|
35
|
+
sleep(SCGI_CONFIG[:killtime])
|
36
|
+
kill_pids('KILL', *pids)
|
37
|
+
end
|
38
|
+
|
39
|
+
def kill_children_gently(pids)
|
40
|
+
kill_pids('INT', *pids)
|
41
|
+
sleep(SCGI_CONFIG[:killtime])
|
42
|
+
sleep(SCGI_CONFIG[:killtime]) if kill_pids('TERM', *pids)
|
43
|
+
kill_pids('KILL', *pids)
|
44
|
+
end
|
24
45
|
|
25
|
-
def
|
26
|
-
|
27
|
-
opts = GetoptLong.new(
|
28
|
-
[ '--bind', '-b', GetoptLong::REQUIRED_ARGUMENT ],
|
29
|
-
[ '--config', '-c', GetoptLong::REQUIRED_ARGUMENT ],
|
30
|
-
[ '--directory', '-d', GetoptLong::REQUIRED_ARGUMENT ],
|
31
|
-
[ '--environment', '-e', GetoptLong::REQUIRED_ARGUMENT ],
|
32
|
-
[ '--fork', '-f', GetoptLong::REQUIRED_ARGUMENT ],
|
33
|
-
[ '--logfile', '-l', GetoptLong::REQUIRED_ARGUMENT ],
|
34
|
-
[ '--maxconns', '-m', GetoptLong::REQUIRED_ARGUMENT ],
|
35
|
-
[ '--number', '-n', GetoptLong::REQUIRED_ARGUMENT ],
|
36
|
-
[ '--port', '-p', GetoptLong::REQUIRED_ARGUMENT ],
|
37
|
-
[ '--pidfile', '-P', GetoptLong::REQUIRED_ARGUMENT ],
|
38
|
-
[ '--processor', '-r', GetoptLong::REQUIRED_ARGUMENT ]
|
39
|
-
)
|
40
|
-
opts.each do |opt, arg|
|
41
|
-
case opt
|
42
|
-
when '--bind'
|
43
|
-
config[:bind] = arg
|
44
|
-
when '--config'
|
45
|
-
config[:config] = arg
|
46
|
-
when '--directory'
|
47
|
-
Dir.chdir(arg)
|
48
|
-
when '--environment'
|
49
|
-
config[:environment] = arg
|
50
|
-
when '--fork'
|
51
|
-
config[:fork] = arg.to_i
|
52
|
-
when '--logfile'
|
53
|
-
config[:logile] = arg
|
54
|
-
when '--maxconns'
|
55
|
-
config[:maxconns] = arg.to_i
|
56
|
-
when '--number'
|
57
|
-
config[:number] = arg.to_i
|
58
|
-
when '--port'
|
59
|
-
config[:port] = arg.to_i
|
60
|
-
when '--pidfile'
|
61
|
-
config[:pidfile] = arg
|
62
|
-
when '--processor'
|
63
|
-
config[:processor] = arg
|
46
|
+
def kill_pids(signal, *pids)
|
47
|
+
Process.kill(signal, *pids) rescue nil
|
64
48
|
end
|
65
|
-
end
|
66
|
-
|
67
|
-
# Configuration Precedence: Command Line > Config File > Default
|
68
|
-
SCGI_CONFIG.merge!(SCGI_DEFAULT_CONFIG)
|
69
|
-
SCGI_CONFIG.merge!(config_file_options(config[:config]))
|
70
|
-
SCGI_CONFIG.merge!(config)
|
71
|
-
end
|
72
49
|
|
73
|
-
def
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
50
|
+
def parse_options
|
51
|
+
cliconfig = {}
|
52
|
+
opts = GetoptLong.new(
|
53
|
+
[ '--bind', '-b', GetoptLong::REQUIRED_ARGUMENT ],
|
54
|
+
[ '--config', '-c', GetoptLong::REQUIRED_ARGUMENT ],
|
55
|
+
[ '--directory', '-d', GetoptLong::REQUIRED_ARGUMENT ],
|
56
|
+
[ '--environment', '-e', GetoptLong::REQUIRED_ARGUMENT ],
|
57
|
+
[ '--fork', '-f', GetoptLong::REQUIRED_ARGUMENT ],
|
58
|
+
[ '--killtime', '-k', GetoptLong::REQUIRED_ARGUMENT ],
|
59
|
+
[ '--logfile', '-l', GetoptLong::REQUIRED_ARGUMENT ],
|
60
|
+
[ '--maxconns', '-m', GetoptLong::REQUIRED_ARGUMENT ],
|
61
|
+
[ '--number', '-n', GetoptLong::REQUIRED_ARGUMENT ],
|
62
|
+
[ '--port', '-p', GetoptLong::REQUIRED_ARGUMENT ],
|
63
|
+
[ '--pidfile', '-P', GetoptLong::REQUIRED_ARGUMENT ],
|
64
|
+
[ '--processor', '-r', GetoptLong::REQUIRED_ARGUMENT ],
|
65
|
+
[ '--supervise', '-s', GetoptLong::NO_ARGUMENT]
|
66
|
+
)
|
67
|
+
opts.each do |opt, arg|
|
68
|
+
case opt
|
69
|
+
when '--bind'
|
70
|
+
cliconfig[:bind] = arg
|
71
|
+
when '--config'
|
72
|
+
cliconfig[:config] = arg
|
73
|
+
when '--directory'
|
74
|
+
Dir.chdir(arg)
|
75
|
+
when '--environment'
|
76
|
+
cliconfig[:environment] = arg
|
77
|
+
when '--fork'
|
78
|
+
cliconfig[:fork] = arg.to_i
|
79
|
+
when '--killtime'
|
80
|
+
cliconfig[:killtime] = arg.to_i
|
81
|
+
when '--logfile'
|
82
|
+
cliconfig[:logile] = arg
|
83
|
+
when '--maxconns'
|
84
|
+
cliconfig[:maxconns] = arg.to_i
|
85
|
+
when '--number'
|
86
|
+
cliconfig[:number] = arg.to_i
|
87
|
+
when '--port'
|
88
|
+
cliconfig[:port] = arg.to_i
|
89
|
+
when '--pidfile'
|
90
|
+
cliconfig[:pidfile] = arg
|
91
|
+
when '--processor'
|
92
|
+
cliconfig[:processor] = arg
|
93
|
+
when '--supervise'
|
94
|
+
cliconfig[:supervise] = true
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
# Configuration Precedence: Command Line > Config File > Default
|
99
|
+
SCGI_CONFIG.merge!(SCGI_DEFAULT_CONFIG)
|
100
|
+
SCGI_CONFIG.merge!(config_file_options(cliconfig[:config] || SCGI_DEFAULT_CONFIG[:config]))
|
101
|
+
SCGI_CONFIG.merge!(cliconfig)
|
102
|
+
SCGI_CONFIG[:cliconfig] = cliconfig
|
103
|
+
end
|
104
|
+
|
105
|
+
def process(command)
|
106
|
+
return process_supervisor(command) if SCGI_CONFIG[:supervise]
|
107
|
+
case command
|
108
|
+
when 'restart'
|
109
|
+
stop
|
110
|
+
start
|
111
|
+
when 'start'
|
112
|
+
start
|
113
|
+
when 'stop'
|
114
|
+
stop
|
115
|
+
else
|
116
|
+
puts usage
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
def process_supervisor(command)
|
121
|
+
case command
|
122
|
+
when 'restart'
|
123
|
+
supervisor_restart
|
124
|
+
when 'start'
|
125
|
+
supervisor_start
|
126
|
+
when 'stop'
|
127
|
+
supervisor_stop
|
128
|
+
else
|
129
|
+
puts usage
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
def reload_config
|
134
|
+
SCGI_CONFIG.merge!(config_file_options(SCGI_CONFIG[:config]))
|
135
|
+
SCGI_CONFIG.merge!(SCGI_CONFIG[:cliconfig])
|
136
|
+
end
|
84
137
|
|
85
|
-
def
|
86
|
-
|
87
|
-
pids = []
|
88
|
-
SCGI_CONFIG[:number].times do |i|
|
89
|
-
socket = TCPServer.new(SCGI_CONFIG[:bind], port = SCGI_CONFIG[:port]+i)
|
90
|
-
SCGI_CONFIG[:fork].times do
|
91
|
-
if pid = fork
|
92
|
-
pids << pid
|
93
|
-
else
|
138
|
+
def start_child(socket, port)
|
139
|
+
fork do
|
94
140
|
$0 = "scgi-#{SCGI_CONFIG[:processor]} dir:#{Dir.pwd} port:#{port}"
|
95
|
-
|
141
|
+
get_processor(SCGI_CONFIG[:processor]).new(SCGI_CONFIG).listen(socket)
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
def start
|
146
|
+
pids = []
|
147
|
+
SCGI_CONFIG[:number].times do |i|
|
148
|
+
socket = TCPServer.new(SCGI_CONFIG[:bind], port = SCGI_CONFIG[:port]+i)
|
149
|
+
SCGI_CONFIG[:fork].times do
|
150
|
+
pids << start_child(socket, port)
|
151
|
+
end
|
152
|
+
end
|
153
|
+
File.open(SCGI_CONFIG[:pidfile], 'wb'){|file| file.print("#{pids.join(' ')}")}
|
154
|
+
end
|
155
|
+
|
156
|
+
def stop
|
157
|
+
if File.file?(SCGI_CONFIG[:pidfile])
|
158
|
+
pids = nil
|
159
|
+
File.open(SCGI_CONFIG[:pidfile], 'rb'){|f| pids = f.read.split.collect{|x| x.to_i if x.to_i > 0}.compact}
|
160
|
+
if pids.length > 0
|
161
|
+
kill_children_gently(pids)
|
162
|
+
File.delete(SCGI_CONFIG[:pidfile])
|
163
|
+
end
|
96
164
|
end
|
97
165
|
end
|
98
|
-
end
|
99
|
-
File.open(SCGI_CONFIG[:pidfile], 'wb'){|file| file.print("#{pids.join(' ')}")}
|
100
|
-
end
|
101
166
|
|
102
|
-
def
|
103
|
-
if File.file?(SCGI_CONFIG[:pidfile])
|
104
|
-
pids = nil
|
105
|
-
File.open(SCGI_CONFIG[:pidfile], 'rb'){|f| pids = f.read.split.collect{|x| x.to_i if x.to_i > 0}.compact}
|
106
|
-
if pids.length > 0
|
107
|
-
Process.kill("INT", *pids) rescue return nil
|
167
|
+
def supervisor_exit
|
108
168
|
File.delete(SCGI_CONFIG[:pidfile])
|
169
|
+
exit
|
170
|
+
end
|
171
|
+
|
172
|
+
def supervisor_loop
|
173
|
+
$0 = "scgi-#{SCGI_CONFIG[:processor]} dir:#{Dir.pwd} supervisor"
|
174
|
+
trap("HUP") { reload_config; supervisor_restart_children }
|
175
|
+
trap("TERM") { kill_children_forcefully(SCGI_CONFIG[:pids].values.flatten); supervisor_exit }
|
176
|
+
trap("INT") { kill_children_gently(SCGI_CONFIG[:pids].values.flatten); supervisor_exit }
|
177
|
+
loop{sleep(60)}
|
178
|
+
end
|
179
|
+
|
180
|
+
def supervisor_restart
|
181
|
+
kill_pids("HUP", File.read(SCGI_CONFIG[:pidfile]).to_i)
|
182
|
+
end
|
183
|
+
|
184
|
+
def supervisor_restart_children
|
185
|
+
new_pids = {}
|
186
|
+
SCGI_CONFIG[:pids].each do |port, pids|
|
187
|
+
SCGI_CONFIG[:fork].times do
|
188
|
+
(new_pids[port] ||= []) << start_child(SCGI_CONFIG[:sockets][port], port)
|
189
|
+
end
|
190
|
+
kill_children_gently(pids)
|
191
|
+
pids.each{|pid| Process.detach(pid)}
|
192
|
+
end
|
193
|
+
SCGI_CONFIG[:pids] = new_pids
|
194
|
+
end
|
195
|
+
|
196
|
+
def supervisor_start
|
197
|
+
SCGI_CONFIG[:pids] = {}
|
198
|
+
SCGI_CONFIG[:sockets] = {}
|
199
|
+
SCGI_CONFIG[:number].times do |i|
|
200
|
+
port = SCGI_CONFIG[:port]+i
|
201
|
+
SCGI_CONFIG[:sockets][port] = TCPServer.new(SCGI_CONFIG[:bind], port)
|
202
|
+
SCGI_CONFIG[:fork].times do
|
203
|
+
(SCGI_CONFIG[:pids][port] ||= []) << start_child(SCGI_CONFIG[:sockets][port], port)
|
204
|
+
end
|
205
|
+
end
|
206
|
+
File.open(SCGI_CONFIG[:pidfile], 'wb'){|file| file.print(fork{supervisor_loop})}
|
207
|
+
end
|
208
|
+
|
209
|
+
def supervisor_stop
|
210
|
+
kill_pids("INT", File.read(SCGI_CONFIG[:pidfile]).to_i)
|
211
|
+
end
|
212
|
+
|
213
|
+
def usage
|
214
|
+
<<-END
|
215
|
+
scgi_ctrl [option value, ...] (restart|start|stop)
|
216
|
+
Options:
|
217
|
+
-b, --bind IP address to bind to [127.0.0.1]
|
218
|
+
-c, --config Location of config file [config/scgi.yaml]
|
219
|
+
-d, --directory Working directory [.]
|
220
|
+
-e, --environment Environment (for Rails) [production]
|
221
|
+
-f, --fork Number of listners on each port [1]
|
222
|
+
-k, --killtime Number of seconds to wait when killing children [2]
|
223
|
+
-l, --logfile Location of log file [log/scgi.log]
|
224
|
+
-m, --maxconns Maximum number of concurrent users [2**30-1]
|
225
|
+
-n, --number Number of ports to bind to [1]
|
226
|
+
-p, --port Starting port to bind to [9999]
|
227
|
+
-P, --pidfile Location of pid file [log/scgi.pid]
|
228
|
+
-r, --processor Type of processor to use [Rails]
|
229
|
+
-s, --supervise Whether to use a supervisor [No]
|
230
|
+
END
|
109
231
|
end
|
110
232
|
end
|
111
233
|
end
|
112
234
|
|
113
|
-
|
114
|
-
<<-END
|
115
|
-
scgi_ctrl [option=value, ...] (start|stop)
|
116
|
-
Options:
|
117
|
-
-b, --bind IP address to bind to [127.0.0.1]
|
118
|
-
-c, --config Location of config file [config/scgi.yaml]
|
119
|
-
-d, --directory Working directory [.]
|
120
|
-
-e, --environment Environment (for Rails) [production]
|
121
|
-
-f, --fork Number of listners on each port [1]
|
122
|
-
-l, --logfile Location of log file [log/scgi.log]
|
123
|
-
-m, --maxconns Maximum number of concurrent users [2**30-1]
|
124
|
-
-n, --number Number of ports to bind to [1]
|
125
|
-
-p, --port Starting port to bind to [9999]
|
126
|
-
-P, --pidfile Location of pid file [log/scgi.pid]
|
127
|
-
-r, --processor Type of processor to use [Rails]
|
128
|
-
END
|
129
|
-
end
|
235
|
+
SCGI::Starter.new.process(ARGV[0])
|
130
236
|
|
131
|
-
parse_options
|
132
|
-
process(ARGV[0])
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.0
|
|
3
3
|
specification_version: 1
|
4
4
|
name: scgi
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.
|
7
|
-
date: 2007-08-
|
6
|
+
version: 0.7.0
|
7
|
+
date: 2007-08-15 00:00:00 -07:00
|
8
8
|
summary: Simple support for using SCGI in ruby apps, such as Rails
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -35,8 +35,9 @@ files:
|
|
35
35
|
- lib/RailsSCGIProcessor.rb
|
36
36
|
test_files: []
|
37
37
|
|
38
|
-
rdoc_options:
|
39
|
-
|
38
|
+
rdoc_options:
|
39
|
+
- --inline-source
|
40
|
+
- --line-numbers
|
40
41
|
extra_rdoc_files: []
|
41
42
|
|
42
43
|
executables:
|