Originally posted by atomsymbol
So firstly, you come up with some mapping scheme. Here's one example. Let's say the 1st part of the URI will be something for your proxy to consume and act on, and that by convention, it will start wtih a 'p_' ( which I'll nominate as meaning 'proxy hint' ). The next part will be a port offset ... and let's say the backend port numbers start at 10000. So, for example:
p_100 will mean "proxy this request to port 10100 ( ie 10000 - our base port, plus 100, which is our offset ).
p_200 will mean "proxy this request to port 10100 ( ie 10000 - our base port, plus 200, which is our offset ).
---
So http://100.100.100.100:80/index.html you'd expose externally as:
http://100.100.100.100:80/p_100/index.html
... and the service which used to listen on 100.100.100.100:80 would be running on 100.100.100.100:10100
Another way of expressing this is:
/p_100 ==> 127.0.0.1:10100, or:
/p_100 ==> 100.100.100.100:10100
Then http://200.200.200.200:80/index.html you'd expose externally as:
http://100.100.100.100:80/p_200/index.html
... and the service which used to listen on 200.200.200.200:80 would be running on 100.100.100.100:10200
Another way of expressing this is:
/p_200 ==> 127.0.0.1:10200, or:
/p_200 ==> 100.100.100.100:10200
---
The proxy could modify the URI on the way through ( eg strip out the proxy hint ... which you might do in a regular expression ... eg:
s/\/p_[\d]*\//
This would mean that the backend services wouldn't have to be altered to know about the leading proxy hint in the incoming requests.
---
This is but 1 mapping scheme. You can come up with your own. I used numbers in the mapping scheme because it makes it pretty explicit what's happening. Other people use more descriptive mapping URI components, like:
/auth ==> 10100
/products ==> 10101
/users ==> 10102
... etc.
You obviously need to regenerate all your URLs. There is no way to switch to using a single IP without regenerating your URLs. But the end result is much more flexible, and frankly, it's the way everybody does it. When your site becomes busy enough to warrant expanding onto >1 server ( say your products service is getting hammered ), then you just deploy the service on another host, and update your proxy rules to know about the new location to map to ... ie you don't need to rewrite any end-user-facing URLs to make backend changes.
There are lots of proxies. nginx is popular, fast, often used for this kind of thing, and does https termination. haproxy would be another option.
Comment