У меня есть сервер на котором запущен 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 сервиса
тут.