0

我试图将 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"

欢迎任何建议:)

4

2 回答 2

1

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

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

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

于 2011-02-06T15:35:33.510 回答
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)

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

# 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) 以查明问题。

于 2011-02-06T20:58:45.670 回答