zebra 1.0.0 → 1.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/README +13 -0
- data/contrib/config.yml +11 -0
- data/lib/zebra/command_line.rb +3 -4
- data/lib/zebra/proxy_server.rb +1 -1
- data/lib/zebra/proxy_worker.rb +16 -10
- data/lib/zebra/queue.rb +2 -2
- data/lib/zebra/version.rb +1 -1
- data/zebra.gemspec +2 -2
- metadata +6 -5
data/README
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
Usage:
|
2
|
+
|
3
|
+
# First start the queue
|
4
|
+
zebra --config contrib/config.yml queue
|
5
|
+
|
6
|
+
# Then start the workers
|
7
|
+
zebra --config contrib/config.yml worker
|
8
|
+
|
9
|
+
# Then start the proxy server
|
10
|
+
zebra --config contrib/config.yml server
|
11
|
+
|
12
|
+
# For more arguments, check out:
|
13
|
+
zebra --help
|
data/contrib/config.yml
CHANGED
data/lib/zebra/command_line.rb
CHANGED
@@ -39,16 +39,15 @@ module Zebra
|
|
39
39
|
Zebra.config.mode = ARGV.shift if ARGV.length > 0
|
40
40
|
raise MissingArgumentException.new("Missing --config parameter") unless Zebra.config.config_file?
|
41
41
|
raise MissingArgumentException.new("Missing mode of operation: server|proxy|queue") unless Zebra.config.mode?
|
42
|
+
rescue SystemExit
|
43
|
+
exit(1)
|
42
44
|
rescue MissingArgumentException => e
|
43
45
|
puts usage(e)
|
44
|
-
exit 1
|
45
46
|
rescue ArgumentError => e
|
46
47
|
puts usage(e)
|
47
|
-
exit 1
|
48
48
|
rescue Exception => e
|
49
|
-
puts e.message
|
49
|
+
puts "#{e.class}: #{e.message}"
|
50
50
|
puts e.backtrace.join("\n\t")
|
51
|
-
exit 1
|
52
51
|
end
|
53
52
|
end
|
54
53
|
|
data/lib/zebra/proxy_server.rb
CHANGED
@@ -16,7 +16,7 @@ module Zebra
|
|
16
16
|
config[:context] = EM::ZeroMQ::Context.new(1)
|
17
17
|
config[:connection_pool] = EM::Synchrony::ConnectionPool.new(:size => 20) do
|
18
18
|
config[:context].socket(ZMQ::REQ) do |socket|
|
19
|
-
socket.connect(
|
19
|
+
socket.connect(Zebra.config.server[:frontend_uri])
|
20
20
|
end
|
21
21
|
end
|
22
22
|
end
|
data/lib/zebra/proxy_worker.rb
CHANGED
@@ -27,8 +27,7 @@ module Zebra
|
|
27
27
|
raw_headers
|
28
28
|
end
|
29
29
|
|
30
|
-
def get_conn(
|
31
|
-
uri = URI.parse(url)
|
30
|
+
def get_conn(uri)
|
32
31
|
conn_key = uri.scheme + '://' + uri.host
|
33
32
|
return EM::HttpRequest.new(conn_key, :connect_timeout => 1, :inactivity_timeout => 1)
|
34
33
|
if @conns.has_key?(conn_key)
|
@@ -38,12 +37,11 @@ module Zebra
|
|
38
37
|
end
|
39
38
|
end
|
40
39
|
|
41
|
-
def fetch(method,
|
40
|
+
def fetch(method, uri, request_headers = {})
|
42
41
|
@response = nil
|
43
|
-
@logger.debug "Proxying #{method} #{
|
42
|
+
@logger.debug "Proxying #{method} #{uri} #{request_headers.inspect}"
|
44
43
|
t_start = Time.now
|
45
|
-
|
46
|
-
conn = get_conn(url)
|
44
|
+
conn = get_conn(uri)
|
47
45
|
request_headers['Host'] = uri.host
|
48
46
|
http = conn.send(method, path: uri.path, query: uri.query, head: request_headers, :keepalive => true)
|
49
47
|
@logger.debug "Request finished"
|
@@ -67,10 +65,15 @@ module Zebra
|
|
67
65
|
def handle_message(m)
|
68
66
|
#ap m.copy_out_string
|
69
67
|
env = JSON.parse(m.copy_out_string)
|
70
|
-
|
71
|
-
|
68
|
+
uri = URI.parse(env['REQUEST_URI'])
|
69
|
+
uri.host = env['HTTP_HOST'] if uri.host.nil? || uri.host.empty?
|
70
|
+
uri.path = '/' if uri.path.nil? || uri.path.empty?
|
71
|
+
puts env.inspect
|
72
|
+
uri.scheme = env['HTTP_X_FORWARDED_PROTO'].downcase if env.has_key?('HTTP_X_FORWARDED_PROTO')
|
73
|
+
uri.scheme = 'http' if uri.scheme.nil? || uri.scheme.empty?
|
72
74
|
method = env['REQUEST_METHOD'].downcase.to_sym
|
73
|
-
|
75
|
+
puts "uri: #{uri.to_s}"
|
76
|
+
fetch(method, uri)
|
74
77
|
end
|
75
78
|
|
76
79
|
def on_readable(socket, messages)
|
@@ -100,6 +103,9 @@ module Zebra
|
|
100
103
|
:app_name => @app_name,
|
101
104
|
:logger => @log,
|
102
105
|
:timeout => @timeout }
|
106
|
+
params[:stdout_path] = Zebra.config.log_file if Zebra.config.log_file?
|
107
|
+
params[:stderr_path] = Zebra.config.log_file if Zebra.config.log_file?
|
108
|
+
|
103
109
|
workers = Preforker.new(params) do |master|
|
104
110
|
config = {:logger => @log}
|
105
111
|
handler = ProxyWorkerReceiveMessageHandler.new(config)
|
@@ -114,7 +120,7 @@ module Zebra
|
|
114
120
|
context = EM::ZeroMQ::Context.new(1)
|
115
121
|
# connection_pool = EM::Synchrony::ConnectionPool.new(:size => 1) do
|
116
122
|
socket = context.socket(ZMQ::REP, handler)
|
117
|
-
socket.connect(
|
123
|
+
socket.connect(Zebra.config.worker[:backend_uri])
|
118
124
|
# end
|
119
125
|
end
|
120
126
|
end
|
data/lib/zebra/queue.rb
CHANGED
@@ -5,8 +5,8 @@ module Zebra
|
|
5
5
|
attr_accessor :context, :frontend, :backend, :poller, :log, :frontend_uri, :backend_uri
|
6
6
|
def initialize(config)
|
7
7
|
@log = config[:logger] || Logger.new(STDERR)
|
8
|
-
@frontend_uri = config[:
|
9
|
-
@backend_uri = config[:
|
8
|
+
@frontend_uri = config[:frontend_uri] || 'tcp://*:5559'
|
9
|
+
@backend_uri = config[:backend_uri] || 'tcp://*:5560'
|
10
10
|
@context = ZMQ::Context.new
|
11
11
|
|
12
12
|
# Socket facing clients
|
data/lib/zebra/version.rb
CHANGED
data/zebra.gemspec
CHANGED
@@ -8,8 +8,8 @@ Gem::Specification.new do |s|
|
|
8
8
|
s.authors = ["osterman"]
|
9
9
|
s.email = ["e@osterman.com"]
|
10
10
|
s.homepage = "https://github.com/osterman/zebra"
|
11
|
-
s.summary = %q{A Goliath
|
12
|
-
s.description = %q{
|
11
|
+
s.summary = %q{A Goliath Reverse HTTP Proxy Implementation Using ZMQ}
|
12
|
+
s.description = %q{Zebra is a HTTP proxy server that uses ZMQ as the wire protocol between HTTP proxy gateway(s) and backend worker node(s). This allows for seamless load distribution to worker nodes behind a firewall.}
|
13
13
|
|
14
14
|
s.rubyforge_project = "zebra"
|
15
15
|
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: zebra
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 21
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 1
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 1.0.
|
9
|
+
- 1
|
10
|
+
version: 1.0.1
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- osterman
|
@@ -192,7 +192,7 @@ dependencies:
|
|
192
192
|
version: 1.1.0
|
193
193
|
type: :runtime
|
194
194
|
version_requirements: *id011
|
195
|
-
description:
|
195
|
+
description: Zebra is a HTTP proxy server that uses ZMQ as the wire protocol between HTTP proxy gateway(s) and backend worker node(s). This allows for seamless load distribution to worker nodes behind a firewall.
|
196
196
|
email:
|
197
197
|
- e@osterman.com
|
198
198
|
executables:
|
@@ -204,6 +204,7 @@ extra_rdoc_files: []
|
|
204
204
|
files:
|
205
205
|
- .gitignore
|
206
206
|
- Gemfile
|
207
|
+
- README
|
207
208
|
- Rakefile
|
208
209
|
- bin/zebra
|
209
210
|
- contrib/config.yml
|
@@ -249,6 +250,6 @@ rubyforge_project: zebra
|
|
249
250
|
rubygems_version: 1.3.7
|
250
251
|
signing_key:
|
251
252
|
specification_version: 3
|
252
|
-
summary: A Goliath
|
253
|
+
summary: A Goliath Reverse HTTP Proxy Implementation Using ZMQ
|
253
254
|
test_files: []
|
254
255
|
|