@Anrek

Как пофиксить ошибку 502 Bad Gateway в nginx?

У меня есть сервер на котором запущен docker-compose. В docker-compose 2 сервиса: nginx (как обратный прокси) и back (как апи, который обрабатывает 2 запроса). Кроме этого есть БД, которая расположена не на сервере, а отдельно (база данных как услуга).

Запросы, которые обрабатывает back:
1) get('/api') - сервис back просто отвечает на него "АПИ работает"
2) get('/db') - сервис bаck отправляет простой запрос на внешнюю БД ('SELECT random() as random, current_database() as db')

запрос 1 - работает отлично, запрос 2 - сервис back падает, nginx продолжает работать и в консоль выходит ошибка 502 Bad Gateway.
  • В Logs сервиса nginx выходит ошибка: upstream prematurely closed connection while reading response header from upstream.
  • В Logs сервиса back: connection terminated due to connection timeout.


Что я пробовал:
1) увеличить число ядер и RAM (сейчас 2 ядра и 4 Гб Ram);
2) добавлять/убирать/изменять параметры proxy_read_timeout, proxy_send_timeout и proxy_connect_timeout;
3) тестировать запрос www.test.com/db через postman и curl (падает с той же ошибкой);
4) запускать код на своей локальной машине без контейнера и compose и подключаться к той же бд по тому же pool по тому же ip (все ок, оба запроса работают и присылают что нужно);
5) изменять параметр worker_processes (тестировал со значением 1 и auto);
6) добавлять/удалять атрибут proxy_set_header Host $http_host, заменять $http_host на "www.test.com".

Вопрос:
Что еще можно попробовать сделать чтобы пофиксить ошибку и запрос к db заработал?

nginx.conf

worker_processes  1;
events {
  worker_connections  1024;
}    
http{
  upstream back-stream {
    server back:8080;
  }
  server {
    listen 80;
    listen [::]:80;
    server_name test.com www.test.com;
    location / {
      root   /usr/share/nginx/html;
      resolver 121.0.0.11;
      proxy_pass http://back-stream;
    }
  }
}


docker-compose.yml

version: '3.9'
services:
  nginx-proxy:
    image: nginx:stable-alpine
    container_name: nginx-proxy
    ports:
      - 80:80
      - 443:443
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
    networks:
       - network
  back:
    image: "mycustomimage"
    container_name: back
    restart: unless-stopped
    ports:
      - '81:8080'
    networks:
       - network
networks:
  network:
    driver: bridge


Создание pool к базе данных (type script)

const pool = createPool(`postgres://user:passwor@publicIp:6432/staging?sslmode=disable`, {
  statementTimeout: 'DISABLE_TIMEOUT',
  idleInTransactionSessionTimeout: 'DISABLE_TIMEOUT'
}); //  statementTimeout и  idleInTransactionSessionTimeout равны DISABLE потому что если
 не ставить эти маркеры выходят ошибки от кластера БД<i> unsupported startup parameter: 
statement_timeout</i> и <i>unsupported startup parameter: idleInTransactionSessionTimeout</i>
 - это тестировалось не в контенейре на сервере, там до этого этапа не доходит.

async function exec(q) {
  await pool.query(q);
}



Код back сервиса тут.
  • Вопрос задан
  • 3181 просмотр
Решения вопроса 1
@Anrek Автор вопроса
Ошибка была такая: забыл добавить в кластере базы данных ip моего сервера в список разрешенных адресов.

решал проблему в такой последовательности:
1) поставил обработчик ошибки в коде контейнера back: ошибка 502 ушла, ошибка в nginx также ушла, осталась ошибка подключения в back.
2) зашел в работающий контейнер back, установил базу данных(apt update и apt install postgresql postgresql-contrib), попытался подключиться через него к бд не через код а строкой psql -h host -p port -U user -W , не подключилось, вышла ошибка "Connection refused. Is the server running on host "10.0.0.101" and accepting
TCP/IP connections on port 5432?"
3) тут прочитал что это проблема или с файрфолом или со списком разрешенных адресов у бд
4) зашел в список разрешенных адресов, исправил опечатку в ip, подключение заработало.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Akela_wolf
Extreme Programmer
Ну, очевидно, проблема именно в том что back падает. Нужно исправить, чтобы не падал.
А почему и как именно он падает - надо смотреть в его логи, вы про этот сервис рассказали ровным счетом ничего.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы