J'ai configuré un HAProxy sur Ubuntu 14.04 exécutant un serveur principal séparé également sur Ubuntu 14.04 et Apache2.

Lors de l'exécution de requêtes, toutes ces requêtes ne sont pas enregistrées. Même lors de l'exécution de HAProxy en mode débogage, il n'affiche pas toutes les demandes sur le terminal.

J'ai un index.html qui inclut une image. Lorsque je demande la page avec Google Chrome, je peux voir dans l'inspecteur qu'au total 3 fichiers sont demandés (index.html, header.gif et favicon.ico).

HAProxy n'enregistrera cependant que la demande réelle d'index.html et si je recharge la page très rapidement, il n'enregistrera même pas toutes les demandes d'index.html.

J'ai essayé de déboguer à l'aide de socat, mais aucune erreur n'a été enregistrée de cette manière. J'ai essayé de définir le format du journal sur tcplog mais cela n'a pas aidé non plus, toutes les demandes n'ont pas été enregistrées.

Qu'est-ce que je fais mal?

configuration de rsyslogd :

$ModLoad imudp
$UDPServerAddress 127.0.0.1
$UDPServerRun 514

local0.* -/var/log/haproxy/haproxy.log

& ~

Configuration HAProxy :

global
  log 127.0.0.1 local0
  log-send-hostname
  daemon
  maxconn 256
  stats socket    /tmp/haproxy

defaults
  log global
  timeout connect 5000ms
  timeout client 50000ms
  timeout server 50000ms

frontend http-in
  mode http
  option httplog
  # bind to all ip's port 9200
  bind 0.0.0.0:80
  default_backend http-out

backend http-out
  mode http
  balance leastconn
  server web2 xxx.xxx.xxx.xxx:80

journal haproxy

  Sep 17 14:38:16 front2.xxx.net haproxy[5436]: xxx.xxx.xxx.xxx:61745 [17/Sep/2015:14:38:06.771] http-in http-in/ -1/-1/-1/-1/10000 400 187 - - CR-- 2/2/0/0/0 0/0 ""
  Sep 17 14:38:16 front2.xxx.net haproxy[5436]: xxx.xxx.xxx.xxx:61744 [17/Sep/2015:14:38:06.771] http-in http-out/web2 0/0/1/2/10001 200 23198 - - ---- 1/1/0/0/0 0/0 "GET /index.html HTTP/1.1"
  Sep 17 14:38:26 front2.xxx.net haproxy[5436]: xxx.xxx.xxx.xxx:61746 [17/Sep/2015:14:38:06.772] http-in http-in/ -1/-1/-1/-1/20000 400 187 - - CR-- 0/0/0/0/0 0/0 ""

journal apache2

  registered.xxx.net:80 185.92.61.11 - - [17/Sep/2015:14:38:06 +0200] "GET /index.html HTTP/1.1" 200 1192 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.93 Safari/537.36"
  registered.xxx.net:80 185.92.61.11 - - [17/Sep/2015:14:38:06 +0200] "GET /header.gif HTTP/1.1" 200 4145 "http://xxx.xxx.xxx.xxx/index.html" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.93 Safari/537.36"
  registered.xxx.net:80 185.92.61.11 - - [17/Sep/2015:14:38:06 +0200] "GET /favicon.ico HTTP/1.1" 200 17861 "http://xxx.xxx.xxx.xxx/index.html" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.93 Safari/537.36"
answer

Avec toutes les versions HAProxy antérieures à 1.5-dev22, lorsqu'il est utilisé dans mode http, il fonctionnait dans le tunnel"sous-mode" si aucun autre "sous-mode" n'était spécifié. Je me rends compte qu'il n'y a pas vraiment de "sous-mode" dans HAProxy, mais je ne sais pas comment l'appeler autrement. Les docs n'utilisent que le mot "mode", mais je trouve cela encore plus déroutant...

Dans tous les cas, en tunnel"sous-mode", seules la première demande et réponse sont traitées, et tout le reste est transmis sans aucune analyse. Ce mode ne doit pas être utilisé car il crée beaucoup de problèmes avec la journalisation et le traitement HTTP.

À partir de 1.5-dev22, le "sous-mode" par défaut est passé de tunnelà keep alive, ce qui signifie que toutes les demandes et réponses sont traitées et que les connexions restent ouvertes mais inactives entre les réponses et les nouvelles demandes.

Cela peut être modifié en utilisant les mots - clés option http-keep-alive, option http-tunnel, option httpclose, option http-server-closeet option forceclosedans les frontends et les backends, le mode effectif (ou "sous-mode" si vous préférez) étant décrit dans la documentation. Dans la section 4, il y a un tableau qui montre le "sous-mode" effectif en fonction des options définies dans le frontend et sauvegardées utilisées pour une connexion particulière.

Pour être complet, voici la section pertinente de la documentation, y compris le tableau et ses différents "sous-modes", tels qu'ils existent au moment de la rédaction de cet article (1.5.14) :

In HTTP mode, the processing applied to requests and responses flowing over
a connection depends in the combination of the frontend's HTTP options and
the backend's. HAProxy supports 5 connection modes :

  - KAL : keep alive ("option http-keep-alive") which is the default mode : all
    requests and responses are processed, and connections remain open but idle
    between responses and new requests.

  - TUN: tunnel ("option http-tunnel") : this was the default mode for versions
    1.0 to 1.5-dev21 : only the first request and response are processed, and
    everything else is forwarded with no analysis at all. This mode should not
    be used as it creates lots of trouble with logging and HTTP processing.

  - PCL: passive close ("option httpclose") : exactly the same as tunnel mode,
    but with "Connection: close" appended in both directions to try to make
    both ends close after the first request/response exchange.

  - SCL: server close ("option http-server-close") : the server-facing
    connection is closed after the end of the response is received, but the
    client-facing connection remains open.

  - FCL: forced close ("option forceclose") : the connection is actively closed
    after the end of the response.

The effective mode that will be applied to a connection passing through a
frontend and a backend can be determined by both proxy modes according to the
following matrix, but in short, the modes are symmetric, keep-alive is the
weakest option and force close is the strongest.

                          Backend mode

                | KAL | TUN | PCL | SCL | FCL
            ----+-----+-----+-----+-----+----
            KAL | KAL | TUN | PCL | SCL | FCL
            ----+-----+-----+-----+-----+----
            TUN | TUN | TUN | PCL | SCL | FCL
 Frontend   ----+-----+-----+-----+-----+----
   mode     PCL | PCL | PCL | PCL | FCL | FCL
            ----+-----+-----+-----+-----+----
            SCL | SCL | SCL | FCL | SCL | FCL
            ----+-----+-----+-----+-----+----
            FCL | FCL | FCL | FCL | FCL | FCL