首页 > 解决方案 > 在不同平台上,rails 开发应用程序无法与 nginx proxy_pass 一致地为 JS 提供服务

问题描述

我会尽量简短地说明我是如何到达这里的,但这大约是 3 天的旅程。

多年来,我在网络上的某个地方放置了“演示”应用程序,供其他人查看并给我反馈。这最初是在我的笔记本电脑上,开发应用程序在某个高端口上运行,我的路由器将该端口重定向到我的笔记本电脑。我在其他平台(MacMini、RaspberryPI、Linux)上安装了一些应用程序,并让 nginx proxy_pass 端口 80 到该平台。上周我试图简化我的流程并将所有 Demo 放在 MacMini 上,这就是我遇到了一些应用程序无法在某些演示中找到或加载 jQuery 的问题,通常是具有 Zurb Foundation 的那些。

我不知道是什么导致了这个问题,我有五个候选人。

为了记录这一点,我在三个平台上运行了一个应用程序(来自 git pull 的相同代码、相当数量的 JS 和一点基础 Foundation)。MacMini 运行的是 10.13.4(高山脉,但最近几天我经历了 10.12.2 和 10.12.6)。运行 10.12.6 的 MacBook Air。在 MacMini 上的 VirtualBox 中运行的 Rasberrian OS (Debian 9)。[基础-rails (6.4.3.0), rails (5.1.6), jquery-rails (4.3.3)]

除了 server_name 和端口号之外,所有三个的基本 nginx 配置都是相同的。我尝试了各种调整,但都没有解决我的问题。

server {
  server_name bingo2.mydomain.us;

  location / {
    proxy_redirect     off;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-NginX-Proxy true;
    proxy_pass http://10.0.1.104:8604/;
  }
}

我的 JS/CSS 清单文件目前在下面。我已经移动了一些东西,以确保我为供应商设置了正确的订单和选项。对于 CSS 文件,我取出了require foundation_and_overides条目,因为它在树中并且它没有任何效果,认为它是从旧版本的基础遗留下来的。

// This is a JS manifest file that'll be compiled into application.js, which will include all the files
// listed below.

//
//= require rails-ujs
//= require jquery
//= require foundation
//= require_tree .

$(document).foundation();

/*
 * This is a css manifest file that'll be compiled into application.css, which will include all the files
 * listed below.
 *
 *= require_self
 *= require foundation_and_overrides
 *= require_tree .

 */

我最初让应用程序在普通的开发环境中运行,但发现了一个潜在的错误(https://github.com/rails/rails/issues/26158),它指向 OSX 文件系统问题。解决方法是删除 file_watcher,所以我创建了一个“演示”环境,它只是一个开发环境,删除了文件观察程序 gems 和配置。

我启动应用程序rails s -p 8604 -e demo -b 0.0.0.0 -d 并点击应用程序bingo{1,2}.mydomain.us.

结果是两台 Mac 都因 Web 控制台错误而失败

 [Error] Failed to load resource: The network connection was lost. (foundation_and_overrides.self-d1f959e72f9d5d6603cd707629d1e6b8df8a5731363c48252b8b10028591a11a.css, line 0)
 [Error] ReferenceError: Can't find variable: jQuery
  (anonymous function) (foundation.core.self-f3c7f9657e3fa857b22c08af6fe5c52df6f2ad4f5b85268319d47c1be483353d.js:74)
  __webpack_require__ (foundation.core.self-f3c7f9657e3fa857b22c08af6fe5c52df6f2ad4f5b85268319d47c1be483353d.js:21)
  ...

如果我将 nginx 排除在外,直接访问本地端口(10.0.1.104:8604),那么所有平台都可以工作。(但是你有没有问过任何几乎没有技术经验的人使用端口#!查看网站上的东西,这让他们感到困惑,更不用说他们想把 www 放在 url 中)

当然 OSX 似乎是主要问题,但仅限于 proxy_pass。

任何人有任何想法或看到我的设置中缺少的东西?我想我可以设置临时环境并部署应用程序,但是对于我想做的事情来说,简单的 git push 和 pull 似乎要容易得多。

大多数关于 nginx 不服务 JS 的类似问题仍未得到解答,或者一个简单的错误正在得到纠正。

标签: jqueryruby-on-railsmacosnginxzurb-foundation

解决方案


几天没有回应后,我又挖了一点,发现了一些有用的东西。

Zurb 基金会一直存在问题。我很久以前就放弃了涡轮链接。它只是不能很好地使用它,但是除了需要的东西之外,去掉清单文件中的所有内容,我遇到了一个 javascript 错误,说它找不到基础的东西。查看$(document).readyvs之后$(window).load,我将 javascript 清单更改为:

//= require rails-ujs
//= require jquery
//= require foundation
//= require_tree .

$(window).load(function() {
    //Fires when the page is loaded completely
    $(document).foundation();
});

我猜在打基础电话时一切都没有加载。`$(document).ready 只是没有做到这一点。

这仍然不能回答为什么它适用于 linux 而不是 MacOSX。

编辑

除了使用 chrome 导致错误!

net::ERR_CONTENT_LENGTH_MISMATCH

我添加proxy_buffering off;到 nginx 位置。


推荐阅读