Nginx tries to allocate a huge number of memory and fails

hi

i’m having a strange case where nginx is trying to allocate some
really huge amount of memory. we created a new vhost on nginx to
provide an internal interface to flush the apc cache of php. in most
of the cases i can request this and get what i expected, only in
around 20% of the request nginx is trying to allocate a huge number of
memory and fails, so it returns 500 internal server error.

2011/08/04 05:14:00 [emerg] 41529#0: *89012062 malloc()
18446744073709545066 bytes failed (12: Cannot allocate memory),
client: 192.168.1.195, server: *.kaufmich.vpn, request: “GET
/web1/apc/flushApc.php HTTP/1.1”, host: “static.kaufmich.vpn”

does anybody have an idea why that would happen? i thought this almost
has to be a bug because the amount of bytes it is trying to allocate
is just so huge it just cant be right.

nginx -V

nginx version: nginx/0.7.65
built by gcc 4.2.4 (Ubuntu 4.2.4-1ubuntu4)
configure arguments: --prefix=/usr/local/nginx-0.7.65
–without-http_ssi_module --without-http_userid_module
–without-http_geo_module --with-pcre=/tmp/pcre-8.02
–add-module=src/http/modules/ngx_cache_purge/

server {
server_name *.kaufmich.vpn;

    access_log /var/log/nginx/deployment_interface/access.log;
    error_log /var/log/nginx/deployment_interface/error.log debug;

    set $doc_dir /var/www/kaufmich;
    set $script_dir $doc_dir;
    root $doc_dir;

    location / {

    if ($request_uri !~* /.+/.+/.+) {
            return 501;
    }

    if ($request_uri ~* /(.+)/(.+\.php)) {
            set $prod_server $1;
            set $action $2;
            set $script $3;
            set $parameters "";
            set $script_dir $doc_dir/$action;
    }


    if ($request_uri ~* /(.+)/(.+)/(.+\.php)) {
            set $prod_server $1;
            set $action $2;
            set $script $3;
            set $parameters "";
            set $script_dir $doc_dir/$action;
    }

    if ($request_uri ~* /(.+)/(.+)/(.+\.php)\?(.+)) {
            set $prod_server $1;
            set $action $2;
            set $script $3;
            set $parameters $4;
            set $script_dir $doc_dir/$action;
    }

    include fastcgi_params;
    fastcgi_connect_timeout         3;
    fastcgi_send_timeout            25;
    fastcgi_read_timeout            25;
    fastcgi_intercept_errors        on;
    fastcgi_param DOCUMENT_ROOT     $script_dir;
    fastcgi_param SCRIPT_NAME       $script;
    fastcgi_param SCRIPT_FILENAME   $script_dir/$script;
    fastcgi_param PATH_INFO         $parameters;
    fastcgi_param QUERY_STRING      $parameters;
    fastcgi_param REQUEST_URI       $request_uri;
    fastcgi_param REQUEST_METHOD    $request_method;
    fastcgi_param CONTENT_TYPE      $content_type;
    fastcgi_param CONTENT_LENGTH    $content_length;
    fastcgi_param GATEWAY_INTERFACE CGI/1.1;
    fastcgi_param REMOTE_ADDR       $remote_addr;

    if ($prod_server = "web1") {
            fastcgi_pass web1.kaufmich.com.cgi;
            break;
    }
    if ($prod_server = "web2") {
            fastcgi_pass web2.kaufmich.com.cgi;
            break;
    }
    if ($prod_server = "web3") {
            fastcgi_pass web3.kaufmich.com.cgi;
            break;
    }

    # else

    return 501;

    }

}

Hello!

On Thu, Aug 04, 2011 at 11:47:08AM +0800, Mauro Stettler wrote:

18446744073709545066 bytes failed (12: Cannot allocate memory),
client: 192.168.1.195, server: *.kaufmich.vpn, request: “GET
/web1/apc/flushApc.php HTTP/1.1”, host: “static.kaufmich.vpn”

does anybody have an idea why that would happen? i thought this almost
has to be a bug because the amount of bytes it is trying to allocate
is just so huge it just cant be right.

[…]

nginx -V

nginx version: nginx/0.7.65

[…]

    if ($request_uri ~* /(.+)/(.+\.php)) {
            set $prod_server $1;
            set $action $2;
            set $script $3;
            set $parameters "";

This is a problem with using unitialized $n variables. Note the
above regexp has only 2 captures but following “set” uses variable
“$3”.

This problem is fixed in 0.8.25+. Please upgrade.

Maxim D.

thanks a lot for the helpful answer maxim,

i will try that.

mauro