nginxtra 1.2.0.1 → 1.2.1.2
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/VERSION +1 -1
- data/bin/nginxtra +1 -1
- data/lib/nginxtra.rb +2 -0
- data/lib/nginxtra/action.rb +1 -1
- data/lib/nginxtra/actions/convert.rb +67 -0
- data/lib/nginxtra/actions/install.rb +3 -0
- data/lib/nginxtra/cli.rb +20 -0
- data/lib/nginxtra/config_converter.rb +324 -0
- data/lib/nginxtra/error.rb +3 -0
- data/src/nginx/CHANGES +45 -0
- data/src/nginx/CHANGES.ru +46 -0
- data/src/nginx/src/core/nginx.h +2 -2
- data/src/nginx/src/core/ngx_resolver.c +14 -2
- data/src/nginx/src/event/ngx_event.c +18 -21
- data/src/nginx/src/event/ngx_event.h +0 -6
- data/src/nginx/src/event/ngx_event_accept.c +90 -13
- data/src/nginx/src/event/ngx_event_openssl.c +1 -0
- data/src/nginx/src/http/modules/ngx_http_fastcgi_module.c +26 -4
- data/src/nginx/src/http/modules/ngx_http_flv_module.c +1 -1
- data/src/nginx/src/http/modules/ngx_http_geo_module.c +62 -74
- data/src/nginx/src/http/modules/ngx_http_geoip_module.c +130 -30
- data/src/nginx/src/http/modules/ngx_http_gzip_static_module.c +1 -1
- data/src/nginx/src/http/modules/ngx_http_mp4_module.c +1 -1
- data/src/nginx/src/http/modules/ngx_http_realip_module.c +45 -93
- data/src/nginx/src/http/modules/ngx_http_scgi_module.c +2 -0
- data/src/nginx/src/http/modules/ngx_http_stub_status_module.c +1 -1
- data/src/nginx/src/http/modules/ngx_http_uwsgi_module.c +2 -0
- data/src/nginx/src/http/modules/perl/nginx.pm +1 -1
- data/src/nginx/src/http/ngx_http_core_module.c +104 -0
- data/src/nginx/src/http/ngx_http_core_module.h +3 -0
- data/src/nginx/src/http/ngx_http_parse.c +20 -0
- data/src/nginx/src/http/ngx_http_request.c +26 -15
- data/src/nginx/src/http/ngx_http_script.c +0 -1
- data/src/nginx/src/http/ngx_http_upstream_round_robin.c +72 -170
- data/src/nginx/src/http/ngx_http_upstream_round_robin.h +1 -0
- data/src/nginx/src/os/unix/ngx_errno.h +2 -0
- metadata +6 -4
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.2.
|
1
|
+
1.2.1.2
|
data/bin/nginxtra
CHANGED
data/lib/nginxtra.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require "nginxtra/action"
|
2
2
|
require "nginxtra/actions/compile"
|
3
|
+
require "nginxtra/actions/convert"
|
3
4
|
require "nginxtra/actions/install"
|
4
5
|
require "nginxtra/actions/reload"
|
5
6
|
require "nginxtra/actions/restart"
|
@@ -8,5 +9,6 @@ require "nginxtra/actions/status"
|
|
8
9
|
require "nginxtra/actions/stop"
|
9
10
|
require "nginxtra/cli"
|
10
11
|
require "nginxtra/config"
|
12
|
+
require "nginxtra/config_converter"
|
11
13
|
require "nginxtra/error"
|
12
14
|
require "nginxtra/status"
|
data/lib/nginxtra/action.rb
CHANGED
@@ -0,0 +1,67 @@
|
|
1
|
+
require "stringio"
|
2
|
+
|
3
|
+
module Nginxtra
|
4
|
+
module Actions
|
5
|
+
class Convert
|
6
|
+
include Nginxtra::Action
|
7
|
+
|
8
|
+
def convert
|
9
|
+
@streams_to_close = []
|
10
|
+
converter = Nginxtra::ConfigConverter.new output
|
11
|
+
converter.convert :config => config, :binary_status => binary_status
|
12
|
+
save_if_necessary!
|
13
|
+
ensure
|
14
|
+
close_streams!
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
def output
|
19
|
+
if @thor.options["output"]
|
20
|
+
STDOUT
|
21
|
+
elsif @thor.options["config"]
|
22
|
+
@output = @thor.options["config"]
|
23
|
+
@stringio = StringIO.new
|
24
|
+
else
|
25
|
+
@output = "nginxtra.conf.rb"
|
26
|
+
@stringio = StringIO.new
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def save_if_necessary!
|
31
|
+
return unless @output && @stringio
|
32
|
+
@thor.create_file @output, @stringio.string
|
33
|
+
end
|
34
|
+
|
35
|
+
def config
|
36
|
+
if @thor.options["input"]
|
37
|
+
STDIN
|
38
|
+
elsif @thor.options["nginx-conf"]
|
39
|
+
open_file @thor.options["nginx-conf"]
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def binary_status
|
44
|
+
return if @thor.options["ignore-nginx-bin"]
|
45
|
+
|
46
|
+
if @thor.options["nginx-bin"]
|
47
|
+
@thor.run "#{@thor.options["nginx-bin"]} -V 2>&1", :capture => true
|
48
|
+
else
|
49
|
+
# TODO: Figure out the nginx binary location and call -V
|
50
|
+
raise "The auto detection of nginx binary is not yet implemented. Please use the --nginx-bin option for now."
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def open_file(path)
|
55
|
+
raise "Missing config file #{path}" unless File.exists? path
|
56
|
+
|
57
|
+
File.open(path, "r").tap do |stream|
|
58
|
+
@streams_to_close << stream
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def close_streams!
|
63
|
+
@streams_to_close.each &:close
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -11,6 +11,9 @@ module Nginxtra
|
|
11
11
|
# if run with --non-interactive mode.
|
12
12
|
def optional_install
|
13
13
|
return installation_skipped if non_interactive?
|
14
|
+
# TODO: Raise an error if nginx is determined to be installed
|
15
|
+
# (via /etc/init.d/nginx perhaps... but allow ignoring this
|
16
|
+
# check).
|
14
17
|
return up_to_date unless should_install?
|
15
18
|
return unless requesting_install?
|
16
19
|
install
|
data/lib/nginxtra/cli.rb
CHANGED
@@ -9,6 +9,26 @@ module Nginxtra
|
|
9
9
|
class_option "config", :type => :string, :banner => "Specify the configuration file to use", :aliases => "-c"
|
10
10
|
class_option "basedir", :type => :string, :banner => "Specify the directory to store nginx files", :aliases => "-b"
|
11
11
|
|
12
|
+
desc "convert", "Convert an nginx.conf file to an nginxtra.conf.rb"
|
13
|
+
long_desc "
|
14
|
+
Parse nginx.conf and convert it to an equivalent nginxtra.conf.rb file. Expects
|
15
|
+
nginx.conf to be in the current folder, but a different file can be specified
|
16
|
+
with the --nginx-conf option. Parses the compile time options using the nginx
|
17
|
+
binary parsed from /etc/init.d/nginx, which can be overridden with the
|
18
|
+
--nginx-bin option. This task will fail if the binary cannot be determined,
|
19
|
+
unless the --ignore-nginx-bin option is used, which will cause the compile time
|
20
|
+
options to be ignored (and the defaults will be used in the resulting
|
21
|
+
nginxtra.conf.rb). The result will be output to nginxtra.conf.rb in the current
|
22
|
+
directory, unless an override value is specified with the --config option."
|
23
|
+
method_option "nginx-bin", :type => :string, :banner => "Point to the compiled nginx to retrieve compile options", :aliases => "-n"
|
24
|
+
method_option "nginx-conf", :type => :string, :banner => "Point to the nginx.conf file to retrieve the existing configuration", :aliases => "-", :default => "nginx.conf"
|
25
|
+
method_option "ignore-nginx-bin", :type => :boolean, :banner => "Ignore the nginx binary, and assume default compile time options", :aliases => "-N"
|
26
|
+
method_option "output", :type => :boolean, :banner => "Output to standard out instead of to a file", :aliases => "-o"
|
27
|
+
method_option "input", :type => :boolean, :banner => "Read nginx.conf from standard in instead of a file", :aliases => "-i"
|
28
|
+
def convert
|
29
|
+
Nginxtra::Actions::Convert.new(self, nil).convert
|
30
|
+
end
|
31
|
+
|
12
32
|
desc "compile", "Compiles nginx based on nginxtra.conf.rb"
|
13
33
|
long_desc "
|
14
34
|
Compile nginx with the compilation options specified in nginxtra.conf.rb. If it
|
@@ -0,0 +1,324 @@
|
|
1
|
+
module Nginxtra
|
2
|
+
class ConfigConverter
|
3
|
+
def initialize(output)
|
4
|
+
@converted = false
|
5
|
+
@output = output
|
6
|
+
@indentation = Nginxtra::ConfigConverter::Indentation.new
|
7
|
+
end
|
8
|
+
|
9
|
+
def convert(options)
|
10
|
+
raise Nginxtra::Error::ConvertFailed.new("The convert method can only be called once!") if converted?
|
11
|
+
header
|
12
|
+
compile_options options[:binary_status]
|
13
|
+
config_file options[:config]
|
14
|
+
footer
|
15
|
+
converted!
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
def header
|
20
|
+
@output.puts "nginxtra.config do"
|
21
|
+
@indentation + 1
|
22
|
+
end
|
23
|
+
|
24
|
+
def compile_options(status)
|
25
|
+
return unless status
|
26
|
+
options = (status[/^configure arguments:\s*(.*)$/, 1] || "").strip
|
27
|
+
return if options.empty?
|
28
|
+
options = options.split /\s+/
|
29
|
+
process_passenger_compile_options! options
|
30
|
+
|
31
|
+
options.each do |option|
|
32
|
+
next if invalid_compile_option? option
|
33
|
+
@output.print @indentation
|
34
|
+
@output.puts %{compile_option "#{option}"}
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def process_passenger_compile_options!(options)
|
39
|
+
return if options.select { |x| x =~ /^--add-module.*\/passenger.*/ }.empty?
|
40
|
+
@output.print @indentation
|
41
|
+
@output.puts "require_passenger!"
|
42
|
+
|
43
|
+
options.delete_if do |x|
|
44
|
+
next true if x =~ /^--add-module.*\/passenger.*/
|
45
|
+
["--with-http_ssl_module", "--with-http_gzip_static_module", "--with-cc-opt=-Wno-error"].include? x
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def invalid_compile_option?(option)
|
50
|
+
return true if option =~ /--prefix=/
|
51
|
+
return true if option =~ /--sbin-path=/
|
52
|
+
return true if option =~ /--conf-path=/
|
53
|
+
return true if option =~ /--pid-path=/
|
54
|
+
false
|
55
|
+
end
|
56
|
+
|
57
|
+
def config_file(input)
|
58
|
+
return unless input
|
59
|
+
@output.print @indentation
|
60
|
+
@output.puts %{file "nginx.conf" do}
|
61
|
+
@indentation + 1
|
62
|
+
line = Nginxtra::ConfigConverter::Line.new @indentation, @output
|
63
|
+
|
64
|
+
each_token(input) do |token|
|
65
|
+
line << token
|
66
|
+
|
67
|
+
if line.terminated?
|
68
|
+
line.puts
|
69
|
+
line = Nginxtra::ConfigConverter::Line.new @indentation, @output
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
raise Nginxtra::Error::ConvertFailed.new("Unexpected end of file!") unless line.empty?
|
74
|
+
@indentation - 1
|
75
|
+
@output.print @indentation
|
76
|
+
@output.puts "end"
|
77
|
+
end
|
78
|
+
|
79
|
+
def each_token(input)
|
80
|
+
token = Nginxtra::ConfigConverter::Token.new
|
81
|
+
|
82
|
+
while c = input.read(1)
|
83
|
+
if c == "#"
|
84
|
+
chomp_comment input
|
85
|
+
else
|
86
|
+
token << c
|
87
|
+
end
|
88
|
+
|
89
|
+
yield token.instance while token.ready?
|
90
|
+
end
|
91
|
+
|
92
|
+
yield token.instance while token.ready?
|
93
|
+
raise Nginxtra::Error::ConvertFailed.new("Unexpected end of file in mid token!") unless token.value.empty?
|
94
|
+
end
|
95
|
+
|
96
|
+
def chomp_comment(input)
|
97
|
+
while c = input.read(1)
|
98
|
+
break if c == "\n"
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
def footer
|
103
|
+
@indentation - 1
|
104
|
+
@output.puts "end"
|
105
|
+
raise Nginxtra::Error::ConvertFailed.new("Missing end blocks!") unless @indentation.done?
|
106
|
+
end
|
107
|
+
|
108
|
+
def converted!
|
109
|
+
@converted = true
|
110
|
+
end
|
111
|
+
|
112
|
+
def converted?
|
113
|
+
@converted
|
114
|
+
end
|
115
|
+
|
116
|
+
class Token
|
117
|
+
TERMINAL_CHARACTERS = ["{", "}", ";"].freeze
|
118
|
+
attr_reader :value
|
119
|
+
|
120
|
+
def initialize(value = nil)
|
121
|
+
@instance = true if value
|
122
|
+
@value = value || ""
|
123
|
+
@ready = false
|
124
|
+
end
|
125
|
+
|
126
|
+
def terminal_character?
|
127
|
+
TERMINAL_CHARACTERS.include? @value
|
128
|
+
end
|
129
|
+
|
130
|
+
def end?
|
131
|
+
@value == ";"
|
132
|
+
end
|
133
|
+
|
134
|
+
def block_start?
|
135
|
+
@value == "{"
|
136
|
+
end
|
137
|
+
|
138
|
+
def block_end?
|
139
|
+
@value == "}"
|
140
|
+
end
|
141
|
+
|
142
|
+
def instance
|
143
|
+
raise Nginxtra::Error::ConvertFailed.new("Whoops!") unless ready?
|
144
|
+
token = Nginxtra::ConfigConverter::Token.new @value
|
145
|
+
reset!
|
146
|
+
token
|
147
|
+
end
|
148
|
+
|
149
|
+
def <<(c)
|
150
|
+
return space! if c =~ /\s/
|
151
|
+
return terminal_character!(c) if TERMINAL_CHARACTERS.include? c
|
152
|
+
@value << c
|
153
|
+
end
|
154
|
+
|
155
|
+
def ready?
|
156
|
+
@instance || @ready || terminal_character?
|
157
|
+
end
|
158
|
+
|
159
|
+
def to_s
|
160
|
+
if @value =~ /^\d+$/
|
161
|
+
@value
|
162
|
+
else
|
163
|
+
%{"#{@value}"}
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
private
|
168
|
+
def space!
|
169
|
+
return if @value.empty?
|
170
|
+
@ready = true
|
171
|
+
end
|
172
|
+
|
173
|
+
def terminal_character!(c)
|
174
|
+
if @value.empty?
|
175
|
+
@value = c
|
176
|
+
else
|
177
|
+
@next = c
|
178
|
+
end
|
179
|
+
|
180
|
+
@ready = true
|
181
|
+
end
|
182
|
+
|
183
|
+
def reset!
|
184
|
+
if @next
|
185
|
+
@value = @next
|
186
|
+
else
|
187
|
+
@value = ""
|
188
|
+
end
|
189
|
+
|
190
|
+
@next = nil
|
191
|
+
@ready = false
|
192
|
+
end
|
193
|
+
end
|
194
|
+
|
195
|
+
class Line
|
196
|
+
def initialize(indentation, output)
|
197
|
+
@indentation = indentation
|
198
|
+
@output = output
|
199
|
+
@tokens = []
|
200
|
+
end
|
201
|
+
|
202
|
+
def <<(token)
|
203
|
+
@tokens << token
|
204
|
+
end
|
205
|
+
|
206
|
+
def empty?
|
207
|
+
@tokens.empty?
|
208
|
+
end
|
209
|
+
|
210
|
+
def terminated?
|
211
|
+
@tokens.last.terminal_character?
|
212
|
+
end
|
213
|
+
|
214
|
+
def puts
|
215
|
+
if @tokens.last.end?
|
216
|
+
puts_line
|
217
|
+
elsif @tokens.last.block_start?
|
218
|
+
puts_block_start
|
219
|
+
elsif @tokens.last.block_end?
|
220
|
+
puts_block_end
|
221
|
+
else
|
222
|
+
raise Nginxtra::Error::ConvertFailed.new "Can't puts invalid line!"
|
223
|
+
end
|
224
|
+
end
|
225
|
+
|
226
|
+
private
|
227
|
+
def passenger?
|
228
|
+
["passenger_root", "passenger_ruby", "passenger_enabled"].include? @tokens.first.value
|
229
|
+
end
|
230
|
+
|
231
|
+
def puts_line
|
232
|
+
raise Nginxtra::Error::ConvertFailed.new("line must have a first label!") unless @tokens.length > 1
|
233
|
+
return puts_passenger if passenger?
|
234
|
+
print_indentation
|
235
|
+
print_first
|
236
|
+
print_args
|
237
|
+
print_newline
|
238
|
+
end
|
239
|
+
|
240
|
+
def puts_passenger
|
241
|
+
print_indentation
|
242
|
+
|
243
|
+
if @tokens.first.value == "passenger_root"
|
244
|
+
print_newline "passenger_root!"
|
245
|
+
elsif @tokens.first.value == "passenger_ruby"
|
246
|
+
print_newline "passenger_ruby!"
|
247
|
+
elsif @tokens.first.value == "passenger_enabled"
|
248
|
+
print_newline "passenger_on!"
|
249
|
+
else
|
250
|
+
raise Nginxtra::Error::ConvertFailed.new("Whoops!")
|
251
|
+
end
|
252
|
+
end
|
253
|
+
|
254
|
+
def puts_block_start
|
255
|
+
raise Nginxtra::Error::ConvertFailed.new("Block start must have a first label!") unless @tokens.length > 1
|
256
|
+
print_indentation
|
257
|
+
print_first
|
258
|
+
print_args
|
259
|
+
print_newline(" do")
|
260
|
+
indent
|
261
|
+
end
|
262
|
+
|
263
|
+
def puts_block_end
|
264
|
+
raise Nginxtra::Error::ConvertFailed.new("Block end can't have labels!") unless @tokens.length == 1
|
265
|
+
unindent
|
266
|
+
print_indentation
|
267
|
+
print_newline("end")
|
268
|
+
end
|
269
|
+
|
270
|
+
def print_indentation
|
271
|
+
@output.print @indentation.to_s
|
272
|
+
end
|
273
|
+
|
274
|
+
def print_first
|
275
|
+
@output.print @tokens.first.value
|
276
|
+
end
|
277
|
+
|
278
|
+
def print_args
|
279
|
+
args = @tokens[1..-2]
|
280
|
+
return if args.empty?
|
281
|
+
@output.print " "
|
282
|
+
@output.print args.map(&:to_s).join(", ")
|
283
|
+
end
|
284
|
+
|
285
|
+
def print_newline(value = "")
|
286
|
+
@output.puts value
|
287
|
+
end
|
288
|
+
|
289
|
+
def indent
|
290
|
+
@indentation + 1
|
291
|
+
end
|
292
|
+
|
293
|
+
def unindent
|
294
|
+
@indentation - 1
|
295
|
+
end
|
296
|
+
end
|
297
|
+
|
298
|
+
class Indentation
|
299
|
+
attr_reader :value
|
300
|
+
|
301
|
+
def initialize
|
302
|
+
@value = 0
|
303
|
+
end
|
304
|
+
|
305
|
+
def done?
|
306
|
+
@value == 0
|
307
|
+
end
|
308
|
+
|
309
|
+
def -(amount)
|
310
|
+
self + (-amount)
|
311
|
+
end
|
312
|
+
|
313
|
+
def +(amount)
|
314
|
+
@value += amount
|
315
|
+
raise Nginxtra::Error::ConvertFailed.new("Missing block end!") if @value < 0
|
316
|
+
@value
|
317
|
+
end
|
318
|
+
|
319
|
+
def to_s
|
320
|
+
" " * @value
|
321
|
+
end
|
322
|
+
end
|
323
|
+
end
|
324
|
+
end
|