我编写了一个使用 TCP 双向传输数据的 API。在我的本地设置中,它运行良好。但是当我转到生产环境时,它从未到达端点。
生产服务器使用 ELB 对 EC2 实例进行负载平衡,并且全部由 cloud flare 负责。
一开始,我甚至看不到它命中了 NGINX 日志,所以我绕过 CloudFlare 并直接命中 EC2 IP 地址。这确实导致尝试显示在访问日志中,但它们都立即像这样 499。
[16/Sep/2024:03:13:50 +0000] “POST /api/user_sync HTTP/1.1” 499 0 “-” “MYAPP/1.0.6 CFNetwork/1494.0.7 Darwin/23.6.0”
499 似乎表示客户端中止了连接,但我可以在应用程序中看到,直到客户端超时,与服务器的连接才会关闭。但 499 会立即出现在 NGINX 访问日志中。所以就像它立即将其关闭一样。
不幸的是,我对 NGINX、负载平衡或网站没有太多经验,因此任何帮助都将不胜感激。
我确实发现一些帖子中其他用户也遇到了类似的问题,但对于他们来说,499 要么在每次 API 调用时发生,要么在很长一段时间后发生。然而,这种情况每次都会发生,并且只发生在这个特定的端点上。
还有谁发现了这个帖子!
ELB 和 NGINX 都搞砸了。ELB 会等到一定量的数据发送到流上后再将其丢弃。但这对我们来说不起作用,因为初始协议有效负载非常小(例如 100 个字符)。
因此我们就解决这个问题了。
NGINX 显然不喜欢 chunked-transfer-encoding(我认为这是有问题的),所以我们最终也绕过了它。
由于此 API 不可缓存,我们最终也绕过了 varnish。
这一切都涉及到诸如设置新的安全组之类的事情,当调用非主 URL 的特定 URL 时,该安全组会转发到正确的端口(例如 purchase.ebay.com 而不是www.ebay.com)
再次,请原谅我使用非技术术语,因为我真的不是一个网络人,哈哈