7

I'm having trouble figuring out load balancing on Nginx. I'm using: - Ubuntu 16.04 and - Nginx 1.10.0.

In short, when I pass my ip address directly into "proxy_pass", the proxy works:

server {
    location / {
            proxy_pass http://01.02.03.04;
    }
}

When I visit my proxy computer, I can see the content from the proxy ip... but when I use an upstream directive, it doesn't:

upstream backend {
     server 01.02.03.04;
}

server {
    location / {
            proxy_pass http://backend;
    }
}

When I visit my proxy computer, I am greeted with the default Nginx server page and not the content from the upstream ip address.

Any further assistance would be appreciated. I've done a ton of research but can't figure out why "upstream" is not working. I don't get any errors. It just doesn't proxy.

Avery Smith
  • 131
  • 1
  • 1
  • 8

2 Answers2

4

Okay, looks like I found the answer...

two things about the backend servers, at least for the above scenario when using IP addressses:

  1. a port must be specified
  2. the port cannot be :80 (according to @karliwsn the port can be 80 it's just that the upstream servers cannot listen to the same port as the reverse proxy. I haven't tested it yet but it's good to note).

backend server block(s) should be configured as following:

server {

    # for your reverse_proxy, *do not* listen to port 80
    listen 8080;
    listen [::]:8080;

    server_name 01.02.03.04;

    # your other statements below
    ...
}

and your reverse proxy server block should be configured like below:

upstream backend {
    server 01.02.03.04:8080;
}

server {
    location / {
        proxy_pass http://backend;
     }
}

It looks as if a backend server is listening to :80, the reverse proxy server doesn't render it's content. I guess that makes sense, since the server is in fact using default port 80 for the general public.

Thanks @karliwson for nudging me to reconsider the port.

Avery Smith
  • 131
  • 1
  • 1
  • 8
  • 4
    Actually the port of the upstream can be 80, but it must listen on a different IP than the main IP address nginx is using. I usally make my backends listen on localhost, except when it's on a remote server. – karliwson Nov 14 '16 at 18:38
  • How to set username/password if upstream server needs it ? – MrSalesi Apr 01 '22 at 18:45
0

The following example works:

Only thing to mention is that, if the server IP is used as the "server_name", then the IP should be used to access the site, means in the browser you need to type the URL as http://yyy.yyy.yyy.yyy or (http://yyy.yyy.yyy.yyy:80), if you use the domain name as the "server_name", then access the proxy server using the domain name (e.g. http://www.yourdomain.com)

upstream backend {
        server xxx.xxx.xxx.xxx:8080;
}

server {
        listen 80;
        server_name yyy.yyy.yyy.yyy;

        location / {
                proxy_pass http://backend;
        }
}