nginxtra 1.2.6.7 → 1.2.6.8
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/bin/nginxtra +1 -1
- data/bin/nginxtra_rails +1 -1
- data/lib/nginxtra.rb +1 -0
- data/lib/nginxtra/actions/install.rb +0 -38
- data/lib/nginxtra/actions/print.rb +23 -0
- data/lib/nginxtra/actions/start.rb +0 -6
- data/lib/nginxtra/cli.rb +22 -9
- data/lib/nginxtra/config.rb +106 -11
- data/lib/nginxtra/config_converter.rb +33 -2
- data/lib/nginxtra/version.rb +1 -1
- metadata +33 -33
data/bin/nginxtra
CHANGED
data/bin/nginxtra_rails
CHANGED
data/lib/nginxtra.rb
CHANGED
@@ -2,6 +2,7 @@ require "nginxtra/action"
|
|
2
2
|
require "nginxtra/actions/compile"
|
3
3
|
require "nginxtra/actions/convert"
|
4
4
|
require "nginxtra/actions/install"
|
5
|
+
require "nginxtra/actions/print"
|
5
6
|
require "nginxtra/actions/reload"
|
6
7
|
require "nginxtra/actions/restart"
|
7
8
|
require "nginxtra/actions/start"
|
@@ -6,23 +6,11 @@ module Nginxtra
|
|
6
6
|
class Install
|
7
7
|
include Nginxtra::Action
|
8
8
|
|
9
|
-
# Run the installation of nginxtra, but only after first
|
10
|
-
# prompting if the user wants the install. This will do nothing
|
11
|
-
# if run with --non-interactive mode.
|
12
|
-
def optional_install
|
13
|
-
return installation_skipped if non_interactive?
|
14
|
-
return up_to_date unless should_install?
|
15
|
-
return unless requesting_install?
|
16
|
-
install
|
17
|
-
end
|
18
|
-
|
19
9
|
# Run the installation of nginxtra.
|
20
10
|
def install
|
21
11
|
return up_to_date unless should_install?
|
22
12
|
check_if_nginx_is_installed
|
23
13
|
create_etc_script
|
24
|
-
remember_config_location
|
25
|
-
remember_working_directory
|
26
14
|
update_last_install
|
27
15
|
end
|
28
16
|
|
@@ -76,26 +64,6 @@ export GEM_PATH="#{ENV["GEM_PATH"]}"
|
|
76
64
|
@thor.say "nginxtra installation is up to date"
|
77
65
|
end
|
78
66
|
|
79
|
-
# Notify to the user that installation is being skipped.
|
80
|
-
def installation_skipped
|
81
|
-
@thor.say "skipping nginxtra installation"
|
82
|
-
end
|
83
|
-
|
84
|
-
# Remember the last config location, and use it unless the
|
85
|
-
# config is explicitly passed in.
|
86
|
-
def remember_config_location
|
87
|
-
# Absolute path somehow turns the path to a binary string when
|
88
|
-
# output to Yaml... so make it a string so it stays ascii
|
89
|
-
# readable.
|
90
|
-
Nginxtra::Status[:remembered_config] = Nginxtra::Config.loaded_config_path.to_s
|
91
|
-
end
|
92
|
-
|
93
|
-
# Remember the last working directory, and use it unless the
|
94
|
-
# working direcotry is explicitly passed in.
|
95
|
-
def remember_working_directory
|
96
|
-
Nginxtra::Status[:remembered_workingdir] = File.expand_path "."
|
97
|
-
end
|
98
|
-
|
99
67
|
# Mark the last installed version and last installed time (the
|
100
68
|
# former being used to determine if nginxtra has been installed
|
101
69
|
# yet).
|
@@ -104,12 +72,6 @@ export GEM_PATH="#{ENV["GEM_PATH"]}"
|
|
104
72
|
Nginxtra::Status[:last_install_time] = Time.now
|
105
73
|
end
|
106
74
|
|
107
|
-
# Ask the user if they wish to install. Return whether the user
|
108
|
-
# requests the install.
|
109
|
-
def requesting_install?
|
110
|
-
@thor.yes? "Would you like to install nginxtra?"
|
111
|
-
end
|
112
|
-
|
113
75
|
# Determine if the install should proceed. This will be true if
|
114
76
|
# the force option was used, or if this version of nginxtra
|
115
77
|
# differs from the last version installed.
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Nginxtra
|
2
|
+
module Actions
|
3
|
+
class Print
|
4
|
+
include Nginxtra::Action
|
5
|
+
|
6
|
+
def print
|
7
|
+
if @thor.options["list"]
|
8
|
+
@thor.say "Known config files:\n #{@config.files.sort.join "\n "}"
|
9
|
+
elsif @thor.options["compile-options"]
|
10
|
+
@thor.say "Compilation options:\n #{@config.compile_options}"
|
11
|
+
elsif @config.files.include?(file)
|
12
|
+
@thor.say @config.file_contents(file)
|
13
|
+
else
|
14
|
+
@thor.say "No config file by the name '#{file}' exists!"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def file
|
19
|
+
@thor.options["file"]
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -12,7 +12,6 @@ module Nginxtra
|
|
12
12
|
def start
|
13
13
|
without_force do
|
14
14
|
compile
|
15
|
-
install
|
16
15
|
end
|
17
16
|
|
18
17
|
return no_need_to_start unless should_start?
|
@@ -26,11 +25,6 @@ module Nginxtra
|
|
26
25
|
Nginxtra::Actions::Compile.new(@thor, @config).compile
|
27
26
|
end
|
28
27
|
|
29
|
-
# Invoke nginxtra installation, but only if the user allows it.
|
30
|
-
def install
|
31
|
-
Nginxtra::Actions::Install.new(@thor, @config).optional_install
|
32
|
-
end
|
33
|
-
|
34
28
|
# Save nginx config files to the proper config file path.
|
35
29
|
def save_config_files
|
36
30
|
files = @config.files
|
data/lib/nginxtra/cli.rb
CHANGED
@@ -26,7 +26,7 @@ module Nginxtra
|
|
26
26
|
nginxtra.conf.rb). The result will be output to nginxtra.conf.rb in the current
|
27
27
|
directory, unless an override value is specified with the --config option."
|
28
28
|
method_option "nginx-bin", :type => :string, :banner => "Point to the compiled nginx to retrieve compile options", :aliases => "-n"
|
29
|
-
method_option "nginx-conf", :type => :string, :banner => "Point to the nginx.conf file to retrieve the existing configuration", :aliases => "-", :default => "nginx.conf"
|
29
|
+
method_option "nginx-conf", :type => :string, :banner => "Point to the nginx.conf file to retrieve the existing configuration", :aliases => "-F", :default => "nginx.conf"
|
30
30
|
method_option "ignore-nginx-bin", :type => :boolean, :banner => "Ignore the nginx binary, and assume default compile time options", :aliases => "-N"
|
31
31
|
method_option "output", :type => :boolean, :banner => "Output to standard out instead of to a file", :aliases => "-o"
|
32
32
|
method_option "input", :type => :boolean, :banner => "Read nginx.conf from standard in instead of a file", :aliases => "-i"
|
@@ -36,6 +36,22 @@ module Nginxtra
|
|
36
36
|
end
|
37
37
|
end
|
38
38
|
|
39
|
+
desc "print", "Output nginxtra.conf.rb as it is processed as nginx.conf"
|
40
|
+
long_desc "
|
41
|
+
Output the contents of nginx.conf, as it is defined in nginxtra.conf.rb. If the
|
42
|
+
--file is provided, something other than nginx.conf can be output. The --list
|
43
|
+
option can be provided to list known config files. The --compile-options option
|
44
|
+
can be provided to list compile time options being passed to nginx."
|
45
|
+
method_option "compile-options", :type => :boolean, :banner => "Show compile options being used", :aliases => "-C"
|
46
|
+
method_option "file", :type => :string, :banner => "The config file that is printed", :aliases => "-F", :default => "nginx.conf"
|
47
|
+
method_option "list", :type => :boolean, :banner => "List known files", :aliases => "-l"
|
48
|
+
def print
|
49
|
+
Nginxtra::Error.protect self do
|
50
|
+
set_working_dir!
|
51
|
+
Nginxtra::Actions::Print.new(self, prepare_config!).print
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
39
55
|
desc "compile", "Compiles nginx based on nginxtra.conf.rb"
|
40
56
|
long_desc "
|
41
57
|
Compile nginx with the compilation options specified in nginxtra.conf.rb. If it
|
@@ -66,12 +82,11 @@ module Nginxtra
|
|
66
82
|
long_desc "
|
67
83
|
Start nginx based on nginxtra.conf.rb. If nginx has not yet been compiled for
|
68
84
|
the given compilation options or the current nginx version, it will be compiled.
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
compile or install task should be invoked if those need to be forced."
|
85
|
+
The configuration for nginx will automatically be handled by nginxtra so it
|
86
|
+
matches what is defined in nginxtra.conf.rb. If it is already running, this
|
87
|
+
will do nothing, unless --force is passed. Note that compilation will NOT be
|
88
|
+
forced with the --force option and should be invoked separately if it needs to
|
89
|
+
be forced."
|
75
90
|
def start
|
76
91
|
Nginxtra::Error.protect self do
|
77
92
|
set_working_dir!
|
@@ -136,8 +151,6 @@ module Nginxtra
|
|
136
151
|
def set_working_dir!
|
137
152
|
if options["workingdir"]
|
138
153
|
Dir.chdir options["workingdir"]
|
139
|
-
elsif Nginxtra::Status[:remembered_workingdir]
|
140
|
-
Dir.chdir Nginxtra::Status[:remembered_workingdir]
|
141
154
|
end
|
142
155
|
end
|
143
156
|
|
data/lib/nginxtra/config.rb
CHANGED
@@ -168,6 +168,11 @@ module Nginxtra
|
|
168
168
|
# returned.
|
169
169
|
def path
|
170
170
|
path = File.absolute_path "."
|
171
|
+
config = File.join path, FILENAME
|
172
|
+
return config if File.exists? config
|
173
|
+
config = File.join path, "config", FILENAME
|
174
|
+
return config if File.exists? config
|
175
|
+
path = File.dirname path
|
171
176
|
|
172
177
|
begin
|
173
178
|
config = File.join path, FILENAME
|
@@ -191,8 +196,6 @@ module Nginxtra
|
|
191
196
|
def require!(config_path = nil)
|
192
197
|
if config_path
|
193
198
|
config_path = File.absolute_path config_path
|
194
|
-
elsif Nginxtra::Status[:remembered_config]
|
195
|
-
config_path = File.absolute_path Nginxtra::Status[:remembered_config]
|
196
199
|
else
|
197
200
|
config_path = path
|
198
201
|
end
|
@@ -310,6 +313,56 @@ module Nginxtra
|
|
310
313
|
end
|
311
314
|
end
|
312
315
|
|
316
|
+
# Extension point for other gems or libraries that want to define
|
317
|
+
# inline partials. Please see the partial method for usage.
|
318
|
+
class Extension
|
319
|
+
class << self
|
320
|
+
# Determine if there has been a partial defined for the given
|
321
|
+
# nginx config file, with the given partial name.
|
322
|
+
def partial?(file, name)
|
323
|
+
file = file.to_sym
|
324
|
+
name = name.to_sym
|
325
|
+
@extensions && @extensions[file] && @extensions[file][name]
|
326
|
+
end
|
327
|
+
|
328
|
+
# Define or retrieve the partial for the given nginx config
|
329
|
+
# file and partial name. If a block is provided, it is set as
|
330
|
+
# the partial, otherwise the partial currently defined for it
|
331
|
+
# will be retrieved. The block is expected to take 2
|
332
|
+
# arguments... the arguments hash, and then the block passed
|
333
|
+
# in to this definition. Either may be ignored if so desired.
|
334
|
+
#
|
335
|
+
# Example usage:
|
336
|
+
# Nginxtra::Config::Extension.partial "nginx.conf", "my_app" do |args, block|
|
337
|
+
# my_app(args[:port] || 80)
|
338
|
+
# some_other_setting "on"
|
339
|
+
# block.call
|
340
|
+
# end
|
341
|
+
#
|
342
|
+
# The partial will only be valid for the given config file.
|
343
|
+
# It is completely nestable, and other partials may be invoked
|
344
|
+
# as well.
|
345
|
+
def partial(file, name, &block)
|
346
|
+
file = file.to_sym
|
347
|
+
name = name.to_sym
|
348
|
+
@extensions ||= {}
|
349
|
+
@extensions[file] ||= {}
|
350
|
+
|
351
|
+
if block
|
352
|
+
@extensions[file][name] = block
|
353
|
+
else
|
354
|
+
@extensions[file][name]
|
355
|
+
end
|
356
|
+
end
|
357
|
+
|
358
|
+
# Clear all partials so far defined. This is mainly for test,
|
359
|
+
# but could be called if resetting is so desired.
|
360
|
+
def clear_partials!
|
361
|
+
@extensions = {}
|
362
|
+
end
|
363
|
+
end
|
364
|
+
end
|
365
|
+
|
313
366
|
# Represents a config file being defined by nginxtra.conf.rb.
|
314
367
|
class ConfigFile
|
315
368
|
def initialize(filename, config, &block)
|
@@ -385,15 +438,51 @@ module Nginxtra
|
|
385
438
|
@end_of_block = true
|
386
439
|
end
|
387
440
|
|
441
|
+
# Convenience method to use the "break" keyword, as seen in if
|
442
|
+
# blocks of nginx configurations.
|
443
|
+
def _break(*args, &block)
|
444
|
+
process_config_block_or_line "break", args, block
|
445
|
+
end
|
446
|
+
|
447
|
+
# Convenience method to invoke an if block in the nginx
|
448
|
+
# configuration. Parenthesis are added around the arguments of
|
449
|
+
# this method.
|
450
|
+
#
|
451
|
+
# Example usage:
|
452
|
+
# nginxtra.config do
|
453
|
+
# _if "some", "~", "thing" do
|
454
|
+
# _return 404
|
455
|
+
# end
|
456
|
+
# end
|
457
|
+
#
|
458
|
+
# Which will produce the following config:
|
459
|
+
# if (some ~ thing) {
|
460
|
+
# return 404;
|
461
|
+
# }
|
462
|
+
def _if(*args, &block)
|
463
|
+
config_block "if (#{args.join " "})", &block
|
464
|
+
end
|
465
|
+
|
466
|
+
# Convenience method to use the "return" keyword, as seen in if
|
467
|
+
# blocks of nginx configurations.
|
468
|
+
def _return(*args, &block)
|
469
|
+
process_config_block_or_line "return", args, block
|
470
|
+
end
|
471
|
+
|
388
472
|
# Process the given template. Optionally, include options (as
|
389
473
|
# yielded values) available to the template. The yielder passed
|
390
474
|
# in will be invoked (if given) if the template invokes yield.
|
391
475
|
def process_template!(template, options = {}, yielder = nil)
|
392
|
-
|
393
|
-
if
|
394
|
-
|
395
|
-
|
396
|
-
|
476
|
+
if template.respond_to? :call
|
477
|
+
block = Proc.new { instance_eval &yielder if yielder }
|
478
|
+
instance_exec options, block, &template
|
479
|
+
else
|
480
|
+
process_template_with_yields! template do |x|
|
481
|
+
if x
|
482
|
+
options[x.to_sym]
|
483
|
+
else
|
484
|
+
instance_eval &yielder if yielder
|
485
|
+
end
|
397
486
|
end
|
398
487
|
end
|
399
488
|
end
|
@@ -444,16 +533,22 @@ module Nginxtra
|
|
444
533
|
|
445
534
|
private
|
446
535
|
def partial?(partial_name)
|
536
|
+
return true if Nginxtra::Config::Extension.partial? @filename, partial_name
|
537
|
+
|
447
538
|
@config.partial_paths.any? do |path|
|
448
539
|
File.exists? File.join(path, "#{@filename}/#{partial_name}.rb")
|
449
540
|
end
|
450
541
|
end
|
451
542
|
|
452
543
|
def invoke_partial(partial_name, args, block)
|
453
|
-
|
454
|
-
|
455
|
-
|
456
|
-
|
544
|
+
if Nginxtra::Config::Extension.partial? @filename, partial_name
|
545
|
+
partial_path = Nginxtra::Config::Extension.partial @filename, partial_name
|
546
|
+
else
|
547
|
+
partial_path = @config.partial_paths.map do |path|
|
548
|
+
File.join path, "#{@filename}/#{partial_name}.rb"
|
549
|
+
end.find do |path|
|
550
|
+
File.exists? path
|
551
|
+
end
|
457
552
|
end
|
458
553
|
|
459
554
|
if args.empty?
|
@@ -114,6 +114,7 @@ module Nginxtra
|
|
114
114
|
end
|
115
115
|
|
116
116
|
class Token
|
117
|
+
KEYWORDS = ["break", "if", "return"].freeze
|
117
118
|
TERMINAL_CHARACTERS = ["{", "}", ";"].freeze
|
118
119
|
attr_reader :value
|
119
120
|
|
@@ -123,6 +124,18 @@ module Nginxtra
|
|
123
124
|
@ready = false
|
124
125
|
end
|
125
126
|
|
127
|
+
def is_if?
|
128
|
+
@value == "if"
|
129
|
+
end
|
130
|
+
|
131
|
+
def if_start!
|
132
|
+
@value.gsub! /^\(/, ""
|
133
|
+
end
|
134
|
+
|
135
|
+
def if_end!
|
136
|
+
@value.gsub! /\)$/, ""
|
137
|
+
end
|
138
|
+
|
126
139
|
def terminal_character?
|
127
140
|
TERMINAL_CHARACTERS.include? @value
|
128
141
|
end
|
@@ -156,11 +169,19 @@ module Nginxtra
|
|
156
169
|
@instance || @ready || terminal_character?
|
157
170
|
end
|
158
171
|
|
172
|
+
def to_line_start
|
173
|
+
if KEYWORDS.include? @value
|
174
|
+
"_#{@value}"
|
175
|
+
else
|
176
|
+
@value
|
177
|
+
end
|
178
|
+
end
|
179
|
+
|
159
180
|
def to_s
|
160
181
|
if @value =~ /^\d+$/
|
161
182
|
@value
|
162
183
|
else
|
163
|
-
%{"#{@value}"}
|
184
|
+
%{"#{@value.gsub("\\") { "\\\\" }}"}
|
164
185
|
end
|
165
186
|
end
|
166
187
|
|
@@ -224,6 +245,10 @@ module Nginxtra
|
|
224
245
|
end
|
225
246
|
|
226
247
|
private
|
248
|
+
def is_if?
|
249
|
+
@tokens.first.is_if?
|
250
|
+
end
|
251
|
+
|
227
252
|
def passenger?
|
228
253
|
["passenger_root", "passenger_ruby", "passenger_enabled"].include? @tokens.first.value
|
229
254
|
end
|
@@ -272,13 +297,19 @@ module Nginxtra
|
|
272
297
|
end
|
273
298
|
|
274
299
|
def print_first
|
275
|
-
@output.print @tokens.first.
|
300
|
+
@output.print @tokens.first.to_line_start
|
276
301
|
end
|
277
302
|
|
278
303
|
def print_args
|
279
304
|
args = @tokens[1..-2]
|
280
305
|
return if args.empty?
|
281
306
|
@output.print " "
|
307
|
+
|
308
|
+
if is_if?
|
309
|
+
args.first.if_start!
|
310
|
+
args.last.if_end!
|
311
|
+
end
|
312
|
+
|
282
313
|
@output.print args.map(&:to_s).join(", ")
|
283
314
|
end
|
284
315
|
|
data/lib/nginxtra/version.rb
CHANGED
metadata
CHANGED
@@ -1,38 +1,41 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: nginxtra
|
3
|
-
version: !ruby/object:Gem::Version
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.2.6.8
|
4
5
|
prerelease:
|
5
|
-
version: 1.2.6.7
|
6
6
|
platform: ruby
|
7
|
-
authors:
|
7
|
+
authors:
|
8
8
|
- Mike Virata-Stone
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2013-02-12 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
16
15
|
name: thor
|
17
|
-
|
18
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
19
17
|
none: false
|
20
|
-
requirements:
|
18
|
+
requirements:
|
21
19
|
- - ~>
|
22
|
-
- !ruby/object:Gem::Version
|
20
|
+
- !ruby/object:Gem::Version
|
23
21
|
version: 0.16.0
|
24
22
|
type: :runtime
|
25
|
-
|
26
|
-
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 0.16.0
|
30
|
+
description: This gem is intended to provide an easy to use configuration file that
|
31
|
+
will automatically be used to compile nginx and configure the configuration.
|
27
32
|
email: reasonnumber@gmail.com
|
28
|
-
executables:
|
33
|
+
executables:
|
29
34
|
- nginxtra
|
30
35
|
- nginxtra_rails
|
31
36
|
extensions: []
|
32
|
-
|
33
37
|
extra_rdoc_files: []
|
34
|
-
|
35
|
-
files:
|
38
|
+
files:
|
36
39
|
- bin/nginxtra
|
37
40
|
- bin/nginxtra_rails
|
38
41
|
- lib/nginxtra.rb
|
@@ -40,6 +43,7 @@ files:
|
|
40
43
|
- lib/nginxtra/actions/compile.rb
|
41
44
|
- lib/nginxtra/actions/convert.rb
|
42
45
|
- lib/nginxtra/actions/install.rb
|
46
|
+
- lib/nginxtra/actions/print.rb
|
43
47
|
- lib/nginxtra/actions/rails/server.rb
|
44
48
|
- lib/nginxtra/actions/reload.rb
|
45
49
|
- lib/nginxtra/actions/restart.rb
|
@@ -411,30 +415,26 @@ files:
|
|
411
415
|
- vendor/nginx/src/os/unix/rfork_thread.S
|
412
416
|
homepage: http://reasonnumber.com/nginxtra
|
413
417
|
licenses: []
|
414
|
-
|
415
418
|
post_install_message:
|
416
419
|
rdoc_options: []
|
417
|
-
|
418
|
-
require_paths:
|
420
|
+
require_paths:
|
419
421
|
- lib
|
420
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
422
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
421
423
|
none: false
|
422
|
-
requirements:
|
423
|
-
- -
|
424
|
-
- !ruby/object:Gem::Version
|
425
|
-
version:
|
426
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
424
|
+
requirements:
|
425
|
+
- - ! '>='
|
426
|
+
- !ruby/object:Gem::Version
|
427
|
+
version: '0'
|
428
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
427
429
|
none: false
|
428
|
-
requirements:
|
429
|
-
- -
|
430
|
-
- !ruby/object:Gem::Version
|
431
|
-
version:
|
430
|
+
requirements:
|
431
|
+
- - ! '>='
|
432
|
+
- !ruby/object:Gem::Version
|
433
|
+
version: '0'
|
432
434
|
requirements: []
|
433
|
-
|
434
435
|
rubyforge_project:
|
435
436
|
rubygems_version: 1.8.24
|
436
437
|
signing_key:
|
437
438
|
specification_version: 3
|
438
439
|
summary: Wrapper of nginx for easy install and use.
|
439
440
|
test_files: []
|
440
|
-
|