Почему возникает ошибка 502?

Конфиг выглядит вот так:

upstream backend {
    server redpic.ddns.net:80;
    server bluepic.ddns.net:80;
}
server {
        server_name mymain.ddns.net;
        listen 80;
        root /usr/share/nginx/html;
        index index.html;
        access_log /var/log/nginx/proxy.log;
        location / {
            try_files $uri $uri/ =404;
        }
        location /google {
            proxy_pass https://www.google.com/;
        }
        location /redblue {
            proxy_set_header HOST $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass http://backend;
        }
}
server {
    server_name redpic.ddns.net;
    listen 80;
    index red.jpeg;
    root /usr/share/nginx/red;
    access_log /var/log/nginx/proxy.log;
    location / {
            try_files $uri $uri/ =404;
    }
    location /redblue {
            proxy_set_header HOST $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass http://backend;
    }
}
server {
    server_name bluepic.ddns.net;
    listen 80;
    index blue.jpeg;
    root /usr/share/nginx/blue;
    access_log /var/log/nginx/proxy.log;
    location / {
            try_files $uri $uri/ =404;
    }
    location /redblue {
            proxy_set_header HOST $host;
            proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_pass http://backend;
        }
}

По сути должен проксировать с http://mymain.ddns.net/redblue на http://redpic.ddns.net/ или http://bluepic.ddns.net/ по очереди, но выдает ошибку 502. В чем может быть проблема?

Вот ошибки, которые записываются в error.log

2021/12/02 17:23:33 [error] 444#444: *19647 open() "/usr/share/nginx/html/phpmyadmin/index.php" failed (2: No such file or directory), client: 104.208.73.109, server: mymain.ddns.net, request: "GET /phpmyadmin/index.php HTTP/1.1", host: "3.70.22.183"
2021/12/02 17:23:33 [error] 444#444: *19647 open() "/usr/share/nginx/html/pmd/index.php" failed (2: No such file or directory), client: 104.208.73.109, server: mymain.ddns.net, request: "GET /pmd/index.php HTTP/1.1", host: "3.70.22.183"
2021/12/02 17:23:33 [error] 444#444: *19647 open() "/usr/share/nginx/html/phpmyadmin4.8.5/index.php" failed (2: No such file or directory), client: 104.208.73.109, server: mymain.ddns.net, request: "GET /phpmyadmin4.8.5/index.php HTTP/1.1", host: "3.70.22.183"
2021/12/02 17:47:54 [error] 444#444: *19648 open() "/usr/share/nginx/html/.env" failed (2: No such file or directory), client: 165.232.86.149, server: mymain.ddns.net, request: "GET /.env HTTP/1.1", host: "3.70.22.183"
2021/12/02 18:50:05 [alert] 444#444: 1024 worker_connections are not enough
2021/12/02 18:50:05 [error] 444#444: *20682 upstream prematurely closed connection while reading response header from upstream, client: 3.70.22.183, server: mymain.ddns.net, request: "HEAD /redblue/ HTTP/1.0", upstream: "http://3.70.22.183:80/redblue/", host: "mymain.ddns.net"
2021/12/02 18:58:17 [alert] 979#979: 1024 worker_connections are not enough
2021/12/02 18:58:17 [error] 979#979: *21706 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 3.70.22.183, server: mymain.ddns.net, request: "GET /redblue/ HTTP/1.0", upstream: "http://3.70.22.183:80/redblue/", host: "mymain.ddns.net"
2021/12/02 18:58:17 [alert] 979#979: 1024 worker_connections are not enough
2021/12/02 18:58:17 [error] 979#979: *21706 upstream prematurely closed connection while reading response header from upstream, client: 3.70.22.183, server: mymain.ddns.net, request: "GET /redblue/ HTTP/1.0", upstream: "http://3.70.22.183:80/redblue/", host: "mymain.ddns.net"

Ответы (2 шт):

Автор решения: Aleksey Vaganov

У вас получается бесконечное проксирование:

  1. приходит запрос на location /redblue сервера mymain.ddns.net
  2. запрос проксируется на один из серверов bluepic.ddns.net или redpic.ddns.net ввключенных в upstream backend
  3. и опять в location /redblue идет проксирование на backend

далее по кругу ...

→ Ссылка
Автор решения: Alexey Ten

Вот с логами так стало понятнее.

В блоке upstream nginx резолвит имена хостов в ip адреса и забывает имена. В результате ваш upstream идентичен вот такому

upstream backend {
    server 3.70.22.183:80;
    server 3.70.22.183:80;
}

Далее, когда вы пишите proxy_pass http://backend; nginx использует слово backend как заголовок Host. Получается что проксируете на эту же машину в сервер backend. Поскольку такой у вас не описан, то используется дефолтный сервер, который в вашем случае mymain.ddns.net и запрос зацикливается.

В качестве простого решения можно просто заменить или добавить upstream-ам другие порты. И вообще, если они всегда на той же машине, то обращаться к ним по localhost.

Примерно так:

upstream backend {
    server 127.0.0.1:9000;
    server 127.0.0.1:9001;
}

server {
    server_name redpic.ddns.net;
    listen 80;
    listen 127.0.0.1:9000;
    ...
}

server {
    server_name blue.ddns.net;
    listen 80;
    listen 127.0.0.1:9001;
    ...
}
→ Ссылка