ПРОЕКТЫ 


  АРХИВ 


Apache-Talk @lexa.ru 

Inet-Admins @info.east.ru 

Filmscanners @halftone.co.uk 

Security-alerts @yandex-team.ru 

nginx-ru @sysoev.ru 


  СТАТЬИ 


  ПЕРСОНАЛЬНОЕ 


  ПРОГРАММЫ 



ПИШИТЕ
ПИСЬМА












     АРХИВ :: nginx-ru
Nginx-ru mailing list archive (nginx-ru@sysoev.ru)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Проблемы...



Добрый день,

Вот столкнулся с непонятной мне проблемой... У меня есть некоторое количество самописных модулей к нгинксу, которые обеспечивают необходимую функциональность для моего фрихостинга... вроде бы все хорошо, но где-то есть утечка... как найти ее - я придумать так и не смог - все перепроверил, но ничего не нашел... Может у кого-нибудь есть мысли, как можно найти место, где "течет"? Насколько я понимаю, проблема у меня в коде "баннеровставлялки", но там вроде бы негде было ошибиться...

Некое подобие proof of concept этого модуля лежит в аттаче (вдруг поможет?)...

Еще одна проблема (не уверен, что не кореллирует с предыдущей): примерно раз в сутки рабочие процессы нгинкса падают в кору, запускаются новые, но нгинкс перестает отвечать на запросы... то есть accept происходит, но потом соединение просто висит до таймаута со стороны клиента...

Вот bt из коры:

#0 0x0804d0c6 in ngx_chain_update_chains (free=0xad32508, busy=0xad3250c, out=0xbffff9c8, tag=0x807f680) at src/core/ngx_buf.c:192
192             for (cl = *busy; cl->next; cl = cl->next) { /* void */ }
(gdb) bt
#0 0x0804d0c6 in ngx_chain_update_chains (free=0xad32508, busy=0xad3250c, out=0xbffff9c8, tag=0x807f680) at src/core/ngx_buf.c:192 #1 0x0804d4f5 in ngx_output_chain (ctx=0xad32500, in=0x0) at src/core/ngx_output_chain.c:219 #2 0x08065bcf in ngx_http_copy_filter (r=0xabdd308, in=0xad32508) at src/http/ngx_http_copy_filter_module.c:109 #3 0x0806eaee in ngx_http_range_body_filter (r=0xabdd308, in=0x0) at src/http/modules/ngx_http_range_filter_module.c:587 #4 0x0805eb23 in ngx_http_output_filter (r=0xabdd308, in=0xad32508) at src/http/ngx_http_core_module.c:972 #5 0x08063168 in ngx_http_writer (r=0xabdd308) at src/http/ngx_http_request.c:1638 #6 0x08062ccc in ngx_http_request_handler (ev=0x1120) at src/http/ngx_http_request.c:1391 #7 0x080558cc in ngx_event_process_posted (cycle=0x808d028, posted=0x80843b8) at src/event/ngx_event_posted.c:39 #8 0x0805484c in ngx_process_events_and_timers (cycle=0x808d028) at src/event/ngx_event.c:272 #9 0x0805a74d in ngx_worker_process_cycle (cycle=0x808d028, data=0x0) at src/os/unix/ngx_process_cycle.c:728 #10 0x08058c8f in ngx_spawn_process (cycle=0x808d028, proc=0x805a6d7 <ngx_worker_process_cycle>, data=0x0, name=0x80785e7 "worker process", respawn=-3)
   at src/os/unix/ngx_process.c:187
#11 0x0805a0ed in ngx_start_worker_processes (cycle=0x808d028, n=4, type=-3) at src/os/unix/ngx_process_cycle.c:327 #12 0x08059d97 in ngx_master_process_cycle (cycle=0x808d028) at src/os/unix/ngx_process_cycle.c:219 #13 0x0804a5af in main (argc=134750176, argv=0xad32508) at src/core/nginx.c:302
(gdb)

Откуда начинать траблшутинг в этом случае я вообще не представляю... Не знаю, с чем связана такая проблема, но в логах тишина и ничего кроме следующего:

2006/02/19 00:27:38 [alert] 28963#0: worker process 12333 exited on signal 11 (core dumped) 2006/02/19 00:27:38 [alert] 28963#0: worker process 12335 exited on signal 11 (core dumped) 2006/02/19 00:27:39 [alert] 28963#0: worker process 12337 exited on signal 11 (core dumped) 2006/02/19 00:27:39 [alert] 28963#0: worker process 12334 exited on signal 11 (core dumped) 2006/02/19 00:30:04 [info] 12516#0: sigtimedwait() failed (4: Interrupted system call) 2006/02/19 00:30:04 [info] 12517#0: sigtimedwait() failed (4: Interrupted system call) 2006/02/19 00:30:04 [info] 12518#0: sigtimedwait() failed (4: Interrupted system call) 2006/02/19 00:30:04 [info] 12519#0: sigtimedwait() failed (4: Interrupted system call) 2006/02/19 00:40:04 [info] 12516#0: sigtimedwait() failed (4: Interrupted system call) 2006/02/19 00:40:04 [info] 12517#0: sigtimedwait() failed (4: Interrupted system call) 2006/02/19 00:40:04 [info] 12518#0: sigtimedwait() failed (4: Interrupted system call) 2006/02/19 00:40:04 [info] 12694#0: sigtimedwait() failed (4: Interrupted system call) 2006/02/19 00:40:04 [info] 12695#0: sigtimedwait() failed (4: Interrupted system call) 2006/02/19 00:40:04 [info] 12696#0: sigtimedwait() failed (4: Interrupted system call) 2006/02/19 00:40:04 [info] 12697#0: sigtimedwait() failed (4: Interrupted system call) 2006/02/19 00:50:04 [info] 18907#0: sigtimedwait() failed (4: Interrupted system call) 2006/02/19 00:50:04 [info] 18908#0: sigtimedwait() failed (4: Interrupted system call) 2006/02/19 00:50:04 [info] 18909#0: sigtimedwait() failed (4: Interrupted system call) 2006/02/19 00:50:04 [info] 18910#0: sigtimedwait() failed (4: Interrupted system call)

Такая периодичность сообщений связана с тем, что каждые 10 минут делается killall -HUP nginx (кстати, насколько это правильно/неправильно? может стоит дергать только тот процесс, pid которого есть в nginx.pid)?

Заранее прошу извинения за сумбурность изложения, просто приехал с отдыха и получил втык от начальства за даунтайм... и писал на волне переживаний...

--
/Scoundrel    [http://kovyrin.info]

#include <ngx_config.h>
#include <ngx_core.h>
#include <ngx_http.h>


....


static ngx_int_t
generate_top_banner(ngx_http_request_t *r, ngx_chain_t *in, char **buf, int 
*len) {
    char *top_banner;
        int top_banner_size;
    ngx_http_banner_conf_t  *bcf;

    bcf = ngx_http_get_module_main_conf(r, ngx_http_banner_filter_module);

        // Max size
        top_banner_size = SOME_CONSTANT_SIZE;

    // Alloc banner buffer
        *buf = top_banner = ngx_palloc(r->pool, top_banner_size);
        if (top_banner == NULL) {
            return -1;
        }

    ....
        
        *len = sprintf(top_banner, top_banner_template, 
                TOP_URL, city,
                banner1_nick, banner1_num, banner1_age, city,
                banner2_nick, banner2_num, banner2_age, city,
                banner3_nick, banner3_num, banner3_age, city,
                banner4_nick, banner4_num, banner4_age, city,
                banner5_nick, banner5_num, banner5_age, city,
                banner6_nick, banner6_num, banner6_age, city,
                banner7_nick, banner7_num, banner7_age, city
                   ) + 1;
                   
        return 1;
}

static ngx_int_t
ngx_http_banner_body_filter(ngx_http_request_t *r, ngx_chain_t *in)
{
    ngx_buf_t    *b;
    ngx_chain_t   head, tail, *cur;
        
        int top_banner_len;
        char *top_banner;

    if (in == NULL 
                || r->header_only 
                || ngx_strncasecmp(r->headers_out.content_type.data, "text/", 
5) != 0
    ) {
      return ngx_http_next_body_filter(r, in);
    }

    /******* Top banner *******/
    b = ngx_calloc_buf(r->pool);
    generate_top_banner(r, in, &top_banner, &top_banner_len);

    b->memory = 0;
        b->temporary = 1;
        b->last_buf = 0;
    b->pos = top_banner;
    b->last = top_banner + top_banner_len - 1;

    head.buf = b;
        head.next = in;

    /* Find last node */
    cur = in;
        while (cur->next) cur = cur->next;

    /******* Bottom banner *******/
    b = ngx_calloc_buf(r->pool);
    if (b == NULL) {
        return NGX_ERROR;
    }

    b->memory = 1;
        b->last_buf = 1;
    b->pos = bottom_banner;
    b->last = bottom_banner + sizeof(bottom_banner) - 1;
        
    tail.buf = b;
    tail.next = NULL;
    cur->next = &tail;
    cur->buf->last_buf = 0;
    cur->buf->sync = 1;
        
    return ngx_http_next_body_filter(r, &head);
}

static ngx_int_t
ngx_http_banner_header_filter(ngx_http_request_t *r)
{
    ngx_http_variable_value_t host;

    // Get hostname
    if (r->headers_in.host) {
        host.len = r->headers_in.host_name_len;
        host.data = r->headers_in.host->value.data;
    } else {
        host.len = r->server_name.len;
        host.data = r->server_name.data;
    }

    if (r->main == r && 
            !r->header_only && 
            r->headers_out.content_length_n > 0 && 
            ngx_strncasecmp(r->headers_out.content_type.data, "text/", 5) == 0) 
        {
        ngx_http_clear_content_length(r);
        ngx_http_clear_accept_ranges(r);
    }

    return ngx_http_next_header_filter(r);
}

static ngx_int_t
ngx_http_banner_filter_init(ngx_cycle_t *cycle)
{
    ngx_http_next_header_filter = ngx_http_top_header_filter;
    ngx_http_top_header_filter = ngx_http_banner_header_filter;

    ngx_http_next_body_filter = ngx_http_top_body_filter;
    ngx_http_top_body_filter = ngx_http_banner_body_filter;

    return NGX_OK;
}

void
ngx_pool_cleanup_geoip(void *data)
{
    FILE *f;
    GeoIP *clngeo = data;

    if (clngeo != NULL) GeoIP_delete(clngeo);
}

static void *
ngx_http_banner_create_conf(ngx_conf_t *cf)
{
    FILE *f;
    ngx_http_banner_conf_t  *bcf;
        int db_handle;
        struct stat file_info;
        ngx_pool_cleanup_t      *cln;
        
    bcf = ngx_palloc(cf->pool, sizeof(ngx_http_banner_conf_t));
    if (bcf == NULL) {
        return NGX_CONF_ERROR;
    }
        
    // Open database
        db_handle = open(AMATEUR_DB_PATH, O_RDONLY);
        if (db_handle < 0) {
        return NGX_CONF_ERROR;
        }
        
    // Get db size
        if (fstat(db_handle, &file_info) < 0) {
        return NGX_CONF_ERROR;
        }
        
        // Load girls info from database
        bcf->girls_count = file_info.st_size / sizeof(amateur_database_record);
        bcf->girls = ngx_palloc(cf->pool, file_info.st_size);
        if (bcf->girls == NULL) {
        return NGX_CONF_ERROR;
        }

        if (read(db_handle,  bcf->girls, file_info.st_size) < 0) {
        return NGX_CONF_ERROR;
        }
        close(db_handle);
        
        cln = ngx_pool_cleanup_add(cf->pool, 0);
        if (cln == NULL) {
        return NGX_CONF_ERROR;
        }

        bcf->gi = GeoIP_open_type(GEOIP_CITY_EDITION_REV1, GEOIP_STANDARD);
        if (bcf->gi == NULL) {
        return NGX_CONF_ERROR;
        }
        
        cln->handler = ngx_pool_cleanup_geoip;
        cln->data = bcf->gi;

    return bcf;
}



 




Copyright © Lexa Software, 1996-2009.