Наше приложение предоставляет API-интерфейс graphql через Apollo, Express и Nest. js. В среде prod / staging приложение развертывается за входом Nginx (kubernetes). API отлично работает в производственной среде и с kubectl port-forward
. Но когда мы пытаемся использовать API, стоящий за Nginx, ответ HTTP зависает (время ожидания TCP), когда полезная нагрузка ответа превышает примерно 1 КБ. Вот некоторые выводы, которые у нас есть:
- Приложение работает правильно (по журналам видно, что оно возвращает правильный ответ);
- Мы пытались увеличить Nginx прокси-буфер -size, без успеха;
- Мы пытались вернуть ту же полезную нагрузку на обычную конечную точку REST (без graphql, просто контроллер Nest. js), и это сработало!
Итак Похоже, это проблема, связанная с интеграцией Nginx в качестве прокси-сервера и сервера Apollo. У кого-нибудь есть мысли по этому поводу?
Вот пример запроса скручивания, который вызывает проблему:
$ curl -v --location --request POST 'https://my-company.com/graphql' --header 'Content-Type: application/json' --data-raw '{"query":"query {\n myQueryHere \n}","variables":{}}'
Note: Unnecessary use of -X or --request, POST is already inferred.
* Trying <my-ip-here>...
* TCP_NODELAY set
* Connected to my-company (my-ip-here) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
* CAfile: /etc/ssl/certs/ca-certificates.crt
CApath: /etc/ssl/certs
* (304) (OUT), TLS handshake, Client hello (1):
* (304) (IN), TLS handshake, Server hello (2):
* TLSv1.2 (IN), TLS handshake, Certificate (11):
* TLSv1.2 (IN), TLS handshake, Server key exchange (12):
* TLSv1.2 (IN), TLS handshake, Server finished (14):
* TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
* TLSv1.2 (OUT), TLS change cipher, Client hello (1):
* TLSv1.2 (OUT), TLS handshake, Finished (20):
* TLSv1.2 (IN), TLS handshake, Finished (20):
* SSL connection using TLSv1.2 / ECDHE-RSA-AES128-GCM-SHA256
* ALPN, server did not agree to a protocol
* Server certificate:
* subject: CN=*.mycompany.com
* start date: Dec 4 00:00:00 2019 GMT
* expire date: Jan 4 12:00:00 2021 GMT
* subjectAltName: host "my-company" matched cert's "*.my-company"
* issuer: C=US; O=Amazon; OU=Server CA 1B; CN=Amazon
* SSL certificate verify ok.
> POST /graphql HTTP/1.1
> Host: my-company
> User-Agent: curl/7.58.0
> Accept: */*
> Content-Type: application/json
> Content-Length: 159
>
* upload completely sent off: 159 out of 159 bytes
* TLSv1.2 (IN), TLS alert, Client hello (1):
* Empty reply from server
* Connection #0 to host my-company left intact
curl: (52) Empty reply from server