我正在尝试将 nginx 配置为两个应用程序的反向代理:一个 Web 前端 (IIS) 和一个 .NET Core 后端 (Kestrel),它们都在 docker swarm 中运行。我将所有对 /api 的调用重写到后端,并将所有其他调用重写到前端。
在我当前的设置中,在我登录应用程序之前,一切都运行正常。这使用 IdentityServer OAuth/OpenID 身份验证服务,导致将 Authorization 标头添加到所有使用 Bearer 令牌的调用的请求中。一旦此标头存在,nginx 服务器就会从上游服务器返回超时。这在两台服务器上都会发生,如果我禁用传递身份验证标头,nginx 就会正常工作并代理请求。对于前端来说,这不是问题,因为它不需要标头,但后端显然不再工作。奇怪的是,如果我在某个时候切断标头(它是一个相当长的字符串),请求可以工作,但显然我的后端服务会返回 500,因为它不再是有效的令牌。
我一直在绞尽脑汁想找出问题所在,并尝试了许多配置选项。请求似乎在 nginx 处停止,因为当请求失败时,代理后面的两个服务器都没有收到请求。在 nginx 级别进行日志记录只会显示“上游读取响应标头时上游超时(110:操作超时)”错误,甚至增加该超时也无济于事,这是有道理的,因为没有授权标头的完全相同的请求确实有效。
答案1
问题显然是由于我们正在运行一个包含 Windows 和 Linux 节点的混合集群。与网络驱动程序相关的错误奇怪的是,很少有人遇到这种情况。当请求太大时,请求无法在 docker 网络内正确路由。这导致 nginx 发出请求并等待永远不会到来的回复,因为请求永远不会到达上游服务器……