ez-nginx-proxy 0.0.1

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.
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in ez-nginx-proxy.gemspec
4
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2012 Caleb Spare
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,55 @@
1
+ # ez-nginx-proxy
2
+
3
+ ez-nginx-proxy is a small wrapper around nginx. It requires nginx to already be installed. It is useful for
4
+ development, when you want to very easily start a proxy that will send requests to various other
5
+ development/production servers based on matching the routes.
6
+
7
+ ez-nginx-proxy takes a very simple Ruby configuration file. Here is an example configuration:
8
+
9
+ ``` ruby
10
+ [
11
+ ["/foo/bar", "localhost:1234"],
12
+ ["/", "amazon.com"]
13
+ ]
14
+ ```
15
+
16
+ If you run this configuration like this:
17
+
18
+ $ ez-nginx-proxy -p 9000 my_config.rb
19
+
20
+ ez-nginx-proxy will create a temporary nginx configuration file that redirects `localhost:9000/foo/bar` to
21
+ `localhost:1234/foo/bar` and `localhost:9000/blah` to `amazon.com/blah`.
22
+
23
+ ## Usage
24
+
25
+ $ ez-nginx-proxy your_config.rb
26
+
27
+ See `ez-nginx-proxy -h` for all the options.
28
+
29
+ ## Installation
30
+
31
+ Install nginx. You can do this using your favorite package manager:
32
+
33
+ $ sudo apt-get install nginx
34
+ $ brew install nginx
35
+ # or whatever
36
+
37
+ Now install ez-nginx-proxy
38
+
39
+ $ gem install ez-nginx-proxy
40
+
41
+ ## NOTE:
42
+
43
+ You will probably see this error when ez-nginx-proxy starts:
44
+
45
+ nginx: [alert] could not open error log file: open() "/var/log/nginx/error.log" failed (13: Permission denied)
46
+
47
+ This is because nginx initially tries to log to `/var/log/nginx/error.log` before it starts up. See [this
48
+ nginx config page](http://wiki.nginx.org/CoreModule#error_log) for more information.
49
+
50
+
51
+ ## TODO
52
+
53
+ * nginx regex matching
54
+ * pattern replacement?
55
+ * Hide the annoying 'permission denied' error
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env rake
2
+ require "bundler/gem_tasks"
@@ -0,0 +1,141 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # For developing the gem
4
+ #$:.unshift(File.join(File.dirname(__FILE__), "../lib"))
5
+
6
+ require "erb"
7
+ require "securerandom"
8
+ require "fileutils"
9
+
10
+ require "trollop"
11
+ require "dedent"
12
+ require "colorize"
13
+
14
+ require "ez-nginx-proxy/version"
15
+
16
+ options = Trollop.options do
17
+ version EzNginxProxy::VERSION
18
+ banner <<-EOS.dedent
19
+ ez-nginx-proxy is a very simple reverse http proxy that can route requests based on pattern-matching the
20
+ URI. The configuration file is Ruby, and it must have the following form:
21
+
22
+ [
23
+ ["/foo/bar", "localhost:1234"], # Route requests to /foo/bar to a local server
24
+ ["/", "amazon.com"] # / matches every request
25
+ ]
26
+
27
+ Usage:
28
+
29
+ $ ez-nginx-proxy [options] CONFIG_FILE
30
+
31
+ where [options] are:
32
+ EOS
33
+ opt :address, "Bind address", :default => "0.0.0.0"
34
+ opt :port, "Port", :default => 9876
35
+ opt :nginx_location, "Location of nginx", :default => `which nginx`
36
+ opt :version, "Show ez-nginx-proxy version"
37
+ end
38
+
39
+ Trollop.die "You must provide a configuration file" unless ARGV[0]
40
+ Trollop.die "Invalid config file: #{ARGV[0]}" unless File.file? ARGV[0]
41
+ begin
42
+ routes = eval(File.read(ARGV[0]))
43
+ rescue
44
+ Trollop.die "Error reading or parsing the config file #{ARGV[0]}"
45
+ end
46
+
47
+ # Locate nginx
48
+ nginx = nil
49
+ ([options[:nginx_location]] + %w(/usr/sbin/nginx /usr/local/sbin/nginx)).each do |guess_location|
50
+ if File.file? guess_location
51
+ nginx = guess_location
52
+ break
53
+ end
54
+ end
55
+ unless nginx
56
+ abort <<-EOS.dedent
57
+ Unable to locate nginx. Please install it using
58
+
59
+ $ sudo apt-get install nginx # Ubuntu
60
+
61
+ or
62
+
63
+ $ brew install nginx # Mac OS / homebrew
64
+
65
+ or similar. If nginx is installed to a nonstandard location, please pass that in with the --nginx-location
66
+ option.
67
+ EOS
68
+ end
69
+
70
+ # Locate the nginx configuration root
71
+ config_output = `#{nginx} -V 2>&1`
72
+ puts "\033[01;34m>>>> config_output: #{config_output.inspect}\e[m"
73
+ match = config_output.match(/--prefix=([\S]+)/)
74
+ unless match && match.size == 2
75
+ abort "Unable to determine the nginx prefix root from the output of `#{nginx} -V`."
76
+ end
77
+ prefix = match[1]
78
+
79
+ routes.each do |pattern, target|
80
+ puts "Proxying `#{pattern}` to #{target}".green
81
+ end
82
+
83
+ template = ERB.new <<-EOS.dedent
84
+ # Template for nginx config
85
+ # Run in the foreground with no supervisor
86
+
87
+ daemon off;
88
+ master_process off;
89
+ worker_processes 1;
90
+ error_log stderr warn;
91
+ pid <%= pid_file %>
92
+ ;
93
+
94
+ events {
95
+ worker_connections 768;
96
+ }
97
+
98
+ http {
99
+ # Basic Settings copied from the default ubuntu nginx.conf
100
+ sendfile on;
101
+ tcp_nopush on;
102
+ tcp_nodelay on;
103
+ keepalive_timeout 65;
104
+ types_hash_max_size 2048;
105
+
106
+ include <%= prefix %>/mime.types;
107
+
108
+ default_type application/octet-stream;
109
+
110
+ # Write access logs. Obviously, this is slow.
111
+ access_log /dev/stdout;
112
+
113
+ gzip on;
114
+
115
+ proxy_temp_path <%= prefix_dir %>;
116
+ server {
117
+ listen <%= options[:port] %>;
118
+ server_name localhost;
119
+
120
+ <% routes.each do |pattern, target| %>
121
+ location <%= pattern %> {
122
+ proxy_pass <%= target %>;
123
+ }
124
+ <% end %>
125
+ }
126
+ }
127
+ EOS
128
+
129
+ prefix_dir = "/tmp/ez-nginx-#{SecureRandom.hex}/"
130
+ FileUtils.mkdir(prefix_dir)
131
+ pid_file = File.join(prefix_dir, "ez-nginx.pid")
132
+ config_file = File.join(prefix_dir, "ez-nginx.conf")
133
+
134
+ config_file_contents = template.result(binding)
135
+ File.open(config_file, "w") { |f| f.write(config_file_contents) }
136
+
137
+ pid = Process.spawn("#{nginx} -p #{prefix_dir} -c ez-nginx.conf")
138
+ trap("SIGINT") { FileUtils.rm_rf(prefix_dir) }
139
+ Process.wait(pid)
140
+ # Clean up
141
+ FileUtils.rm_rf(prefix_dir)
@@ -0,0 +1,4 @@
1
+ [
2
+ ["/foo/bar", "http://localhost:1234"],
3
+ ["/", "http://localhost:5678"]
4
+ ]
@@ -0,0 +1,20 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path('../lib/ez-nginx-proxy/version', __FILE__)
3
+
4
+ Gem::Specification.new do |gem|
5
+ gem.authors = ["Caleb Spare"]
6
+ gem.email = ["cespare@gmail.com"]
7
+ gem.description = %q{A very simple-to-use nginx wrapper for reverse proxying}
8
+ gem.summary = %q{A very simple-to-use nginx wrapper for reverse proxying}
9
+ gem.homepage = ""
10
+
11
+ gem.files = `git ls-files`.split($\)
12
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
13
+ gem.name = "ez-nginx-proxy"
14
+ gem.require_paths = ["lib"]
15
+ gem.version = EzNginxProxy::VERSION
16
+
17
+ gem.add_dependency "trollop"
18
+ gem.add_dependency "colorize"
19
+ gem.add_dependency "dedent"
20
+ end
@@ -0,0 +1,3 @@
1
+ module EzNginxProxy
2
+ VERSION = "0.0.1"
3
+ end
metadata ADDED
@@ -0,0 +1,89 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ez-nginx-proxy
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Caleb Spare
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-07-25 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: trollop
16
+ requirement: &24225920 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *24225920
25
+ - !ruby/object:Gem::Dependency
26
+ name: colorize
27
+ requirement: &24273800 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: *24273800
36
+ - !ruby/object:Gem::Dependency
37
+ name: dedent
38
+ requirement: &24273380 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ type: :runtime
45
+ prerelease: false
46
+ version_requirements: *24273380
47
+ description: A very simple-to-use nginx wrapper for reverse proxying
48
+ email:
49
+ - cespare@gmail.com
50
+ executables:
51
+ - ez-nginx-proxy
52
+ extensions: []
53
+ extra_rdoc_files: []
54
+ files:
55
+ - .gitignore
56
+ - Gemfile
57
+ - LICENSE
58
+ - README.md
59
+ - Rakefile
60
+ - bin/ez-nginx-proxy
61
+ - example_config.rb
62
+ - ez-nginx-proxy.gemspec
63
+ - lib/ez-nginx-proxy/version.rb
64
+ homepage: ''
65
+ licenses: []
66
+ post_install_message:
67
+ rdoc_options: []
68
+ require_paths:
69
+ - lib
70
+ required_ruby_version: !ruby/object:Gem::Requirement
71
+ none: false
72
+ requirements:
73
+ - - ! '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ required_rubygems_version: !ruby/object:Gem::Requirement
77
+ none: false
78
+ requirements:
79
+ - - ! '>='
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ requirements: []
83
+ rubyforge_project:
84
+ rubygems_version: 1.8.10
85
+ signing_key:
86
+ specification_version: 3
87
+ summary: A very simple-to-use nginx wrapper for reverse proxying
88
+ test_files: []
89
+ has_rdoc: