Тайм-аут HAproxy (ошибка 504) с большими телами POST

У меня есть 3 веб-сервера nodejs, развернутых на ящике ubuntu, и HAproxy для балансировки нагрузки этих серверов на одном ящике. HAproxy прослушивает порт 80 (http) и 443 (https, с завершением SSL). Между сервером HAproxy и веб-серверами нет SSL.

Вызов POST к одному из api без SSL проходит с любым значением длины содержимого, но когда я пытаюсь выполнить вызов POST с длиной содержимого больше 8055 на HAproxy с SSL-соединением (порт 443), время HAproxy выдача ошибки 504 Gateway Timeout.

Кроме того, если я даю заголовок «Expect: 100 continue» команде curl, сервер отвечает с некоторой задержкой, которой я не хочу существовать. Вот как выглядит конфигурационный файл HAproxy:

global
    stats socket /var/run/haproxy.sock mode 0777
    log  127.0.0.1  local0 info
    log  127.0.0.1  local1 info
    chroot   /usr/share/haproxy
    uid  nobody
    gid  nobody
    nbproc 1
    daemon  
    maxconn 50000

frontend localnodes:https
    bind *:443 ssl crt /etc/ssl/private/443_private_ssl_in.pem no-sslv3
    mode http
    reqadd X-Forwarded-Proto:\ https
    default_backend nodes
    timeout client 30000

frontend localnodes-http
    bind *:80
    mode http
    reqadd X-Forwarded-Proto:\ http
    default_backend nodes
    timeout client 30000

backend nodes
    mode http
    balance roundrobin
    option forwardfor
    http-request set-header X-Forwarded-Port %[dst_port]
    http-request add-header X-Forwarded-Proto https if { ssl_fc }
    option httpchk HEAD / HTTP/1.1\r\nHost:localhost
    log global
    timeout connect 3000
    timeout server 30000
    option httplog
    option ssl-hello-chk

    option httpchk GET /

    http-check expect status 404
    server nodejsweb01 127.0.0.1:8000 check  
    server nodejsweb02 127.0.0.1:8001 check 
    server nodejsweb03 127.0.0.1:8002 check

Я удостоверился, что веб-серверы nodejs позади не имеют проблем, они работают нормально. Я попытался увеличить период тайм-аута сервера, но безрезультатно. Также попробовал решение по этой ссылке, который сообщает, что нужно передать параметр ssl ca-file внутренним узлам, как показано ниже:

server nodejsweb01 127.0.0.1:8000 ssl ca-file /etc/ssl/certs/ca.pem check
server nodejsweb02 127.0.0.1:8001 ssl ca-file /etc/ssl/certs/ca.pem check
server nodejsweb03 127.0.0.1:8002 ssl ca-file /etc/ssl/certs/ca.pem check

но после этой опции HAproxy выдает ошибку, говоря, что серверы недоступны на бэкэнде.

Пожалуйста, скажите мне, что я делаю не так в файле конфигурации HAproxy, чтобы я заставил веб-серверы успешно отвечать через SSL-соединение


person shunya    schedule 05.05.2016    source источник
comment
Вы пробовали использовать минимальную конфигурацию только для HTTP? например frontend/bind/mode http/default_backend, backend/mode http/httplog/httpchk/server   -  person Ianthe the Duke of Nukem    schedule 06.05.2016
comment
да, с минимальной конфигурацией http-only (без ssl), сервер отвечает вовремя, независимо от длины контента, который вы даете ... это только при использовании ssl-соединения, тайм-аут haproxy   -  person shunya    schedule 06.05.2016
comment
Какая версия HAProxy?   -  person Michael - sqlbot    schedule 06.05.2016
comment
1.5-dev21-6b07bf7, я думаю, это выпуск 2014 года   -  person shunya    schedule 06.05.2016


Ответы (1)


Попробуйте эту минимальную конфигурацию:

frontend localnodes
    bind *:80 
    bind *:443 ssl crt /etc/ssl/private/443_private_ssl_in.pem
    mode http
    default_backend nodes

backend nodes
    mode http
    option forwardfor
    option httplog

    server nodejsweb01 127.0.0.1:8000 check  
    server nodejsweb02 127.0.0.1:8001 check 
    server nodejsweb03 127.0.0.1:8002 check

Я подозреваю, что это те дополнительные возможности.

Это также может быть файл сертификата SSL. Ваш файл PEM создан на основе самозаверяющего сертификата? Как это устроено?

person Ianthe the Duke of Nukem    schedule 06.05.2016
comment
Да, мой файл PEM создан из самозаверяющего сертификата, это проблема? Не могли бы вы указать мне на другой способ создания файла сертификата SSL? - person shunya; 06.05.2016
comment
Пробовал с минимальной конфигурацией, но проблема все еще существует ... Я чувствую, что это самозаверяющий сертификат, как вы указали, что вызывает проблему. Проверим. - person shunya; 06.05.2016
comment
попробовал с проверенным сертификатом ssl (не самоподписанным), это не дает ничего хорошего. - person shunya; 10.05.2016