Best way to handle dynamic upstream backend?
Maxim Dounin
mdounin at mdounin.ru
Sat Sep 22 14:15:41 UTC 2012
Hello!
On Fri, Sep 21, 2012 at 04:08:52PM +0200, Isaac Hailperin wrote:
> Hi,
>
> I use nginx as a reverse proxy in front of about 20 apaches. Now in
> my backend, currently defined as
>
> upstream backend_all {
> server 1.1.1.1;
> server 1.1.1.2;
> ...
> server 1.1.1.20;
> }
>
> i would like to include dynamic information about the health of the
> backend nodes.
> If a backend server is down, it should be marked as down
> automatically. Or if a server is specifically busy, it should get
> less used as a backend.
Normal nginx aproach is to mark backends down atomatically based
on max_fails/fail_timeout, see here for detail:
http://nginx.org/en/docs/http/ngx_http_upstream_module.html#server
It is proven to work well for handling server outages and gives
system administrators enough time to either revive dead
server or remove it from configuration.
To atomatically accomodate for unequal server load/speed (due to
external factors) I would recommend using least_conn balancer, see
here for details:
http://nginx.org/en/docs/http/ngx_http_upstream_module.html#least_conn
It should also help to better detect outages when requests start
taking a long time by routing less requests to a faulty server
before nginx will actually able to see timeouts.
> I could implement a scrip which checks the backend and then
> generates the upstream definition accordingly. I would then have to
> reload nginx. (Would that generate timeouts for my users? - reload
> takes a few (aprox 10) seconds as there are a lot of websites.).
Configuration reload is seamless - old worker processes continue
to serve clients while master process reads new configuration and
spawns new worker processes.
It consumes resources though, as it spawns additional set of
worker processes, and it takes some time for old workers to
shutdown as they have to serve requests which are already in
progress. Doing configuration reloads at high frequency might not
be a good idea, especially if there are long running requests.
Summing up the above - it's ok to do reloads as long as they are
initiated by hand and/or relatively rare, but you may need some
safeguards for automatic scripts to make sure they aren't run too
frequently.
> This seems not like the best solution to me, as I feel that nginx
> might have build in solution for this (?).
See above.
> Also I have not only one nginx server, but four, so think I need to
> take care that these four distribute evenly to the backend. For this
> I was thinking of ip_hash.
As long as each frontend distribute requests evenly to all backend
servers - resulting backend load should be equal. There is no
need for ip_hash.
Maxim Dounin
More information about the nginx
mailing list