7

使用 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 <DD5FDD4A-1BE0-41ED-AAC4-9EB07F61F109>.<7> HTTP load failed (error code: -1005 [1:54])
2019-06-27 11:26:23.040408-0400 myapp[23700:1527305] Task <DD5FDD4A-1BE0-41ED-AAC4-9EB07F61F109>.<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=<CFData 0x28161ab70 [0x1e9e5d420]>{length = 16, capacity = 16, bytes = 0x100201bb3416ca8a0000000000000000}, _kCFStreamErrorCodeKey=54, _kCFStreamErrorDomainKey=1}}, _NSURLErrorFailingURLSessionTaskErrorKey=LocalDataTask <DD5FDD4A-1BE0-41ED-AAC4-9EB07F61F109>.<7>, _NSURLErrorRelatedURLSessionTaskErrorKey=(
    "LocalDataTask <DD5FDD4A-1BE0-41ED-AAC4-9EB07F61F109>.<7>"
), NSLocalizedDescription=The network connection was lost.

对此特定 [ELB] -> [Nginx 容器] -> [服务容器] 设置的查询偶尔会起作用,但随后会停止。它几乎表明像这个问题这样的保活情况。我们将 ELB 空闲超时设置为默认值(60 秒),然后将其增加到 300 秒,但没有明显影响。我们尝试将 Nginx 的 keep-alive 设置为 360s 和 0s(完全禁用)。

对于有问题的域,我们在 Kubernetes 集群中托管了多种服务,例如 Java 和 Node.js。这个问题同样影响到他们所有人。

没有 Android 应用程序用户报告此问题。

遇到此问题的设备都始终如此,它不是间歇性的。

由于错误类型,请求永远不会到达我们的 Nginx 日志。

4

1 回答 1

5

不幸的是,我们从未找到问题的明确答案,但我们确实实施了一种解决方法。

蜂窝网络上的某些 iOS 12.3.1 iPhone 似乎存在一个问题,即亚马逊的 ELB Classic 总是发送“连接:保持活动”响应标头。您可以更改负载均衡器的空闲超时,但不能将其设置为 0(最小值为 1 秒)。我们可以通过使用由create-react-app. 请求总是首先工作,然后开始持续失败。

我们通过从 ELB 切换到网络负载均衡器 (AWS NLB) 解决了这个问题。NLB 直接与 Nginx 入口控制器对话。由于它在 TCP 级别,因此 NLB 层不会更改标头。默认的 Nginx 控制器根本不发送“连接”响应头。使用这个新设置,iOS 应用程序可以在所有设备上正常运行。

于 2019-07-03T19:31:47.533 回答