【问题标题】:Serve static assets and media separately from meteor with nginx?使用 nginx 与流星分开提供静态资产和媒体?
【发布时间】:2015-12-29 01:14:08
【问题描述】:

来自 Django,我习惯于独立于主 wsgi 或其他应用程序提供静态资产和媒体(包括上传)。这种平面文件结构易于浏览和管理。

我似乎找不到任何关于如何使用 Meteor 执行此操作(单独提供静态资产/媒体)的示例。

  1. 有标准方法吗?

  2. 是否有提供此功能的软件包?

我的最终目标是:

  1. 能够更直观地导航所有静态资产和媒体,并从可公开访问的 URL 访问它们,而无需热重建流星应用程序。 “公共”文件夹不适合我...尤其是对于上传的媒体。

  2. 在迁移应用程序时手动或通过我编写的自定义应用程序/包上传到此系统路径(与主流星应用程序分开)。

  3. 浏览/解析来自流星应用/包的路径

【问题讨论】:

  • 您看到我之前对相关问题的回答了吗? stackoverflow.com/a/31129568/1087119;您可以将带有基于文件系统的存储的 collectionsFS 添加到其中,然后您应该拥有所需的一切。
  • 我相信我的问题更清楚地说明了您的答案适用于什么,因为他还要求在他的数据库中记录请求-另外-我的问题是关于与流星分开提供静态资产的具体问题-您的答案仍然据我了解,从流星应用程序提供服务-(阅读我的问题的标题)
  • 好吧,您可以随意忽略我的建议,这只是一个评论,而不是乞求赏金的答案;-) 此外,您的问题主体甚至没有提到 nginx,但您确实要求“使用 Meteor 单独提供静态资产/媒体”。无论如何,我相信有人会回答。
  • 请问您想要这个的原因。我知道你解释了一些最终目标,但我觉得真正的动机缺失了。是出于性能还是可扩展性的原因?
  • 这部分是为了提高性能,但主要是因为在混淆的子文件夹路径中导航部署的流星站点很痛苦 - 我也有在给定结构中预编码的千兆字节视频

标签: javascript node.js meteor nginx


【解决方案1】:

假设您的流星应用位于/www/meteor,并且您希望从位于/meteor 树之外的目录中提供静态资源,以便文件添加/更改/删除不会导致应用重新启动,例如/www/static

所以首先在 nginx 中正常定义你的 Meteor 路径,然后为静态路径定义一个不同的 root,例如:

location /static {
  root /www/static;
}

documentation

【讨论】:

    【解决方案2】:

    如果您出于性能和可扩展性的原因需要此功能(请参阅我的评论),您应该使用缓存代理。最初代理会直接从 Meteor 应用程序中获取静态文件,但后续请求将从其缓存中提供。

    这篇文章 (nginx-caching) 很好地了解了如何使用 Nginx 设置缓存代理。此外,Meteorpedia 有一个 article 解释如何设置专门为 Meteor 应用程序定制的 Nginx 缓存。

    【讨论】:

      【解决方案3】:

      如果您所有的静态资产都有一个共同的路径,例如/static/...,那么您可以告诉nginxalias 对该路径的请求与目录

      location /static  {
          alias /path/to/static/assets;
      }
      

      【讨论】:

        【解决方案4】:

        您可以在您的流星应用程序中设置一个文件服务器,以使用节点 fs 模块为它们提供服务,然后使用类似 Picker 的方式提供服务,或者有一个示例将连接处理程序添加到 Meteor here,如果没有的话'没办法。

        默认情况下,Meteor 将忽略隐藏目录,因此您可以根据需要将资产放在应用程序目录中,例如 .assets/,否则运行流星的用户可以访问文件系统上的任何位置。

        这是我刚刚拼凑在一起的文本文件的工作服务器。你需要先做meteor add meteorhacks:picker

        if (Meteor.isServer) {
          var fs = Npm.require('fs');
          Picker.route('/asset/:name', function(params, req, res) {
            fs.readFile('/home/users/someuser/media/' + params.name, function(err, file) {
              res.writeHead(200, {'Content-Type': 'text/plain'});
              res.end(file.toString());
            });
          });
        }
        

        【讨论】:

        • 这仍然在流星项目的范围内 - 我想指定一个任意文件系统位置,例如。流星项目在 /home/users/someuser/greatapp 和 assets/media 在 /home/users/someuser/media
        • 啊,我错过了这个要求。您可以访问文件系统上您的用户有权使用 fs 的任何文件,因此可以将其构建为指向任何地方,如果它位于您的应用程序目录中,您只会遇到应用程序重建的问题。我会更新我的答案并添加更多细节。
        猜你喜欢
        • 2021-01-22
        • 1970-01-01
        • 2012-02-20
        • 1970-01-01
        • 2018-10-10
        • 2012-05-11
        • 1970-01-01
        • 2018-07-17
        • 2016-07-19
        相关资源
        最近更新 更多