Erro ao configurar o haproxy e o verniz

1

Eu tenho acompanhado um tutorial do blog haproxy sobre como instalar verniz com haproxy. ( Link ) Existe um problema com o configurações de configuração haproxy em torno desta parte:

frontend ft_web_static
  bind 10.0.1.3:80
  monitor-uri /haproxycheck
  # Tells Varnish to stop asking for static content when servers are dead
  # Varnish would deliver staled content
  monitor fail if nbsrv(bk_appsrv_static) eq 0
  default_backend bk_appsrv_static

Quando eu reinicio o haproxy, isso me dá este erro:

[root@ch]# service haproxy restart
[ALERT] 348/004936 (28582) : parsing [/etc/haproxy/haproxy.cfg:282] : error detected while parsing a 'monitor fail' condition : no such ACL : 'nbsrv(apache2_static)'.

Eu acho que há algo errado com nbsrv(bk_appsrv_static) eq 0 . Alguém na seção de comentários após o artigo também levantou esse problema, mas ninguém tem soluções para isso. Alguém pode descobrir se há um erro de digitação ou erro nas configurações?

Aqui está a configuração completa:

# On Aloha, the global section is already setup for you
# and the haproxy stats socket is available at /var/run/haproxy.stats
global
  stats socket ./haproxy.stats level admin
  log 10.0.1.10 local3

# default options
defaults
  option http-server-close
  mode http
  log global
  option httplog
  timeout connect 5s
  timeout client 20s
  timeout server 15s
  timeout check 1s
  timeout http-keep-alive 1s
  timeout http-request 10s  # slowloris protection
  default-server inter 3s fall 2 rise 2 slowstart 60s

# HAProxy's stats
listen stats
  bind 10.0.1.3:8880
  stats enable
  stats hide-version
  stats uri     /
  stats realm   HAProxy Statistics
  stats auth    admin:admin

# main frontend dedicated to end users
frontend ft_web
  bind 10.0.0.3:80
  acl static_content path_end .jpg .gif .png .css .js .htm .html
  acl pseudo_static path_end .php ! path_beg /dynamic/
  acl image_php path_beg /images.php
  acl varnish_available nbsrv(bk_varnish_uri) ge 1
  # Caches health detection + routing decision
  use_backend bk_varnish_uri if varnish_available static_content
  use_backend bk_varnish_uri if varnish_available pseudo_static
  use_backend bk_varnish_url_param if varnish_available image_php
  # dynamic content or all caches are unavailable
  default_backend bk_appsrv

# appsrv backend for dynamic content
backend bk_appsrv
  balance roundrobin
  # app servers must say if everything is fine on their side
  # and they can process requests
  option httpchk
  option httpchk GET /appcheck
  http-check expect rstring [oO][kK]
  cookie SERVERID insert indirect nocache
  # Transparent proxying using the client IP from the TCP connection
  source 10.0.1.1 usesrc clientip
  server s1 10.0.1.101:80 cookie s1 check maxconn 250
  server s2 10.0.1.102:80 cookie s2 check maxconn 250

# static backend with balance based on the uri, including the query string
# to avoid caching an object on several caches
backend bk_varnish_uri
  balance uri # in latest HAProxy version, one can add 'whole' keyword
  # Varnish must tell it's ready to accept traffic
  option httpchk HEAD /varnishcheck
  http-check expect status 200
  # client IP information
  option forwardfor
  # avoid request redistribution when the number of caches changes (crash or start up)
  hash-type consistent
  server varnish1 10.0.1.201:80 check maxconn 1000
  server varnish2 10.0.1.202:80 check maxconn 1000

# cache backend with balance based on the value of the URL parameter called "id"
# to avoid caching an object on several caches
backend bk_varnish_url_param
  balance url_param id
  # client IP information
  option forwardfor
  # avoid request redistribution when the number of caches changes (crash or start up)
  hash-type consistent
  server varnish1 10.0.1.201:80 maxconn 1000 track bk_varnish_uri/varnish1
  server varnish2 10.0.1.202:80 maxconn 1000 track bk_varnish_uri/varnish2

# frontend used by Varnish servers when updating their cache
frontend ft_web_static
  bind 10.0.1.3:80
  monitor-uri /haproxycheck
  # Tells Varnish to stop asking for static content when servers are dead
  # Varnish would deliver staled content
  monitor fail if nbsrv(bk_appsrv_static) eq 0
  default_backend bk_appsrv_static

# appsrv backend used by Varnish to update their cache
backend bk_appsrv_static
  balance roundrobin
  # anything different than a status code 200 on the URL /staticcheck.txt
  # must be considered as an error
  option httpchk
  option httpchk HEAD /staticcheck.txt
  http-check expect status 200
  # Transparent proxying using the client IP provided by X-Forwarded-For header
  source 10.0.1.1 usesrc hdr_ip(X-Forwarded-For)
  server s1 10.0.1.101:80 check maxconn 50 slowstart 10s
  server s2 10.0.1.102:80 check maxconn 50 slowstart 10s
    
por RedGiant 14.12.2015 / 17:58

1 resposta

5

Esse artigo tem mais de 3 anos e houve 2 versões estáveis do HAProxy desde então, então eu suspeito que é por isso que ele não está funcionando textualmente.

Se eu tivesse que adivinhar seu problema exato, eu diria que isso tem a ver com a sintaxe da instrução monitor fail , onde ela espera um nome de ACL após o if .

Você precisa de opções para corrigir isso.

  1. Altere a ACL para uma "anônima", conforme descrito na seção 7.2 dos documentos HAProxy. Eu vinculei a v1.6, mas é o mesmo na v1.5 também.

    Seu monitor ficaria assim:

    monitor fail if { nbsrv(bk_appsrv_static) eq 0 }  
    
  2. Crie uma ACL nomeada para o status geral do backend bk_appsvr_static e passe-a para a linha monitor fail .

    Isso seria parecido com:

    acl bk_app_static_noservers nbsrv(bk_appsrv_static) eq 0
    monitor fail if bk_app_static_noservers
    

    Nesse caso, se o bk_appsvr_static não tiver nenhum servidor disponível, o ACL será FALSE e o monitor fail será aplicado.

por 14.12.2015 / 18:13