2011-02-05 62 views
0

我试图把gridfs/nginx/mongo设置到位,但我得到一些奇怪的错误。nginx mongo和gridfs bug

我在最新的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 

我的error.log

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" 

任何建议欢迎:)

+0

我会建议要么在MongoDB用户邮件列表或向他们的Jira提交问题。 – 2011-02-06 13:20:21

+0

我实际上黑客的gridFS模块访问Mongo中的其他东西。然后,我的同事提交了一个请求,我认为这是最后一件事情。如果您想要该补丁,我也发现内存泄漏。该模块自7月份以来尚未开发。可能它可能与新的nginx不兼容。我们正在使用这个,所以如果我发现它与.8x不兼容,我会修复它并让你知道。在此期间,我会问github上的维护者。 – 2011-02-06 15:26:31

回答

1

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

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

用详细(-vvv)运行你的mongo并拖曳mongo日志并打它。看看你的要求实际上是制作蒙戈查询,如果有与

1

好吧错误,我找到了问题的根源,

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

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

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