作者:9位特权QQ号码连号 | 来源:互联网 | 2022-10-23 11:27
使用React Native应用程序(仅测试了使用生成的应用程序create-react-app
),一些iPhone用户遇到了一个问题,即当通过蜂窝数据连接时,该应用程序几乎永远无法向我们的API发出Web请求。出现问题的域指向Amazon Elastic Load Balancer(第7层,SSL终止),后者指向Nginx反向代理(位于EKS Kubernetes集群内部)。该应用程序调用的其他API(例如Mapbox)可以在蜂窝数据上正常工作,包括在专用服务器上托管的其中一种。唯一不起作用的请求是我们ELB域上的请求。当用户切换到WiFi时,我们的应用是能够向该域发出Web请求。在均运行iOS 12.3.1的iPhone 7,iPhone 8和iPhone X上已经观察到这种情况。一种设备是Verizon,其他5种是AT&T。每个API调用都是HTTPS。删除并重新安装应用程序并重新启动设备不能解决问题。我们在所有情况下都确认了在Settings > Cellular > [App name]
和中为该应用程序启用了蜂窝数据Settings > [App name] > Use Cellular Data
。
该应用程序是使用React Native构建的,Web请求是通过cross-fetch
库执行的。
我们能够找到有问题的设备并通过Xcode运行它。这是Xcode中捕获的错误堆栈的子集:
nw_connection_copy_connected_local_endpoint [C12] Connection has no local endpoint
2019-06-27 11:26:16.841347-0400 myapp[23700:1527268] [BoringSSL]
nw_protocol_boringssl_get_output_frames(1301) [C10.1:2][0x117d5a050] get output frames failed, state 8196
2019-06-27 11:26:22.465855-0400 myapp[23700:1527305] [BoringSSL] nw_protocol_boringssl_error(1584) [C20.1:2][0x119b0e420] Lower protocol stack error: 54
2019-06-27 11:26:22.466665-0400 myapp[23700:1527305] TIC TCP Conn Failed [20:0x280022400]: 1:54 Err(54)
2019-06-27 11:26:23.040101-0400 myapp[23700:1527399] Task .<7> HTTP load failed (error code: -1005 [1:54])
2019-06-27 11:26:23.040408-0400 myapp[23700:1527305] Task .<7> finished with error - code: -1005
load failed with error Error Domain=NSURLErrorDomain Code=-1005 "The network connection was lost." UserInfo={_kCFStreamErrorCodeKey=54, NSUnderlyingError=0x283a521f0 {Error Domain=kCFErrorDomainCFNetwork Code=-1005 "(null)" UserInfo={NSErrorPeerAddressKey={length = 16, capacity = 16, bytes = 0x100201bb3416ca8a0000000000000000}, _kCFStreamErrorCodeKey=54, _kCFStreamErrorDomainKey=1}}, _NSURLErrorFailingURLSessiOnTaskErrorKey=LocalDataTask .<7>, _NSURLErrorRelatedURLSessiOnTaskErrorKey=(
"LocalDataTask .<7>"
), NSLocalizedDescription=The network connection was lost.
对此特定[ELB]-> [Nginx容器]-> [Service容器]设置的查询有时会起作用,但随后会停止。它几乎表明了这种问题的持续发展态势。我们将ELB空闲超时设置为默认值(60s),并将其增加到300s,但没有明显影响。我们尝试将Nginx的keep-alive设置为360s和0s(完全禁用)。
对于有问题的域,我们在Kubernetes集群中托管了多种服务,例如Java和Node.js。这个问题对所有人都有同等的影响。
没有任何Android应用程序用户报告此问题。
遇到此问题的设备都始终如此,这不是间歇性的。
由于错误的类型,请求永远不会到达我们的Nginx日志。
1> jowo..:
不幸的是,我们从未找到解决该问题的明确答案,但是我们确实实现了解决方法。
蜂窝网络上的某些iOS 12.3.1 iPhone似乎存在一个问题,即亚马逊的ELB Classic总是发送“ Connection:keep-alive”响应标头。您可以更改负载均衡器的空闲超时,但不能将其设置为0(最小为1秒)。我们可以通过使用生成的新应用来重现iOS连接错误create-react-app
。请求始终总是首先工作,然后开始始终失败。
我们通过从ELB切换到网络负载平衡器(AWS NLB)来解决此问题。NLB直接与Nginx入口控制器对话。由于它位于TCP级别,因此NLB层不会更改标头。默认的Nginx控制器根本不发送“连接”响应头。使用此新设置,iOS应用程序可在所有设备上正常运行。