【问题标题】:How to get file from gridfs and play it as stream with Nginx?如何从 gridfs 获取文件并使用 Nginx 将其作为流播放?
【发布时间】:2012-09-07 05:09:26
【问题描述】:

我使用 Nginx 设置了一个 Web 服务器,我使用 nginx-gridfs 模块访问 Mongodb 内容并使用 http_mp4_module 在客户端将 mp3 文件作为流播放,上述两个服务都可以独立运行,但是当我尝试结合这两个服务,并尝试访问存储在Mongodb中的mp3文件并在客户端将其作为流播放,出现404错误,这听起来http_mp4_module无法与Gridfs一起使用,它需要一个真实的文件,该文件存在于File中系统。以下是我的 Nginx 配置设置:

用于访问Mongodb内容:(我可以通过URL http://myhost/voice/mp3/xxxxxx.mp3访问mp3文件)

     location /voice/mp3/ {
                     gridfs whatsup
                            field=filename
                            type=string
                            root_collection=storage.voice.mp3;
                     mongo localhost:27017;
     }

用于在客户端播放mp3文件作为流(我可以使用URL http://myhost/mp3/xxxxxx.mp3的浏览器播放mp3,该mp3文件存在于文件系统中)

     location /mp3 {
              root /var/www/html/;
              mp4;
     }

以上两个服务都工作正常,但是当我将它们结合起来时,它就不起作用了,配置如下:

     location /play/mp3 {
                     gridfs whatsup
                            field=filename
                            type=string
                            root_collection=storage.voice.mp3;
                     mongo localhost:27017;

                     mp4;
        }

当我尝试使用浏览器访问 URL http://myhost/play/mp3/xxxxxx.mp3 并使用它时,它显示 404 错误。

有没有办法将这两种服务结合起来?还是我错过了什么?

【问题讨论】:

    标签: mongodb stream nginx gridfs


    【解决方案1】:

    首先,将你的 mongodb gridfs url 重定向到本地文件系统,像这样配置你的 nginx 服务器:

    location / {
            root mp3;
            mp4;
    }
    
    location /tushuo/voice/mp3/ {
        rewrite ^/tushuo/voice/mp3/(.*) /$1;
    }
    

    然后,您可以使用gridfs-fuse 将您的mongodb gridfs 挂载到您的本地文件系统树,以便nginx mp4 模块可以找到它。 (注意:你必须以 root 身份运行 nginx。)

    sudo ./mount_gridfs --db=whatsup.storage.tushuo.voice --host=localhost --fsnode=mp3 -/usr/local/nginx/mp3/
    

    【讨论】:

      【解决方案2】:

      不要使用 gridfs-fuse 将你的 gridfs 挂载到文件系统,检查这个:http://blog.vladimirm.com/2011/06/export-files-from-mongodb-gridfs-with-directory-paths/

      这是一个将 gridfs 文件挂载到文件系统的 bash 脚本

      用法:

      • 创建名为 gridfs.sh 的文件(放入您将在链接中找到的 bash 脚本中)。

      • 运行此命令: $ ./gridfs.sh host database_name(这会将文件挂载到您所在的目录中)。

      【讨论】:

        【解决方案3】:

        一些媒体播放器需要 HTTP 范围请求协议,因为需要时间搜索。 此类播放器在播放媒体之前检查网络服务器是否支持该协议。

        原来的 nginx-gridfs 模块没有范围请求的实现。 这个quick hack patch 添加了范围请求支持,我确认它解决了问题。

        然而,这个实现会阻塞整个 nginx 进程,直到一个流式传输完成。 这对nginx来说太糟糕了,因为在事件驱动的架构中应该避免阻塞IO。所以,我认为我们应该使用其他实现来提供大文件或流媒体,例如 gidfs-fuse 和其他node proxy

        【讨论】:

          猜你喜欢
          • 2016-02-29
          • 1970-01-01
          • 2011-09-18
          • 2021-07-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-03-17
          • 1970-01-01
          相关资源
          最近更新 更多