我使用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错误。
有什么想法结合两种服务吗?或者是否有我错过的东西?
答案 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/