nginx mongo和gridfs bug

时间:2011-02-05 15:59:27

标签: mongodb nginx gridfs

我试图将gridfs / nginx / mongo设置到位,但是我遇到了一些奇怪的错误。

我在最新的Ubuntu上尝试使用nginx 0.8.53和0.8.54以及最新的mongo 1.6.5 64位。 使用gridfs模块进行编译效果很好:https://github.com/mdirolf/nginx-gridfs

server {
   listen xx.xx.xx.xx;
   server_name media.foo.com;

   access_log  /home/cloudy/log/nginx/media-access.log;
   error_log   /home/cloudy/log/nginx/media-error.log;

   location /gridfs/ {
       gridfs db_name;
       mongo 127.0.0.1:27017;
    }
}

当我尝试获取文件时,我得到一个空响应:

curl -X GET -i 'http://media.foo.com/gridfs/4d4d526cea26b05041000015'
curl: (52) Empty reply from server

我的错误。日志

2011/02/05 15:28:50 [alert] 7112#0: *1 zero size buf in writer t:0 r:0 f:0 0000000000000000 0000000000000000-0000000000000000 0000000000000000 0-0, client: 80.11.52.189, server: media.uk.cloudy.fr, request: "GET /gridfs/4d4d526dea26b05041000016 HTTP/1.1", host: "media.foo.com"
2011/02/05 15:28:52 [alert] 7112#0: *2 zero size buf in writer t:0 r:0 f:0 0000000000000000 0000000000000000-0000000000000000 0000000000000000 0-0, client: 80.11.52.189, server: media.uk.cloudy.fr, request: "GET /gridfs/4d4d526dea26b05041000016 HTTP/1.1", host: "media.foo.com"

欢迎任何建议:)

2 个答案:

答案 0 :(得分:1)

我实际上攻击了gridFS模块以访问mongo中的其他内容。我的同事随后提交了拉取请求,我认为这是最后一件事。如果你想要补丁,我也发现了内存泄漏。该模块自7月以来尚未开发。它可能与新的nginx不兼容。我们正在大量使用它,如果我发现它与.8x / Mongo 1.7.5不兼容我将修复它并让你知道。在此期间我会问github上的维护者。

此问题不是由10gen开发的,因此您可能无法获得mongodb-user的帮助。这不是Mongo的错误。 Mongo自7月以来发生了很大的变化,所以这也可能是一个问题。 nginx插件也依赖于mongo C驱动程序,它可能已经过时了。我们成功地使用它与nginx / 0.7.67和mongo 1.6.5。

使用详细(-vvv)运行你的mongo并拖动mongo日志并点击它。查看您的请求是否实际上正在进行mongo查询以及是否存在错误

答案 1 :(得分:1)

好的,我找到了问题的根源,

我的档案是空的。 使用mongoengine python GridFsProxy read()给我0,但我仍然可以在mongoterm,db.fs.files集合中看到它们,大小不同于0:/

我查看了我在测试代码中添加文件的位置,这是我发现的内容:

f1 =  open(path.join(PROJECT_ROOT,'test_files/marmot.jpg'), 'r')
f2 =  open(path.join(PROJECT_ROOT,'test_files/img-sanctuaire.png'), 'r')

files = [f1, f2]

# add logs 
for i in range(0, num):

    log = Foo.create(
         ...
        files=files,
     )
    # appends
    batch_insert_logs.append(log.to_mongo())

db = _get_db()
# Batch insert logs 
if batch_insert_logs:
    db.mycollection.insert(batch_insert_logs)

第一个日志图像有效但所有其他日志图像都是空的,导致前面提到的bug。 将文件实例化位置更改为:

# add logs 
for i in range(0, num):
    f1 =  open(path.join(PROJECT_ROOT,'test_files/marmot.jpg'), 'r')
    f2 =  open(path.join(PROJECT_ROOT,'test_files/img-sanctuaire.png'), 'r')

    files = [f1, f2]

    log = Foo.create(
         ...
        files=files,
     )
    # appends
    batch_insert_logs.append(log.to_mongo())

db = _get_db()
# Batch insert logs 
if batch_insert_logs:
    db.mycollection.insert(batch_insert_logs)

彻底解决了这个问题。

结论是,mongoengine可能存在问题。 我将在mongo上尝试详细(-vvv)以查明问题。