Hello,
I was trying to add rate limiting to our setup (mp4 file serving) and
got into some very strange issues.
First, with version 1.2.0, I was seeing the following:
2013/06/14 13:25:02 [emerg] 12470#0: *147816
malloc(18446744073709551608) failed (12: Cannot allocate memory),
client: 92.247.59.175, server: localhost, request: “GET
/vid3/QkpnNF3f5RY0_D9j0L8ovw/1371217700/12/46812/46812_720x406_500k.mp4
HTTP/1.1”, host: “vm0.xxxxxxx”
The same happened with 1.2.7. I tried doing the same with 1.4.1, and
what I got was a crash, with stuff like this:
2013/06/14 20:50:58 [alert] 1690#0: worker process 26026 exited on
signal 6
2013/06/14 20:50:58 [alert] 1690#0: worker process 25973 exited on
signal 11
2013/06/14 20:50:58 [alert] 1690#0: worker process 25976 exited on
signal 11
and something like this, a bit cut:
*** glibc detected *** nginx: worker process: free(): invalid next size
(normal): 0x000000000199b900 ***
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x76d76)[0x7f4ea69fed76]
/lib/x86_64-linux-gnu/libc.so.6(cfree+0x6c)[0x7f4ea6a03aac]
nginx: worker process[0x4059eb]
nginx: worker process[0x43067b]
Removing the ifs in the config fixes the problem, but that doesn’t help
me
This is a compiled nginx from source, on debian stable (wheezy), with a
few small additions available at
https://github.com/krokodilerian/trafstat/tree/master/nginx .
Any ideas how to proceed with this, maybe adding a stack trace to find
who does the offending malloc? I’ve looked at some google results, and
some people have seen such insane mallocs (this one is -6 on a 64bit
unsigned value), when trying to use a variable that wasn’t there, but
that doesn’t seem to be my case. I have a debug log and other stuff I
can send, if that would be helpful.
Here’s my config, the file names look something
like /data/v/63/27763/27763_1920x1080_4000k.mp4 :
location /vid3/ {
error_log /usr/local/nginx/logs/debug.log debug;
location ~
^/vid3/(?[\w-=]+)/(?\w+)(?/[0-9/]+.[0-9]+x[0-9]+)(?[0-9]+00)(?k.mp4)?(?.*)$
{
mp4;
mp4_buffer_size 1m;
mp4_max_buffer_size 5m;
if ($invalid_referer) {
return 403;
}
secure_link $rcvmd5,$linkexp;
secure_link_md5
“XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX$remote_net$fnm$spd$kmp$linkexp” ;
if ($secure_link = "") { # invalid
return 403;
}
if ($secure_link = "0") { # expired
return 410;
}
if ($spd = 400 ) {
limit_rate_after 400k;
limit_rate 50k;
}
if ($spd = 500 ) {
limit_rate_after 500k;
limit_rate 50k;
}
if ($spd = 1000 ) {
limit_rate_after 1600k;
limit_rate 200k;
}
if ($spd = 4000 ) {
limit_rate_after 3200k;
limit_rate 400k;
}
alias /data/v$fnm$spd$kmp;
}
return 404;
}