Почему возникает ошибка 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 шт):
У вас получается бесконечное проксирование:
- приходит запрос на location /redblue сервера mymain.ddns.net
- запрос проксируется на один из серверов bluepic.ddns.net или redpic.ddns.net ввключенных в upstream backend
- и опять в location /redblue идет проксирование на backend
далее по кругу ...
Вот с логами так стало понятнее.
В блоке 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;
...
}