요청 URI를 기반으로 HAproxy 1.6으로 응답 헤더를 추가하는 방법은 무엇입니까?


9

Tomcat 서버 앞에서 HAproxy 1.6을로드 밸런서로 사용합니다.

요청 URI를 기반으로 응답 헤더를 추가해야합니다.

예를 들어 Cache-Control public,max-age="600"요청 URI가 /api있지만 요청 URI가 다른 것이 아닌 경우 응답 헤더를 추가하고 싶습니다 .

  • 첫 번째 시도는 경로를 기반으로 acl을 사용하여 헤더를 http-response에 추가하는 것입니다.

    acl api path_reg ^/api/(.*)$
    http-response add-header Cache-Control public,max-age="600" if api
    

    로 haproxy를 시작하면 (또는 )이 호환되지 -d않는다는 경고가 표시 됩니다 .path_regpathhttp-response

    Dec  6 15:22:29 ip-10-30-0-196 haproxy-systemd-wrapper[315]: 
    [WARNING] 340/152229 (2035) : parsing 
    [/etc/haproxy/haproxy.cfg:78] : acl 'api' will never match because 
    it only involves keywords that are incompatible with 'backend 
    http-response header rule'
    
  • 헤더 http-request대신에 헤더를 추가하려고했습니다 http-response.

    acl api path_reg ^/api/(.*)$
    http-request add-header Cache-Control public,max-age="600" if api
    

    작동했지만 응답에 필요합니다.

  • 또한 haproxy 변수를 사용하려고했습니다.

    http-request set-var(txn.path) path
    acl path_acl %[var(txn.path)] -m ^/api/(.*)$
    http-response add-header Cache-Control public,max-age="600" if path_acl
    

    그러나 HAproxy를 시도하면 이벤트가 시작되지 않고 다음 오류가 발생합니다.

    [ALERT] 340/162647 (2241) : parsing [/etc/haproxy/haproxy.cfg:48] 
    : error detected while parsing ACL 'path_acl' : unknown fetch 
    method '%[var' in ACL expression '%[var(txn.path)]'.
    

요청 헤더를 acl로 사용하여 응답 헤더를 설정하려면 어떻게해야합니까?

답변:


9

이 시도:

http-response set-header Cache-Control no-cache,\ max-age=600 if { capture.req.uri -m beg /api/ }

capture.req.uri와 달리 응답이 처리 될 때까지 지속 path됩니다.

몇 가지 참고 사항 :

이 예는 익명 ACL을 사용합니다. 명명 된 ACL을 사용하여 수행 할 수도 있지만 두 줄이 필요합니다.

max-age 값을 인용 해야하는 이유를 알고있는 이유는 없습니다.

add-header, 원하지 않는 set-header경우, 이미있는 경우 제거되도록합니다.

acl path_acl %[var(txn.path)] -m ^/api/(.*)$아마도로 올바르게 쓰여질 것 acl path_acl var(txn.path) -m ^/api/(.*)$입니다. HAProxy는 예상시기 %[ ]와 예상치 못한 시점에 대해 조금 까다 롭습니다 . 나는 패턴이 있다고 확신하지만, 그것이 무엇인지 명확하지 않습니다.


1
당신의 응답을 주셔서 감사합니다. capture.req.uri제거하는 동안 사용하는 방법 과 변수 %[ ]acl̀모두 작동합니다. 또한 max-agevalue set-header대신 따옴표 대신 따옴표에 대해 옳습니다 add-header.
jmlrt

1
백엔드가 Cache-Control응답을 제공하지 않으면 내부적으로 비슷한 것을 수행 Cache-Control-Authority: implicit, gateway합니다. 개발자 / 문제 해결사 / 테스터에게 프록시를 제공하기 위해 헤더를 추가 하여 프록시가 응용 프로그램이 아닌 해당 헤더를 제공하고 있음을 유의하십시오 하지만 앱에서 자체 헤더를 제공하면 나를 사용 중지 할 수 있습니다. 이 헤더는 표준이 아닙니다. 방금 팀의 다른 사람들이 앱이 아니라 인라인으로 제공하고 있음을 인식하도록 돕기 위해 방금 만들었습니다. 프록시는 너무 문제가 없으므로 경로에 있다는 것을 잊어 버리는 나쁜 습관이 있습니다.
Michael-sqlbot
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.