【问题标题】:What's difference between static and non-static resources?静态资源和非静态资源有什么区别?
【发布时间】:2014-07-29 07:19:50
【问题描述】:

我主要是前端开发人员/设计师,但最近,我一直在探索端到端解决方案。昨天我使用平均堆栈完成了一个 TODO 应用程序,并想开始探索我的 VPS 的部署选项。

话虽如此,有人建议我使用 nginx 作为反向代理来提供静态资源?不幸的是,我陷入了简单的问题。

什么是示例静态资源?

哪些因素定义了静态资源?

非静态资源的例子有哪些?

最后,我应该注意哪些奇怪的边缘情况?

对不起这个问题的菜鸟。

【问题讨论】:

    标签: javascript nginx single-page-application reverse-proxy mean-stack


    【解决方案1】:
    • 静态资源是一种不会经常更改的资源,除非需要,否则可以存储在客户端的浏览器端,以防止在Web服务器上加载并在客户端更快地加载站点。
    • 其中一些示例包括:图像、javascript、css
    • 动态资源是在 Web 资源上发生变化的内容,主要是在特定于用户或项目的页面上不断变化的数据。
    • 为了确保您的静态数据减少服务器上的负载并确保客户端的快速性能,您需要注意各种服务器特定配置,例如启用 js 文件压缩、正确呈现图像的标题内容.

    当您想更改文件内容时,请确保阻止浏览器从缓存中提取此静态旧内容,并在这些静态资源的 URL 中附加时间戳,以确保在需要时加载更新的资源

    【讨论】:

      【解决方案2】:

      静态资源不是动态生成的。

      静态资源的一个例子是图像。每个请求都是一样的。它是文件系统上的一个文件,不需要任何处理 - 你只需告诉 nginx 将这个文件按原样发送给用户。

      动态资源的一个示例是特定于请求它的用户的 json 数据(必须专门为该用户生成)。

      对于动态资源,这些通常也是您自己执行的特定于域的代码、对数据库的请求等。

      nginx 应该提供静态内容的原因是因为它擅长以并行方式提供这些内容 - 它就是为此而设计的。

      如果您使用 Ruby/Python/node.js/Java 等,您还可以通过这些进程提供静态资源(只需调用 File.open() 并开始流式传输数据) - 但是它会慢得多,而且也更低您可以同时处理的动态请求的数量。

      【讨论】:

      • 那么提供 index.html 是静态资产吗?
      • 是的 index.html 是静态资产。如果它只是文件系统上可以直接发送到客户端的文件,则它是静态的。
      • 所以我想更好的问题是什么是通过 nginx 快速提供资源的真实用例示例。你能给我一个真实的例子,我会标记正确吗?
      • @MatthewHarwood 您将使用 Express 来提供对 API 的响应,或者您需要在应用程序中生成的任何其他内容。
      • 您不会使用 Express 来提供 nginx 资源。发生的事情是 nginx 正在控制哪些请求命中 Express(它在 express 前面)。因此,您将 nginx 配置为拦截对 images 目录的任何请求(因为这些请求是静态的)。对于任何其他目录,你告诉 nginx 委托/代理到 Express。
      【解决方案3】:

      静态资源是指不改变且不涉及服务器端代码的资源。

      这通常意味着图像、CSS 和某些客户端 Javascript。

      【讨论】:

        【解决方案4】:

        在这种情况下,静态资源是指不是使用动态代码生成的资源,这意味着其内容不会因请求而异。

        图像、JavaScript、CSS 等都可以用于此。基本上,您为这些资源设置了较长的缓存时间,并且您的 Nginx 服务器可以在磁盘上(或在 Redis 或类似的东西中)保留一份副本,以便它们准备好返回到客户端而不会影响您的应用程序服务器。

        请务必记住在设置大缓存时间时使用版本化文件名。例如 header-image-20140608.png,这意味着您可以拥有更高版本,而不必担心旧版本仍在缓存中。

        【讨论】:

        • 单页应用中动态资源的例子是什么?
        • @MatthewHarwood 可能什么都没有,但是如果您正在与后端 API 通信,那么您对该 API 的任何调用都是对动态资源的请求。
        • 是的,这就是我感到困惑的原因。就像有些人说的那样,节点服务器应该只处理 websocket。但是感觉好像 nginx 什么都做?
        • @MatthewHarwood 谁说 Node 应该只处理 Websockets?重要的是让您的应用程序服务器(您在 Node.js 上的代码)执行应用程序所需的操作,并将任何一般 Web 服务任务留给一般 Web 服务器 (Nginx)。从 Node.js 提供图像和 CSS 几乎没有意义(当然,除非您以编程方式即时生成这些图像和 CSS,但大多数情况下不会),因为相比之下,Node.js 在提供静态资源方面效率不高到像 Nginx 这样的完全编译的 Web 服务器。
        • @MatthewHarwood 您的应用程序服务器为您的应用程序完成所有工作。您的 Web 服务器是向客户端发送数据的设备。仅仅因为 Node.js 使用 HTTP 并不意味着它应该用于一般的 Web 服务。 HTTP 是一种方便的 API 传输方式,这就是它可用的原因。虽然没有什么能阻止您从 Node.js 提供静态资源……但您为什么要这样做?并且,通过 Nginx 将您的 API 调用代理到 ​​Node.js。 Nginx 更擅长处理慢客户端。在有意义的地方保持 Node 的负载。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-12-04
        • 1970-01-01
        • 2013-08-01
        • 2014-08-29
        • 2016-08-29
        • 2023-04-01
        • 1970-01-01
        相关资源
        最近更新 更多