client -> nginx (:443) -> app1 (:8080) -> POST http://remote/api/clients -> nginx2 -> app2
nginx, nginx2 - обычный nginx :-)
remote - либо 127.0.0.1 либо второй сервер удаленный
app1 - это node веб сервер на express
app2 - C++ приложение, в котором есть http сервер
В самом axios установлен timeout 5000. и он иногда срабатывает и клиенту отдается ошибка со стороны app1. Отчего срабатывает timeout не понятно. nginx2 в логах nginx регистрирует ответ от app2 с нормальным статусом (201), время запроса ~5 сек. и отдает app1 (но он уже отключился? по timeout). Ошибок нет от nginx. Если сокет отключился, куда передает nginx ответ? Или axios сокет не убивает, а только timeout генерирует? Пробовал дебажить, видно что timeout генерирует сам node socket, глубже не копал. И отчего может быть этот timeout? nginx2 получает ответ от app2 почти моментально, сверял логи, до секунды. Такое ощущение, что когда запрос на nginx2 приходит, он его в каком то буфере держит 5 сек., а потом отправляет на app2 и поэтому timeout. Что может быть?
Смотрел только
netstat -nlp4 | grep app2
на предмет Recv-Q - очередь на сокет не растет (я каждую сек. дрочил консоль, это нормально?), то есть app2 успевает все запросы обрабатывать. В самом nginx \ kernel ошибок нет (логов)
Сначала думал может запрос передается медленно, в nginx установил допом
client_body_timeout 3;
reset_timedout_connection on;
send_timeout 3;
Но тогда ngix отдавал бы с 408 статусом и axios от бы раньше отваливался, но постоянно ошибка timeout 5000.
Связка nginx2 -> app2.
map $http_authorization $api_dev_deny {
default "1";
"9342759823475947238979" "0";
}
server {
server_name exampla.com;
access_log /var/log/nginx/exampla.com.log main;
error_log /var/log/nginx/exampla.com.error.log;
listen 80;
listen 443 ssl; # managed by Certbot
location ~ ^/api/(.*)$ {
if ($api_dev_deny) {
return 401;
}
proxy_pass http://127.0.0.1:1986/$2$is_args$args;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
}
}