Ember CLI 正在惹恼 nginx

我正在进行不受支持的 Docker 安装。

这意味着在不同的端口上运行 Ember CLI 的容器,并使用共享卷,并通过反向代理到 Rails 服务器,正如预期的那样。

不幸的是,对于所有 .css 资源,当我通过 HTTPS 并通过 Nginx 反向代理访问时,都会收到来自 curl 和浏览器的“网关错误 502”。

看起来 Ember CLI 在 Rails 服务器已经添加了 transfer-encoding: chunked 的情况下,又 添加Content-Length 标头。

(我可以访问不同的端口来检查来自 Rails 和 Ember 的响应)

我相信这并没有正式违反 HTTP 1.1 协议标准(它应该被忽略):

“如果收到的消息同时包含 Transfer-Encoding 标头字段和 Content-Length 标头字段,则后者必须被忽略。”

……但这确实会导致 Nginx 拒绝服务并报告 502,并且不提供资源,所以这无关紧要。

我可以直接通过 curl 将 CSS 文件浏览到本地主机上的容器,但在 Nginx 层面,它无法正常工作:

upstream 在读取来自上游的响应头时同时发送了“Content-Length”和“Transfer-Encoding”标头

有人有什么办法可以阻止 Ember CLI 这样做,或者有什么变通方法吗?我很惊讶这在标准安装中不是一个问题?(因为通信链应该非常相似)。

Discourse 版本是 2.8.9

Docker 中的标头(为简洁起见,略有删减):

< content-transfer-encoding: binary
< content-type: text/css; charset=utf-8
< referrer-policy: strict-origin-when-cross-origin
< set-cookie: __profilin=p%3Dt; path=/forum; HttpOnly; SameSite=Lax
< **transfer-encoding: chunked**
< Vary: Accept, Accept-Encoding
< x-content-type-options: nosniff
< x-discourse-route: stylesheets/show
< x-download-options: noopen
< x-frame-options: SAMEORIGIN
< x-permitted-cross-domain-policies: none
< x-xss-protection: 0
< content-encoding: null
< **Content-Length: 3055**
1 个赞

我们仅在开发环境中使用 Ember CLI 代理。在标准安装中,请求流程为 用户 → NGINX → Rails。我建议坚持这种模式——我们没有为生产环境设计我们的 Ember CLI 配置。即使您设法使其正常工作(这并不容易),也可能会存在安全和/或性能问题。

6 个赞

啊,嗯,这个安装目前是开发/生产混合体,所以它有像这样的环境变量:

RAILS_ENV: development

尽管它前面有完整的 HTTPS 和 Nginx。

但我可能会在“开发”中更改它,以便我们能够让事情正常工作。

是的,所以 Ember CLI 绝对还没有准备好投入生产,恕我直言,我只会将其用于“真正的”开发。

感谢您提供的重要信息 David,这为我节省了很多时间!

3 个赞

好的,这个故事,顺便说一句,变得更奇怪了。

我有两个安装,都是“开发”设置,一个是这个,另一个是非 Docker 的 Ubuntu 设置。

我注意到对非 Docker 开发服务器上的 /stylesheets/ 的调用包含来自 Rails 服务器的“Transfer-Ecoding: chunked”标头,而是包含“Content-Length”值……有人能解释一下为什么会这样吗?

更新:这可能可以通过 https://stackoverflow.com/questions/29112728/when-does-rails-respond-with-transfer-encoding-vs-content-length 来解释。

1 个赞

我将编写一个小型插件来为样式表响应添加 Content-Length 标头,看看是否可以防止 Transfer-Encoding: chunked 响应。

如果有人知道更简单的实现方法,我洗耳恭听!

(供参考,这仅用于开发环境,绝不会在生产环境中使用)。

1 个赞

关于此事的更新。

我已经成功地欺骗了系统。我通过覆盖 StylesheetsController 来强制设置 Content-Length 标头,这可以防止分块响应,从而绕过 Ember CLI 的不良习惯并避免 nginx 的不规范过敏。

我之所以能找到这个解决方案,是因为我注意到了另一个使用 https 的 Ember CLI/nginx 设置,其中 Rails 选择对 Stylesheet 响应进行分块(有人知道为什么会这样吗?)。这促使我尝试强制设置标头,结果它奏效了!

这仅在开发环境中需要,所以我不太担心。

2 个赞

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.