【问题标题】:Serving my angularJS web app static content, nodeJS or apache?为我的 angularJS Web 应用程序静态内容、nodeJS 或 apache 提供服务?
【发布时间】:2015-07-21 07:02:41
【问题描述】:

我正在开发一个网络应用程序,客户端是一个 angularJS 应用程序,旨在使用我的 REST 服务器端 API,所以我公共目录中的所有文件都是静态的。

我想尝试使用 NodeJS + express 来制作我的服务器端 API,因为我听说过很多它,我阅读了很多教程,现在我了解了如何制作 API。

但我不明白为什么提供静态文件感觉如此复杂,我已经大量使用 LAMP 堆栈并且使用它提供静态内容非常容易,甚至不是 1 行代码。使用节点似乎我必须为每个文件编写路由?

我读过关于人们使用 apache 来提供静态内容并拥有应用程序引用节点的信息,如何做到这一点?我可以将我的客户端 ajax 请求指向不同的端口并让节点在服务器上的该端口上运行,还是我需要另一个 ip?

这方面的最佳做法是什么?

【问题讨论】:

  • 您要求最佳实践。我有一个网站,它有一个 NodeJS + Express 后端和 AngularJS + Angular-UI/UI-Router 前端。我所有的视图都是从 Jade 模板呈现并以 HTML 格式输出的。您可以在公用文件夹中创建“模板”文件夹,然后存储为 .html。这是你想做的吗?这些可以从 youwebsite.com/templates/template.html 访问,或者像我一样,可以从 Jade 文件生成模板,该文件已通过控制器进行访问验证和我可能需要做的任何其他清理。跨度>
  • 如果将每个文件存储在公用文件夹中,则不必为每个文件编写不同的路由。

标签: angularjs node.js apache


【解决方案1】:

在 nodejs 上提供静态文件非常简单,只需将所有这些文件添加到公共文件夹并将以下中间件添加到您的 express 应用程序:

app.use(express.static(__dirname + '/public'));

其中__dirname + '/public' 是您的公用文件夹的路径。就是这样,一行代码。

【讨论】:

    【解决方案2】:

    Apache 可能比 node.js 性能更高。特别是 Apache 会有更多的开销。通常我使用 nginx 来做这种事情。在您的情况下,您也可以将所有资产上传到 CDN,因为您的资产是静态的。

    从 nodejs 提供静态文件的一个问题是它不处理诸如缓存、缓存控制、url_rewriting 之类的事情,并提供免受 DoS 攻击的安全性。我真的建议在生产中使用 nginx 来提供静态资产或 CDN,可能是两者的组合。您不想从 API 提供资产,最好有一条清晰的分隔线,这样您就可以扩展每个单独的,因为您的 API 可能需要更快地扩展。

    像 Nginx 这样的东西在负载下肯定会表现得更好。使用 express 的唯一优点是更容易设置。但是,您只需设置一次 nginx,然后您只需部署到您配置的 Web 根目录。 Apache 可能也会更好地处理负载,但不像它依赖于旧的分叉进程方法来处理并发性那样轻量级,因为 Nginx 很像 node.js 是异步的

    最佳实践绝对是使用诸如 nginx、CDN 或其他 Web 服务器之类的东西来提供静态文件。在我看来,从 node.js 提供文件通常用于小型、低流量的网站。您可以完全按照您的描述进行操作。您可以将 API 放在不同的端口上。最常见的是您的 UI 位于“http://mywebsite.com/”,而您的 api 位于子域“http://api.mywebsite.com/”。但是,如果您使用不同的端口在同一台机器上运行两者可能比尝试将两个域配置到同一个框更容易。在生产中,我肯定会同时保留端口 80 并为 api 设置一个子域。

    至于 veggiesaurus 的回答,我不同意。你通常会运行 grunt/gulp/similar 来缩小和构建你的资产。您可以简单地将资产构建到特定的 webroot。然后,您可以在配置文件或环境变量中指定此 Web 根目录。我个人更喜欢在服务器上构建我的应用程序,因此我可以相应地将我的项目构建到它的环境中。构建脚本也可以作为你的应用的启动器,或者为你的系统创建一个初始化脚本,这样你就可以确保应用继续运行并在它崩溃时重新启动。将您的项目构建包含在您的存储库中很麻烦,如果您的构建到项目目录之外的路径,那么您不必担心 git-ignoring 您的构建。如果你想在那个目录中构建,你可以在那里简单地配置你的 web 根目录,但我个人不喜欢这样做。

    【讨论】:

    • 感谢所有有用的信息!我没有使用 Nginx 作为 apache 的替代品,但我一定会研究它!我也从来不知道 CDN 来托管网站资源,我只是用它们来获取库之类的!
    • CDN 可以处理几乎任何类型的静态资产。如果它的所有静态资源,您可以在技术上将您的整个前端放在 CDN 上,这在 Angular 前端中尤其常见。 Nginx 的配置非常简单。有很多指南。我个人喜欢数字海洋提供的知识库,因为他们的大多数指南都不是针对他们的平台的。
    • @tsturzl 我无法得到类似问题的任何答案(不同的实现方式)。你能看看同样的吗?
    【解决方案3】:

    如果你的文件都是公开的,你可以把它们都放在一个public子文件夹中,然后用express写几行代码就可以了。您可以查看指南here。至于向不同的端口发出 ajax 请求,那绝对可行。您只需要确保将您的快速服务器配置为侦听该端口即可。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-12
      • 2012-08-13
      • 1970-01-01
      • 2011-01-31
      • 1970-01-01
      • 2016-05-02
      • 2010-11-30
      • 1970-01-01
      相关资源
      最近更新 更多