Welcome! Log In Create A New Profile

Advanced

nginx отправляет запрос, уже получив [FIN, ACK]

March 09, 2024 09:03AM
Здравстуйте all!

Есть приложение на phoenixframework.org, вот с таким ендпоинтом для АПИ


```
location /phoenix/ {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-Request-Start "t=${msec}";
proxy_redirect off;
proxy_http_version 1.1;
proxy_set_header Connection "";

proxy_pass http://phoenix-api/;
}
```

Апстрим секция выглядит вот так

```
upstream phoenix-api {
server {{phoenix_app_address}}:4000;
keepalive 10;
}
```

Иногда вижу вот такие сообщения в логе

```
2024/02/22 14:23:36 [error] 341740#341740: *13086934 upstream prematurely closed connection while reading response header from upstream, client: nn.nn.nn.nn, server: online.example.com, request: "GET /phoenix/public-api/stream_delay?time=1708611802382 HTTP/1.1", upstream: "http://phoenix_ip:4000/public-api/stream_delay?time=1708611802382", host: "online.exanple.com", referrer: "https://online.example.com/watch/E-619vnkQG7R2n2k8XF8CKBrHd7Ger96xNW8uiW5CMEIJACdlUcVno3Py8JWqYm6uh/"
```


В WireShark вижу:
```
No. Time Source SourceP Destination DstPort Protocol Length Info
82705 2024-02-22 14:22:36.769628 nginx 32788 phoenix 4000 HTTP 1992 GET /public-api/stream_delay?time=1708611688342 HTTP/1.1
82707 2024-02-22 14:22:36.769779 phoenix 4000 nginx 32788 TCP 54 4000 → 32788 [ACK] Seq=138001 Ack=403282 Win=10130 Len=0
82757 2024-02-22 14:22:36.771669 phoenix 4000 nginx 32788 HTTP/JSON 293 HTTP/1.1 200 OK , JSON (application/json)
82763 2024-02-22 14:22:36.771773 nginx 32788 phoenix 4000 TCP 54 32788 → 4000 [ACK] Seq=403282 Ack=138240 Win=3487 Len=0
98576 2024-02-22 14:23:36.770861 phoenix 4000 nginx 32788 TCP 54 4000 → 32788 [FIN, ACK] Seq=138240 Ack=403282 Win=10138 Len=0
98627 2024-02-22 14:23:36.790005 nginx 32788 phoenix 4000 HTTP 2060 GET /public-api/stream_delay?time=1708611802382 HTTP/1.1
98660 2024-02-22 14:23:36.790732 phoenix 4000 nginx 32788 TCP 54 4000 → 32788 [ACK] Seq=138241 Ack=405288 Win=10132 Len=0
98735 2024-02-22 14:23:36.792096 nginx 32788 phoenix 4000 TCP 54 32788 → 4000 [FIN, ACK] Seq=405288 Ack=138241 Win=3487 Len=0
98737 2024-02-22 14:23:36.792104 phoenix 4000 nginx 32788 TCP 54 4000 → 32788 [ACK] Seq=138241 Ack=405289 Win=10138 Len=0
```

Если я правильно понимаю, phoenix app (port 4000) попросил закрыть соединение [FIN, ACK] (No.98576) , но nginx отправил еще один запрос (No. 98627) и потом тоже закрыл соединение [FIN, ACK] (No. 98735).

Закрывает коннект по числу запросов (дефолтное значение у них у обоих 1000, и феникс просто делает это первым).

Правильно ли я понимаю, что Nginx отправил пакет номер 98627 еще не зная про то, что феникс закрывает соединение?
Как правильно починить это?
Другими словами, кто неправ в данном случае?
Или все стороны все сделали правильно?
Subject Author Posted

nginx отправляет запрос, уже получив [FIN, ACK]

VictorIvanov March 09, 2024 09:03AM

Re: nginx отправляет запрос, уже получив [FIN, ACK]

anatoliy.melnik@showjet.ru March 12, 2024 03:28PM



Sorry, only registered users may post in this forum.

Click here to login

Online Users

Guests: 221
Record Number of Users: 8 on April 13, 2023
Record Number of Guests: 421 on December 02, 2018
Powered by nginx      Powered by FreeBSD      PHP Powered      Powered by MariaDB      ipv6 ready