2011-12-08 13 views
6

Napisałem bardzo prostą obsługę języka nginx, po prostu wypisz trochę tekstu (rozmiar od 100B do 10KB).Filtr gzip Nginx nie działa z moim niestandardowym handlerkiem

kod działa poprawnie z nginx (ver 1.0.6)

ale znalazłem filtr gzip nie może pracować z obsługi.

Po włączeniu gzip w pliku nginx.conf (w sekcji http) plik gzip działa ze statycznymi plikami html.

, ale odpowiedź programu obsługi nie jest skompresowana za pomocą programu gzip.

Po wielu poszukiwaniach wciąż nie mogę znaleźć odpowiedzi.

jakieś komentarze? wielkie dzięki. :-)

//my code : 
static ngx_int_t ngx_http_test_handler(ngx_http_request_t *r){ 

    ngx_chain_t out; 
    ngx_buf_t *b; 

    b = ngx_pcalloc(r->pool, sizeof(ngx_buf_t)); 

    ...... 
    //writing text to buffer 
    ...... 
    r->headers_out.status = NGX_HTTP_OK; 
    r->headers_out.content_length_n = len; 
    r->headers_out.content_type.len = sizeof("text/html")-1; 
    r->headers_out.content_type.data = (u_char *) "text/html"; 

    out.buf = b; 
    out.next = NULL; 
    return ngx_http_output_filter(r, &out); 
} 

Odpowiedz

0

Po pierwsze, gdzie jest twój wezwanie do ngx_http_send_header(r);?

Czy inicjujesz członków ngx_buf_t *b?

Czy kodowanie treści dla zestawu żądań jest ustawione?

Czy Twój handler powoduje błąd? Jeśli tak, żadne filtry nie będą wywoływane?

innych ograniczeń, które należy spełnić, aby zapewnić działa filtr gzip (zamiast być zablokowane) po wywołaniu przez przewodnika obejmują

  • Gzip musi być włączone w pliku konfiguracyjnym nginx zobaczyć here
  • stan wysłany nagłówek powinien być NGX_HTTP_OK, NGX_HTTP_FORBIDDEN lub NGX_HTTP_NOT_FOUND
  • kodowanie treści powinny być ustawione (the ngx_table_elt_t * musi istnieć, a wartość powinna mieć niezerowej długość
  • firmy T content_length_n powinien być ważny (nie -1) i powinna być większa lub równa wartości gzip_min_length określonej w pliku konfiguracyjnym
  • ngx_http_test_content_type musi powrócić non zerowej np poprawny typ kontekstowe
  • Żądanie musi mieć nagłówek i body

Więcej informacji na temat modułu Nginx, mechanizmu wypełniania i obsługi modułu można znaleźć pod numerem here.

1

Jeśli nie jest za późno, miałem ten sam problem z moim filtrem.

Problem związany jest z tym, że zmieniono odpowiedź typu zawartości. Gzip sprawdza Content-Type w content_type_len i content_type_lowcase, aby zdecydować, czy odpowiedź musi być Gziped. Kod ten powinien działać:

r->headers_out.content_type_len = strlen("text/html"); 
r->headers_out.content_type.len = strlen("text/html"); 
r->headers_out.content_type.data = (u_char *) "text/html"; 
r->headers_out.content_type_lowcase = NULL; 

Aby zrozumieć, dlaczego ta praca kod, trzeba wziąć pod uwagę, że filtr Gzip wywołuje w pierwszej metodą ngx_http_test_content_type włączyć gzip na odpowiedź. Możesz zobaczyć źródło tutaj: http://lxr.evanmiller.org/http/source/http/ngx_http_core_module.c#L1659

0

Powyższa odpowiedź wydaje się ... niedokładna.

Kod, który sprawdza ten znajduje się w okolicach linii 250 z src/http/modules/ngx_http_gzip_filter_module.c i czyta:

if (!conf->enable 
    || (r->headers_out.status != NGX_HTTP_OK 
     && r->headers_out.status != NGX_HTTP_FORBIDDEN 
     && r->headers_out.status != 207 
     && r->headers_out.status != NGX_HTTP_NOT_FOUND) 
    || (r->headers_out.content_encoding 
     && r->headers_out.content_encoding->value.len) 
    || (r->headers_out.content_length_n != -1 
     && r->headers_out.content_length_n < conf->min_length) 
    || ngx_http_test_content_type(r, &conf->types) == NULL 
    || r->header_only) 
{ 
    return ngx_http_next_header_filter(r); <-- this is the line you want to breakpoint! 
} 

Jeśli mam poprawnie czytać, warunki są następujące:

  • stanu HTTP musi być 200 , 403 lub 404.
  • content_encoding musi nie ustawić (co ma sens: gzipping ustawia kodowanie treści na "gzip")
  • content_length_n, jeśli jest ustawiony, musi być większy niż minimalna długość (domyślnie 20). Niedopuszczalne jest ustawienie długości treści.
  • content_type musi znajdować się na prawidłowej liście. Domyślnie akceptowane jest tylko "text/html", ale inne typy można ustawić za pomocą opcji konfiguracyjnej gzip_types. Jeśli lista zawiera "*", dowolny typ zawartości, w tym żaden w ogóle, jest OK.
  • Musi być jakieś ciało skompresować

od wersji 1.7.10 The return powyżej jest na linii 257. Ustawienie „demon off”, działający pod gdb i b ngx_http_gzip_filter_module.c:257 będzie można zobaczyć dokładnie, kiedy i jak nie działają kontrole. (Powinieneś prawdopodobnie skompilować ze źródła, jeśli próbujesz tego ...)

Powiązane problemy