Apollo graphql和Nginx的空响应
我们的应用程序通过Apollo、Express和Nest.js公开了一个graphql API。在prod/staging环境中,应用程序部署在Nginx入口(kubernetes)后面。该API在生产环境中运行良好,并具有Apollo graphql和Nginx的空响应,nginx,graphql,reverse-proxy,apollo-server,Nginx,Graphql,Reverse Proxy,Apollo Server,我们的应用程序通过Apollo、Express和Nest.js公开了一个graphql API。在prod/staging环境中,应用程序部署在Nginx入口(kubernetes)后面。该API在生产环境中运行良好,并具有kubectl端口转发功能。但是,当我们尝试使用Nginx背后的API时,当响应负载高于大约1kb时,HTTP响应将挂起(TCP超时)。我们得出了一些结论: 应用程序工作正常(我们从日志中看到它返回了正确的响应) 我们试图增加Nginx代理缓冲区的大小,但没有成功 我们尝试
kubectl端口转发功能
。但是,当我们尝试使用Nginx背后的API时,当响应负载高于大约1kb时,HTTP响应将挂起(TCP超时)。我们得出了一些结论:
- 应用程序工作正常(我们从日志中看到它返回了正确的响应)李>
- 我们试图增加Nginx代理缓冲区的大小,但没有成功李>
- 我们尝试在一个普通的REST端点上返回相同的负载(没有graphql,只有Nest.js控制器),结果成功了李>
$ 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
$curl-v--位置--请求发布'https://my-company.com/graphql'--header'内容类型:application/json'--data raw'{“query”:“query{\n myQueryHere\n}”,“variables”:{}
注意:不必要地使用-X或--request,POST已经推断出来。
*努力。。。
*TCP_节点集
*已连接到我的公司(此处为我的ip)端口443(#0)
*阿尔卑斯山,提供h2
*ALPN,提供http/1.1
*已成功设置证书验证位置:
*CAfile:/etc/ssl/certs/ca-certificates.crt
CApath:/etc/ssl/certs
*(304)(OUT)、TLS握手、客户端问候(1):
*(304)(IN)、TLS握手、服务器hello(2):
*TLSv1.2(IN),TLS握手,证书(11):
*TLSv1.2(IN)、TLS握手、服务器密钥交换(12):
*TLSv1.2(IN),TLS握手,服务器完成(14):
*TLSv1.2(输出)、TLS握手、客户端密钥交换(16):
*TLSv1.2(OUT),TLS更改密码,客户端hello(1):
*TLSv1.2(输出),TLS握手,完成(20):
*TLSv1.2(IN),TLS握手,完成(20):
*使用TLSv1.2/ECDHE-RSA-AES128-GCM-SHA256的SSL连接
*ALPN,服务器不同意协议
*服务器证书:
*主题:CN=*.mycompany.com
*开始日期:格林威治时间2019年12月4日00:00:00
*过期日期:1月4日12:00:00 2021 GMT
*主题名称:主机“我的公司”匹配证书“*.my company”
*发行人:C=美国;O=亚马逊;OU=服务器CA 1B;CN=亚马逊
*SSL证书验证正常。
>POST/graphql HTTP/1.1
>主持人:我的公司
>用户代理:curl/7.58.0
>接受:*/*
>内容类型:application/json
>内容长度:159
>
*上传已完全发送:159字节中的159字节
*TLSv1.2(IN)、TLS警报、客户端你好(1):
*来自服务器的空回复
*与我的公司主机的连接#0保持不变
curl:(52)来自服务器的空回复
您是否检查了nginx日志中的潜在错误?是的!日志中没有任何错误,只有访问条目。您可以共享您的ingress.yaml文件吗?您是否检查了nginx日志中的潜在错误?是的!日志中没有错误,只有访问条目。您可以共享您的ingress.yaml文件吗?