LINUX.ORG.RU
решено ФорумAdmin

squid не понимает nginx


0

1

Недавно узнал, что сайт, поднятый на nginx невозможно открыть через squid. Возникает ошибка:

Получен недопустимый ответ при попытке обработки запроса:

    GET / HTTP/1.1
    Host: example.com
    User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:19.0) Gecko/20100101 Firefox/19.0
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3
    Accept-Encoding: gzip, deflate
    Connection: keep-alive

Ответ HTTP, полученный от сервера, не может быть распознан, или он был неверно сформирован. Пожалуйста, свяжитесь с оператором сайта.

Погуглив по интернету, пришёл к выводу, что squid не понимает какие-то из заголовков nginx. Поставил squid-у debug_options = ALL,9 и нашёл вот такое:

2013/03/23 20:41:14.504| parsing hdr: (0x7fc3951b20a0)
Server: nginx/1.2.4
Date: Sat, 23 Mar 2013 16:41:12 GMT
Content-Type: text/html
Content-Length: 612
Connection: keep-alive
ETag: "50ee84d5-264"
Set-Cookie: PHPSession=1;path=/
2013/03/23 20:41:14.504| WARNING: HTTP header contains NULL characters {Server: nginx/1.2.4
Date: Sat, 23 Mar 2013 16:41:12 GMT
Content-Type: text/html
Content-Length: 612
Connection: keep-alive
ETag: "50ee84d5-264"
Set-Cookie: PHPSession=1;path=/}
NULL
{Server: nginx/1.2.4
Date: Sat, 23 Mar 2013 16:41:12 GMT
Content-Type: text/html
Content-Length: 612
Connection: keep-alive
ETag: "50ee84d5-264"
Set-Cookie: PHPSession=1;path=/
2013/03/23 20:41:14.504| cleaning hdr: 0x7fc3951b20a0 owner: 3
2013/03/23 20:41:14.504| init-ing hdr: 0x7fff25ed34c0 owner: 3
2013/03/23 20:41:14.504| cleaning hdr: 0x7fff25ed34c0 owner: 3
2013/03/23 20:41:14.504| cbdataFree: 0x7fc395192738
2013/03/23 20:41:14.504| cbdataFree: Freeing 0x7fc395192738
2013/03/23 20:41:14.504| cleaning hdr: 0x7fc3951b20a0 owner: 3
2013/03/23 20:41:14.504| 0x7fc3951b20a0 lookup for 41
2013/03/23 20:41:14.504| 0x7fc3951b20a0 lookup for 9
2013/03/23 20:41:14.504| 0x7fc3951b20a0 lookup for 23
2013/03/23 20:41:14.504| HttpMsg::parse: cannot parse isolated headers in 'HTTP/1.1 200 OK
Server: nginx/1.2.4
Date: Sat, 23 Mar 2013 16:41:12 GMT
Content-Type: text/html
Content-Length: 612
Connection: keep-alive
ETag: "50ee84d5-264"
Set-Cookie: PHPSession=1;path=/'
2013/03/23 20:41:14.504| processReplyHeader: Non-HTTP-compliant header: 'HTTP/1.1 200 OK
Server: nginx/1.2.4
Date: Sat, 23 Mar 2013 16:41:12 GMT
Content-Type: text/html
Content-Length: 612
Connection: keep-alive
ETag: "50ee84d5-264"
Set-Cookie: PHPSession=1;path=/'

Откуда в заголовке взялся NULL? Что не понимает в етом ответе squid?

Недавно узнал, что сайт, поднятый на nginx невозможно открыть через squid

Толстое 4.2. Каждый день открываю. В error log'е nginx'а есть что интересное?

router ★★★★★ ()
Ответ на: комментарий от router

Нет, ошибки там в основном по php и не связаны с запросами со squid.

Счас откопал вот что: nginx действительно передаёт нулевой символ после Set-Cookie: PHPSession=1;path=/

Ошибка пропадает, если squid шлёт заголовок «Pragma: no-cache». Без етого заголовка nginx присылает вышеописанную строку. Происходит ето раз от разу

abr_linux ()
Ответ на: комментарий от abr_linux

Счас откопал вот что: nginx действительно передаёт нулевой символ после Set-Cookie: PHPSession=1;path=/

Так может не nginx, а php?

router ★★★★★ ()
Ответ на: комментарий от router

Так может не nginx, а php?

Загружаю t.example.com, которого нет конфиге nginx, мне должна выдатся страница «Welcome to NginX», но проблема та же. А там PHP и близко нет

abr_linux ()
Ответ на: комментарий от abr_linux

Загружаю t.example.com, которого нет конфиге nginx, мне должна выдатся страница «Welcome to NginX», но проблема та же.

Без squid проверял? В общем случае должна выдаваться не тестовая страница, а default site, а он может быть тем же самым сайтом с php.

Я бы всё же посмотрел в сторону php приложения - если можно найти в коде где устанавливаются куки, можно вывести в отладочный лог дамп подобной строки и увидеть, есть там null или нет

router ★★★★★ ()
Ответ на: комментарий от router

Без squid проверял?

Без сквида работает. Так бы и не заметил, если б не сказали люди, что с прокси проблемы. Но надо настроить именно наш сервак. У нас много клиентов, которые сидят через squid. Сайт посещаемый.

В общем случае должна выдаваться не тестовая страница, а default site

Счас пока тестовая выдаётся. Default-site пока не делал

Я бы всё же посмотрел в сторону php приложения

Тоже покопаюсь. Но почему тогда могут не работать сайты без php, типа стартовой страницы?

Кстати, конфиг:

# cat /usr/local/nginx/conf/nginx.conf
user			www-data;
worker_processes	16;

error_log	/var/log/nginx/error.log;
pid		/tmp/nginx.pid;

events {
    worker_connections	10000;
    use			epoll;
}

http {
    perl_set $md5_uri 'sub { 
      use Digest::MD5 qw(md5_hex); 
        my $r = shift; 
        my $uri=$r->uri; 
        my $args=$r->args; 
	#if ($args){ 
    	#    $uri=$uri."?".$args; 
	#} 
        return md5_hex($uri); 
     }';

    server_tokens off;

    
    include		mime.types;
    default_type	application/octet-stream;
    
    sendfile on;

    gzip		off;
    gzip_http_version	1.0;
    gzip_proxied	any;
    gzip_min_length	1024;
    gzip_buffers	4 32k;
    gzip_types		text/plain application/xml application/x-javascript text/javascript text/css text/js;
    
    client_max_body_size	100m;

    include		koi-win;
    include		win-utf;

    access_log	off;
    proxy_redirect      off;
    proxy_set_header    Host	    $host;
    proxy_set_header    X-Real-IP	$remote_addr;
    proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_buffer_size	256k;
    proxy_buffers	8 256k;
    proxy_read_timeout		600;
    fastcgi_read_timeout	600;
    server_names_hash_bucket_size 256;

    ### Template for PHP-FPM site ###
    include /usr/local/nginx/conf/conf.d/*;
    include /usr/local/nginx/conf/sites-enabled/*;
}

# cat /usr/local/nginx/conf/conf.d/default.conf
server {
    listen       80;
    server_name  localhost;

    #charset koi8-r;
    #access_log  /var/log/nginx/access.log;

    location / {
        root   /usr/local/nginx/html;
        index  index.html index.htm;
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    #}

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    #location ~ \.php$ {
    #    root           html;
    #    fastcgi_pass   127.0.0.1:9000;
    #    fastcgi_index  index.php;
    #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
    #    include        fastcgi_params;
    #}

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    #    deny  all;
    #}
}
# cat upstream.conf 
upstream memcached_upstream {
	server 127.0.0.1:11212;
}

upstream php_upstream {
	server unix:/data/nfs/example.com/tmp/php-fpm.sock;
}

upstream php_upstream_example {
	server 127.0.0.1:9002;
}

upstream php_upstream_zbbx {
	server 127.0.0.1:9003;
}

upstream php_upstream_ex {
	server unix:/data/nfs/ex/tmp/fcgiwrap.sock;
}

abr_linux ()
Ответ на: комментарий от abr_linux

Это я так, на всякий случай спросил. Гораздо интереснее, после какой строки выдаётся null, когда открываешь сайт без php ( t.example.com ). И что при этом говорит лог squid

router ★★★★★ ()
Ответ на: комментарий от router

Вот запрос:

2013/03/23 22:51:54.750| cleaning hdr: 0x7fffdf252890 owner: 2
2013/03/23 22:51:54.750| destroying entry 0x7f0b6928d700: 'Host: t.example.com'
2013/03/23 22:51:54.750| destroying entry 0x7f0b6932ef90: 'User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:19.0) Gecko/20100101 F$
2013/03/23 22:51:54.750| destroying entry 0x7f0b693637a0: 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'
2013/03/23 22:51:54.750| destroying entry 0x7f0b6932d230: 'Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3'
2013/03/23 22:51:54.750| destroying entry 0x7f0b69344570: 'Accept-Encoding: gzip, deflate'
2013/03/23 22:51:54.750| destroying entry 0x7f0b69345d00: 'Cookie: __utma=40218045.1150214936.1364064143.1364064143.1364064143.1; __utmb$
2013/03/23 22:51:54.750| destroying entry 0x7f0b6932d2d0: 'Pragma: no-cache'
2013/03/23 22:51:54.750| destroying entry 0x7f0b6932fe60: 'Via: 1.1 localhost (squid/3.1.20)'
2013/03/23 22:51:54.750| destroying entry 0x7f0b69360170: 'X-Forwarded-For: 127.0.0.1'
2013/03/23 22:51:54.750| destroying entry 0x7f0b69305bd0: 'Cache-Control: no-cache'
2013/03/23 22:51:54.750| destroying entry 0x7f0b6932ed70: 'Connection: keep-alive'
2013/03/23 22:51:54.750| cleaning hdr: 0x7fffdf252890 owner: 2
2013/03/23 22:51:54.750| httpSendRequest: FD 10:
GET / HTTP/1.1
Host: t.example.com
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:19.0) Gecko/20100101 Firefox/19.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Cookie: __utma=40218045.1150214936.1364064143.1364064143.1364064143.1; __utmb=40218045.1.10.1364064143; __utmc=40218045; __utmz=40218045$
Pragma: no-cache
Via: 1.1 localhost (squid/3.1.20)
X-Forwarded-For: 127.0.0.1
Cache-Control: no-cache
Connection: keep-alive


2013/03/23 22:51:54.750| comm_write: FD 10: sz 615: asynCall 0x7f0b69349320*1
2013/03/23 22:51:54.750| commSetSelect(FD 10,type=2,handler=1,client_data=0x7f0b61a13458,timeout=0)
2013/03/23 22:51:54.750| leaving SomeCommConnectHandler(FD 10, data=0x7f0b68f59008, lookup_wait=275)
2013/03/23 22:51:54.750| cbdataUnlock: 0x7f0b68f59008=2
2013/03/23 22:51:54.750| Engine 0x7fffdf252f40 is idle.
2013/03/23 22:51:54.750| Engine 0x7fffdf252f00 is idle.

Вот ответ:

2013/03/23 22:51:54.815| ctx: enter level  0: 'http://t.example.com/'
2013/03/23 22:51:54.815| processReplyHeader: key '202C61692C19B639E15785AB1A5E2434'
2013/03/23 22:51:54.815| init-ing hdr: 0x7f0b6921b980 owner: 3
2013/03/23 22:51:54.815| 0x7f0b6921b980 lookup for 41
2013/03/23 22:51:54.815| 0x7f0b6921b980 lookup for 9
2013/03/23 22:51:54.816| 0x7f0b6921b980 lookup for 23
2013/03/23 22:51:54.816| parsing hdr: (0x7f0b6921b980)
Server: nginx
Date: Sat, 23 Mar 2013 18:51:52 GMT
Content-Type: text/html
Content-Length: 612
Connection: keep-alive
ETag: "50ee84d5-264"
Set-Cookie: PHPSession=1;path=/
2013/03/23 22:51:54.816| WARNING: HTTP header contains NULL characters {Server: nginx
Date: Sat, 23 Mar 2013 18:51:52 GMT
Content-Type: text/html
Content-Length: 612
Connection: keep-alive
ETag: "50ee84d5-264"
Set-Cookie: PHPSession=1;path=/}
NULL
{Server: nginx
Date: Sat, 23 Mar 2013 18:51:52 GMT
Content-Type: text/html
Content-Length: 612
Connection: keep-alive
ETag: "50ee84d5-264"
Set-Cookie: PHPSession=1;path=/
2013/03/23 22:51:54.816| cleaning hdr: 0x7f0b6921b980 owner: 3
2013/03/23 22:51:54.816| init-ing hdr: 0x7fffdf252b50 owner: 3
2013/03/23 22:51:54.816| cleaning hdr: 0x7fffdf252b50 owner: 3
2013/03/23 22:51:54.816| cbdataFree: 0x7f0b69346f58
2013/03/23 22:51:54.816| cbdataFree: Freeing 0x7f0b69346f58
2013/03/23 22:51:54.816| cleaning hdr: 0x7f0b6921b980 owner: 3
2013/03/23 22:51:54.816| 0x7f0b6921b980 lookup for 41
2013/03/23 22:51:54.816| 0x7f0b6921b980 lookup for 9
2013/03/23 22:51:54.816| 0x7f0b6921b980 lookup for 23
2013/03/23 22:51:54.816| HttpMsg::parse: cannot parse isolated headers in 'HTTP/1.1 200 OK
Server: nginx
Date: Sat, 23 Mar 2013 18:51:52 GMT
Content-Type: text/html
Content-Length: 612
Connection: keep-alive
ETag: "50ee84d5-264"
Set-Cookie: PHPSession=1;path=/'
2013/03/23 22:51:54.816| processReplyHeader: Non-HTTP-compliant header: 'HTTP/1.1 200 OK
Server: nginx
Date: Sat, 23 Mar 2013 18:51:52 GMT
Content-Type: text/html
Content-Length: 612
Connection: keep-alive
ETag: "50ee84d5-264"
Set-Cookie: PHPSession=1;path=/'
2013/03/23 22:51:54.816| Server.cc(139) setVirginReply: 0x7f0b68bb7bc8 setting virgin reply to 0x7f0b6921b970
2013/03/23 22:51:54.816| StoreEntry::replaceHttpReply: http://t.example.com/

То есть, в етой строке глюк:

Set-Cookie: PHPSession=1;path=/

Ето запрос на сайт без php

abr_linux ()
Последнее исправление: abr_linux (всего исправлений: 1)
Ответ на: комментарий от abr_linux

Хм.. А куки странные какие-то. PHPSession даже не гуглится. Поищу я, пожалуй, по нашим сайтам и задам вопрос программистам

abr_linux ()
Ответ на: комментарий от abr_linux

Set-Cookie: PHPSession=1;path=/}

Что и требовалось доказать. Ищи где устанавливается эта кука.

Хм.. А куки странные какие-то. PHPSession даже не гуглится. Поищу я, пожалуй, по нашим сайтам и задам вопрос программистам

Имя кукисов может быть любым, и решает это php программист. Т.е. проблема скорее всего в кривом php приложении, установленном на сайте

То есть, в етой строке глюк:
Ето запрос на сайт без php

Это не глюк, а объективная реальность, данная нам в логе squid :) Говорю ж, запрос пошёл к default site. Это не какой-то специальный virtula host, а просто тот virtual host'ов, который волей случая оказался дефолтным. Если ты ни один из virtual host'ов явно не прописал как дефолтный в конфиге, то берётся первый же из списка сайтов, отсортированного по имени. ЕМНИП,

router ★★★★★ ()
Ответ на: комментарий от router

З.Ы. я обычно в конфиге каждого virtual host'а прописываю отдельный для этого сайта access log и error log, и простым grep'ом могу определить, к какому именно virtual host'у был запрос

router ★★★★★ ()
Ответ на: комментарий от router

Если ты ни один из virtual host'ов явно не прописал как дефолтный в конфиге, то берётся первый же из списка сайтов, отсортированного по имени. ЕМНИП

Так, а первый, как раз, и описан в /usr/local/nginx/conf/conf.d/default.conf, который я выше выложил. Они и возвращает /usr/local/nginx/html/index.html, который и есть «Welcome to Nginx». Собственно, тут и гадать не надо, именно ето страница-то и появляется, если запрос приходит на несуществующий сайт.

А что касается найденного куки, я нашёл его... в самом коде nginx. Уже не помню, кто и откуда качал исходники, факт в том, что в модулях лежал какой-то левый файл, у которого и был етот PHPSession и много других интересных строк. Счас обновил nginx с официального сайта. Пока несколько минут полёт нормальный

abr_linux ()
Последнее исправление: abr_linux (всего исправлений: 2)
Ответ на: комментарий от Komintern

Там какой-то дополнительный файл в модулях лежал. Путь: src/nginx-1.2.4/src/http/modules/ngx_http_suub_filter_module.c

Начинается с:

/*
 * да это же бубльгум! (с)
 * 
 * Таити-Таити, да не были мы ни на каком Таити.
 * 
 */

В гугле такого нет. Какой-то очень специфический, судя по всему

abr_linux ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.