Назад | Перейти на главную страницу

Varnish до того, как HAProxy, кажется, повторно использует (неправильное) соединение с сервером

У нас есть следующая настройка: Nginx -> Varnish -> HAProxy -> App Server A / App Server B.

Большинство обрабатываемых нами запросов передаются HAProxy на сервер приложений A. Это делается на основе значений заголовка хоста. Несколько хостов должны быть перенаправлены на сервер приложений B. Трафик на сервер приложений B очень низкий.

Большинство запросов работают нормально. Время от времени запросы, которые должны быть переданы на сервер приложений B, дают код состояния 404. Эти запросы отображаются в журналах Nginx, Varnish и App Server A, но не HAProxy.

Запросы к серверу приложений A и B, которые работают нормально, должным образом регистрируются HAProxy.

Кажется, что Varnish повторно использует подключения к серверу приложений A, установленному HAProxy, предотвращая повторную оценку этих запросов и их отправку на соответствующий сервер. Это вероятная причина моих проблем? Есть ли способ заставить Varnish повторно подключиться к бэкэнду или HAProxy оставаться между этими серверами? Каковы преимущества / недостатки каждого решения?

Спасибо!

Редактировать:

Это часть моего файла журнала Varnish:

   12 SessionClose c Connection: close
   12 StatSess     c 127.0.0.1 54331 0 1 1 0 0 1 652 0
    0 CLI          - Rd ping
    0 CLI          - Wr 200 PONG 1329319173 1.0
   12 SessionOpen  c 127.0.0.1 54334 :6081
   12 ReqStart     c 127.0.0.1 54334 1884874126
   12 RxRequest    c GET
   12 RxURL        c /path/to/page
   12 RxProtocol   c HTTP/1.0
   12 RxHeader     c Host: www.example.com
   12 RxHeader     c Connection: close
   12 RxHeader     c User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.77 Safari/535.7
   12 RxHeader     c Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
   12 RxHeader     c Referer: http://www.example.com/path/to/previous/
   12 RxHeader     c Accept-Encoding: gzip,deflate,sdch
   12 RxHeader     c Accept-Language: en-US,en;q=0.8
   12 RxHeader     c Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
   12 RxHeader     c Cookie: 71666-bl0098f964_r=0; 71666-bl0098f964_s=145818062; _advocaten-cms_session=BAh7BjoPc2Vzc2lvbl9pZCIlMmRhNGFhMWY3MDRlMzljNGRkZTQ0MTI3MjJhN2E2NzY%3D--5d089ff2c72e4ad91d415cb14020834387c2077e; 71666-bl0098f964_i=272; 71666-bl0098f964_vt=1329319215438
   12 VCL_call     c recv
   12 VCL_return   c pass
   12 VCL_call     c hash
   12 VCL_return   c hash
   12 VCL_call     c pass
   12 VCL_return   c pass
   12 Backend      c 14 default default
   14 TxRequest    b GET
   14 TxURL        b /path/to/page/
   14 TxProtocol   b HTTP/1.0
   14 TxHeader     b Host: www.example.com
   14 TxHeader     b User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.77 Safari/535.7
   14 TxHeader     b Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
   14 TxHeader     b Referer: http://www.example.com/path/to/previous/
   14 TxHeader     b Accept-Encoding: gzip,deflate,sdch
   14 TxHeader     b Accept-Language: en-US,en;q=0.8
   14 TxHeader     b Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
   14 TxHeader     b Cookie: 71666-bl0098f964_r=0; 71666-bl0098f964_s=145818062; _advocaten-cms_session=BAh7BjoPc2Vzc2lvbl9pZCIlMmRhNGFhMWY3MDRlMzljNGRkZTQ0MTI3MjJhN2E2NzY%3D--5d089ff2c72e4ad91d415cb14020834387c2077e; 71666-bl0098f964_i=272; 71666-bl0098f964_vt=1329319215438
   14 TxHeader     b X-Forwarded-For: 127.0.0.1
   14 TxHeader     b X-Varnish: 1884874126
   14 RxProtocol   b HTTP/1.1
   14 RxStatus     b 404
   14 RxResponse   b Not Found
   14 RxHeader     b Date: Wed, 15 Feb 2012 15:20:06 GMT
   14 RxHeader     b Server: Apache
   14 RxHeader     b Vary: Accept-Encoding
   14 RxHeader     b Content-Encoding: gzip
   14 RxHeader     b Content-Length: 243
   14 RxHeader     b Connection: close
   14 RxHeader     b Content-Type: text/html; charset=iso-8859-1
   12 TTL          c 1884874126 RFC 120 1329319174 0 0 0 0
   12 VCL_call     c fetch
   12 VCL_return   c pass
   12 ObjProtocol  c HTTP/1.1
   12 ObjStatus    c 404
   12 ObjResponse  c Not Found
   12 ObjHeader    c Date: Wed, 15 Feb 2012 15:20:06 GMT
   12 ObjHeader    c Server: Apache
   12 ObjHeader    c Vary: Accept-Encoding
   12 ObjHeader    c Content-Encoding: gzip
   12 ObjHeader    c Content-Type: text/html; charset=iso-8859-1
   14 Length       b 243
   14 BackendClose b default
   12 VCL_call     c deliver
   12 VCL_return   c deliver
   12 TxProtocol   c HTTP/1.1
   12 TxStatus     c 404
   12 TxResponse   c Not Found
   12 TxHeader     c Server: Apache
   12 TxHeader     c Vary: Accept-Encoding
   12 TxHeader     c Content-Encoding: gzip
   12 TxHeader     c Content-Type: text/html; charset=iso-8859-1
   12 TxHeader     c Content-Length: 243
   12 TxHeader     c Date: Wed, 15 Feb 2012 15:19:34 GMT
   12 TxHeader     c X-Varnish: 1884874126
   12 TxHeader     c Age: 0
   12 TxHeader     c Via: 1.1 varnish
   12 TxHeader     c Connection: close
   12 Length       c 243
   12 ReqEnd       c 1884874126 1329319174.638826609 1329319174.639825106 0.000061750 0.000943899 0.000054598
   12 SessionClose c Connection: close
   12 StatSess     c 127.0.0.1 54334 0 1 1 0 1 1 260 243
    0 CLI          - Rd ping
    0 CLI          - Wr 200 PONG 1329319176 1.0

HAProxy - это серверная часть по умолчанию.

Может ли это иметь какое-то отношение к тому факту, что HAProxy не регистрирует последующие запросы для того же сеанса? Я предположил, что, поскольку HAProxy не регистрировал их, они не проходили через него, но, согласно документации, это предполагаемое поведение. Поскольку Varnish является клиентом для HAProxy, несколько запросов (от нескольких посетителей) могут принадлежать одному сеансу?

Изменить 2: похоже, что если я добавлю

option forceclose
option http-pretend-keepalive

в моей конфигурации HAProxy проблема исчезает или становится намного реже. Это похоже на решение более глубокой проблемы, связанной с взаимодействием Varnish / HAProxy. Лак получает Connection: Close заголовок, но не указывает этот заголовок в запросе к бэкэнду. Принудительное закрытие соединения гарантирует, что HAProxy будет оценивать каждый запрос от Varnish.