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

Вести журнал всего тела POST с помощью HAProxy?

Я пытаюсь отследить некоторые проблемы с тем, как клиент javascript взаимодействует с сервером приложений, и хотел бы видеть всю полезную нагрузку http (заголовки, тело и все), которые передаются туда и обратно.

Так получилось, что перед сервером приложений уже есть haproxy-сервер, поэтому я надеялся, что смогу использовать haproxy для предоставления соответствующих журналов. Очевидно, это было бы плохо включать в производственной среде, но у меня есть клон всей среды, которую можно изолировать, пока я занимаюсь отладкой.

Есть ли способ заставить haproxy регистрировать всю полезную нагрузку http для запросов POST, идущих на конкретный внутренний сервер?

Судя по всему, начиная с версии 1.6.0 (октябрь 2015 г.) теперь можно. Есть новая директива:

option http-buffer-request

То, что вы включаете во внешний или внутренний интерфейс, чтобы предоставить HAProxy доступ к телу. И вы используете req.body для доступа к нему. Вот краткое изложение конфигурации, которую я использовал:

global
        log     127.0.0.1 local0
        debug
        maxconn 2048
        ulimit-n 8012
#        ...

defaults
    mode http
    option httplog
    log-format frontend:%f/%H/%fi:%fp\ GMT:%T\  body:%[capture.req.hdr(0)]\ request:%r
    option dontlognull
#   ...

frontend www-http
   log global
   option http-buffer-request
# id=0 to store body for logging
   declare capture request len 40000
   bind 7.7.7.7:8007 
   http-request capture req.body id 0

   default_backend www-backend

backend www-backend
    mode http
    option forwardfor
#   ...

Haproxy не имеет возможности регистрировать содержимое POST или тела HTTP.

Вместо этого используйте Wireshark.

Это может помочь, убедитесь, что строки находятся в том же порядке. Я протестировал его внутри внешнего интерфейса и блоков прослушивания, я знаю, как это будет работать в бэкэнде:

    ## ------ LOG ----------
    #no log  ####this is real line USE THIS to disable log!!! when commented allows log
    mode http
    option http-buffer-request
    declare capture request len 40000000
    http-request capture req.body id 0
    capture request header user-agent len 150
    capture request header Host len 15
    log-format '{"srcIP":"%[src]","backend":"%s","bIP":"%si","bPORT":"%sp","method":"%[capture.req.method]","user-agent":"%[capture.req.hdr(1),json(utf8s)]","uri":"%[capture.req.uri]","body":"%[capture.req.hdr(0)]"}'

    ## --------------------

Это не совсем то, о чем вы просили, поскольку он будет регистрировать все запросы, а не только POST, но вы можете позже использовать grep для файла журнала для «POST», поскольку он сохраняет метод запроса в журнале.