synapse-nginx 0.2.2 → 0.2.3
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.
- checksums.yaml +4 -4
- data/README.md +6 -1
- data/lib/synapse/config_generator/nginx.rb +37 -10
- data/lib/synapse-nginx.rb +1 -1
- data/spec/lib/synapse/nginx_spec.rb +2 -0
- data/synapse-nginx.gemspec +1 -1
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 73199a08eec1e313f37926a0c8c38dd00ebca0b5
|
4
|
+
data.tar.gz: a36bede5643dbd71b4fb5baf9c886c876adf609b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ac9a2eb24360488f1f04ba77049fce586f0ba73d7af8df5f69209c95d528ba09eb3eccdc1aa5f58d9563dfa06ed07d9a22724cce5bc40297fa8f07e10d5c28a1
|
7
|
+
data.tar.gz: 60a8611e1acd216065d9674006c11d212d4615c9e45fbeb6e94e942f6daca3cc100c448b568d4af0f1c9dcd6a6dad2381f901c7f583f2f0cae6868feaf8cc4bd
|
data/README.md
CHANGED
@@ -85,7 +85,12 @@ Setting `listen_address` on a per service basis overrides the global `listen_add
|
|
85
85
|
in the top level `nginx` config hash.
|
86
86
|
* `listen_options`: additional listen options provided as a string,
|
87
87
|
such as `reuseport`, to append to the listen line. (default is empty string)
|
88
|
-
* `upstream_order`: how servers should be ordered in the `upstream` stanza.
|
88
|
+
* `upstream_order`: how servers should be ordered in the `upstream` stanza.
|
89
|
+
This defaults to `asc` to prevent reloads, and can be set to:
|
90
|
+
* `asc` sort upstreams in ascending alphabetical order.
|
91
|
+
* `desc` sort upstreams in descending alphabetical order.
|
92
|
+
* `shuffle` means random ordering of servers.
|
93
|
+
* `no_shuffle` means no shuffling or sorting.
|
89
94
|
* `upstream_name`: The name of the generated nginx backend for this service
|
90
95
|
(defaults to the service's key in the `services` section)
|
91
96
|
|
@@ -38,15 +38,18 @@ class Synapse::ConfigGenerator
|
|
38
38
|
# how to restart nginx
|
39
39
|
@restart_interval = @opts.fetch('restart_interval', 2).to_i
|
40
40
|
@restart_jitter = @opts.fetch('restart_jitter', 0).to_f
|
41
|
-
@restart_required =
|
41
|
+
@restart_required = false
|
42
42
|
@has_started = false
|
43
43
|
|
44
44
|
# virtual clock bookkeeping for controlling how often nginx restarts
|
45
45
|
@time = 0
|
46
46
|
@next_restart = @time
|
47
47
|
|
48
|
-
# a place to store
|
49
|
-
|
48
|
+
# a place to store generated server + upstream stanzas, and watcher
|
49
|
+
# revisions so we can save CPU on updates by not re-computing stanzas
|
50
|
+
@servers_cache = {}
|
51
|
+
@upstreams_cache = {}
|
52
|
+
@watcher_revisions = {}
|
50
53
|
end
|
51
54
|
|
52
55
|
def normalize_watcher_provided_config(service_watcher_name, service_watcher_config)
|
@@ -57,9 +60,11 @@ class Synapse::ConfigGenerator
|
|
57
60
|
'server' => [],
|
58
61
|
'disabled' => false,
|
59
62
|
}
|
60
|
-
|
63
|
+
|
64
|
+
unless service_watcher_config.include?('port') || service_watcher_config['disabled']
|
61
65
|
log.warn "synapse: service #{service_watcher_name}: nginx config does not include a port; only upstream sections for the service will be created; you must move traffic there manually using server sections"
|
62
66
|
end
|
67
|
+
|
63
68
|
defaults.merge(service_watcher_config)
|
64
69
|
end
|
65
70
|
|
@@ -96,6 +101,19 @@ class Synapse::ConfigGenerator
|
|
96
101
|
# don't bind the port at all? ... idk
|
97
102
|
next if watcher_config['mode'] == 'tcp' && watcher.backends.empty?
|
98
103
|
|
104
|
+
|
105
|
+
# Only regenerate if something actually changed. This saves a lot
|
106
|
+
# of CPU load for high churn systems
|
107
|
+
regenerate = watcher.revision != @watcher_revisions[watcher.name] ||
|
108
|
+
@servers_cache[watcher.name].nil? ||
|
109
|
+
@upstreams_cache[watcher.name].nil?
|
110
|
+
|
111
|
+
if regenerate
|
112
|
+
@servers_cache[watcher.name] = generate_server(watcher).flatten
|
113
|
+
@upstreams_cache[watcher.name] = generate_upstream(watcher).flatten
|
114
|
+
@watcher_revisions[watcher.name] = watcher.revision
|
115
|
+
end
|
116
|
+
|
99
117
|
section = case watcher_config['mode']
|
100
118
|
when 'http'
|
101
119
|
http
|
@@ -104,8 +122,8 @@ class Synapse::ConfigGenerator
|
|
104
122
|
else
|
105
123
|
raise ArgumentError, "synapse does not understand #{watcher_config['mode']} as a service mode"
|
106
124
|
end
|
107
|
-
section <<
|
108
|
-
section <<
|
125
|
+
section << @servers_cache[watcher.name]
|
126
|
+
section << @upstreams_cache[watcher.name]
|
109
127
|
end
|
110
128
|
|
111
129
|
unless http.empty?
|
@@ -214,15 +232,18 @@ class Synapse::ConfigGenerator
|
|
214
232
|
# nginx doesn't like upstreams with no backends?
|
215
233
|
return [] if backends.empty?
|
216
234
|
|
235
|
+
# Note that because we use the config file as the source of truth
|
236
|
+
# for whether or not to reload, we want some kind of sorted order
|
237
|
+
# by default, in this case we choose asc
|
217
238
|
keys = case watcher_config['upstream_order']
|
218
|
-
when 'asc'
|
219
|
-
backends.keys.sort
|
220
239
|
when 'desc'
|
221
240
|
backends.keys.sort.reverse
|
241
|
+
when 'shuffle'
|
242
|
+
backends.keys.shuffle
|
222
243
|
when 'no_shuffle'
|
223
244
|
backends.keys
|
224
245
|
else
|
225
|
-
backends.keys.
|
246
|
+
backends.keys.sort
|
226
247
|
end
|
227
248
|
|
228
249
|
stanza = [
|
@@ -247,7 +268,13 @@ class Synapse::ConfigGenerator
|
|
247
268
|
old_config = ""
|
248
269
|
end
|
249
270
|
|
250
|
-
|
271
|
+
# The first line of the config files contain a timestamp, so to prevent
|
272
|
+
# un-needed restarts, only compare after that. We do not split on
|
273
|
+
# newlines and compare because this is called a lot, and we need to be
|
274
|
+
# as CPU efficient as possible.
|
275
|
+
old_version = old_config[(old_config.index("\n") || 0) + 1..-1]
|
276
|
+
new_version = new_config[(new_config.index("\n") || 0) + 1..-1]
|
277
|
+
if old_version == new_version
|
251
278
|
return false
|
252
279
|
else
|
253
280
|
File.open(opts['config_file_path'],'w') {|f| f.write(new_config)}
|
data/lib/synapse-nginx.rb
CHANGED
@@ -16,6 +16,7 @@ describe Synapse::ConfigGenerator::Nginx do
|
|
16
16
|
allow(mockWatcher).to receive(:config_for_generator).and_return({
|
17
17
|
'nginx' => watcher_config
|
18
18
|
})
|
19
|
+
allow(mockWatcher).to receive(:revision).and_return(1)
|
19
20
|
mockWatcher
|
20
21
|
end
|
21
22
|
|
@@ -28,6 +29,7 @@ describe Synapse::ConfigGenerator::Nginx do
|
|
28
29
|
allow(mockWatcher).to receive(:config_for_generator).and_return({
|
29
30
|
'nginx' => watcher_config
|
30
31
|
})
|
32
|
+
allow(mockWatcher).to receive(:revision).and_return(1)
|
31
33
|
mockWatcher
|
32
34
|
end
|
33
35
|
|
data/synapse-nginx.gemspec
CHANGED
@@ -17,7 +17,7 @@ Gem::Specification.new do |gem|
|
|
17
17
|
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
18
18
|
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
19
19
|
|
20
|
-
gem.add_runtime_dependency "synapse", "~> 0.14"
|
20
|
+
gem.add_runtime_dependency "synapse", "~> 0.14.4"
|
21
21
|
|
22
22
|
gem.add_development_dependency "rake", "~> 0"
|
23
23
|
gem.add_development_dependency "rspec", "~> 3.1"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: synapse-nginx
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Joseph Lynch
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-04-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: synapse
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: 0.14.4
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
26
|
+
version: 0.14.4
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|