In the cloud era we need smart proxies.
- Highly configurable
- Provides a RESTful interface to add and remove workers, SSL domains, etc.
- Easy to extend.
- Write plugins in Javascript!
- Everything is a plugin internally
- Fast (NodeJS is neat handling lots of I/O)
- Efficient uploads
- The proxy buffer to disk a file upload
- When it's ready it forwards to the worker
- The Proxy deal much better with slow connections
- Throttle connections to workers (by default 20 per worker)
- SSL support
- URL sanitization
//foobar///
will be rewrite to/foobar
before forwarding the app
- The workers are in control of everything:
- Rewrite hostname
- Rewrite URL
- Expose URL (with regular expressions) they can work
- If a worker can serve
^/(foo|bar)/.+
, any other request will generate a404 Error page
in the proxy itself.
- If a worker can serve
- They can choose which plugins to use (Global plugins may apply any ways)
- Proxy: It's a webserver which is in the between a client and an application
- Worker: It's a webserver, where our application is hosted.
Having a proxy makes really easy to scale up or down our applications in a matter of seconds. UberProxy
makes it possible to add and remove more workers to your application.
npm install -g uberproxy
To create a new configuration you need to run the following command
# Create a secret token
uberproxy setup
That will generate a config.yml
(you can override that with -c config.json
) that would look like this:
ssl:
port: 443
certs: /var/tmp/uberproxy/https-certs
dynamic: /var/tmp/uberproxy/dynamic.yml
cluster: 4
port: 80
secret: 8e0c5e97f91e1a8dde85702ffadff48e8488fda46c457712920aa835dabe25c8
In order to run the server you should execute this command:
uberproxy server [-c config.yml]
- ssl
- port: What port should the Https-Proxy listen to?
- certs: What directory should be used to store the certs files?
- dynamic: A file (
YAML
orJSON
) where the dynamic configurations are stored. - cluster: How many workers should it use? Ideally it should the same number of CPUs available on the erver
- port: What port should the Http-proxy listen to?
- secret: A secret token used for the dynamic configuration
node index.js
You may need it to run as sudo
, by default it tries to open 80 and 443 (port which usually requires super user permissions).
Then open https://127.0.0.1/
. You would see a Not Found
page, that is because the proxy doesn't have any worker configured yet.
To add a plugin you can see the PHP Client, just make sure the secrets are the same.
It's also possible to define a worker on the config file. If you're using YAML
it would look like this:
workers:
-
client: 'localhost:3333'
hostname:
- domain2.foobar.net
maxreq: 20
That's it, all requests for domain2.foobar.net
will be forwarded to localhost:333
.
- More documentation
- Config to register apps
- Protocol
- More examples on plugins
- Cache plugins
- ZLib