使用 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 日志。