如何从gridfs获取文件并将其作为流与Nginx一起播放?

时间:2012-09-14 03:20:50

标签: mongodb stream nginx gridfs

我使用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错误。

有什么想法结合两种服务吗?或者是否有我错过的东西?

3 个答案:

答案 0 :(得分: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(这将挂载您所在目录中的文件)。

答案 1 :(得分:1)

由于时间的推移,一些媒体播放器需要HTTP范围请求协议。 在播放媒体之前,此类播放器会检查网络服务器是否支持该协议。

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

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

答案 2 :(得分:0)

首先,将您的mongodb gridfs网址重定向到本地文件系统,配置您的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/