Grafana 8.x 이상 버전에서는 웹 소켓을 이용하여 업데이트 되는 데이터를 패치해 옵니다. 이전에는 별도의 HTTP Request를 이용했지만, 이제는 웹 소켓을 이용해 매번 연결을 보내는 오버헤드를 줄이려는 의도라고 생각합니다. Grafana 에서는 이 기능을 Grafana Live라 부릅니다.
Grafana 인스턴스가 직접 엔드포인트를 제공하면 웹 소켓 이용에 특별한 문제가 없으나 여러가지 이유로 앞단에 NGINX 등을 통한 리버스 프락시를 구현해 두었다면 웹 소켓 연결이 제대로 맺어지지 않는 문제가 있습니다.
물론 Grafana 의 동작 자체는 문제가 없고 브라우저 개발자 도구/콘솔상에 보기 싫은 빨간색 에러가 잔뜩 찍히는 불편함이 있습니다.
방법#1. Grafana Live 기능을 꺼버리자!
가장 쉬운 방법은 Grafana Live 기능을 꺼버리는 방법입니다. 다만 이 방법은 Grafana Live 문서에서 이야기 하고 있는 기술의 장점을 버리는 선택이 됩니다. 그렇지만 굳이 필요 없다면 기능을 꺼버리는 것이 여러모로 더 나은 선택일 수도 있습니다.
Grafana 설정 파일인 grafana.ini 혹은 custom.ini 에 [live] 섹션을 찾아 max_connections 값을 0으로 설정하면 기능을 끌 수 있습니다.
방법#2. 리버스 프락시에 웹 소켓 설정을 추가하자!
조금 더 적극적인 사용자이고 새로운 기술들을 활용해 보고 싶다면? 구성해 둔 리버스 프락시의 설정을 업데이트하여 웹 소켓을 잘 소화하도록 수정할 수 있습니다. 여기에서는 가장 널리 사용되는 nginx를 리버스 프락시로 사용한 경우입니다.
웹 소켓은 hop-by-hop, 즉 클라이언트와 nginx, 그리고 nginx와 Grafana 사이의 연결을 별도로 취급합니다. 클라이언트가 Grafana와 웹 소켓을 통한 데이터 교환을 하기 위해서는 nginx가 웹 소켓과 관련하여 일종의 터널링을 해주어야 합니다. 마치 nginx가 없는 것처럼 클라이언트와 Grafana 사이를 연결해 주어야 하는 것입니다.
사용자 환경에 따라 nginx 설정 파일을 쪼개서 쓸 수도 있기 때문에 공식 문서에서 가이드 하고 있는 예제 설정을 가져왔습니다.
웹 소켓은 Upgrade 헤더를 이용하여 웹 소켓 사용이 가능한지를 체크하고 문제가 없는 경우에만 커넥션을 맺고 데이터를 흘리는 구조입니다.
설정의 내용은 클라이언트와 nginx 간에 Upgrade 헤더 값에 따라 변수($connection_upgrade) 값을 지정하고 이 값을 Grafana로 요청을 보낼때 사용하는 방식입니다.
마지막의 location 블록을 보면 클라이언트가 보낸 Upgrade 헤더 값($http_upgrade)을 Upgrade 요청 헤더에 지정하고 map 블록으로 지정한 $connection_upgrade 변수 값을 Connection 헤더에 담아 Grafana로 보내는 것을 확인할 수 있습니다.
이렇게 설정하고 nginx config을 리로드 하면 에러가 깔끔하게 사라집니다!
nginx 기준으로 위와 같은 형태로 구성하는 것은 1.13.x 이후 버전부터 가능합니다. 혹시나 예상대로 잘 동작하지 않으면 nginx의 버전을 살펴보기 바랍니다!
꾸준히 판매되고 있는 저의 번역서 NGINX 쿡북! 아직 구매하지 않았다면 아래 링크로 고고씽~ 구매 달려주시기 바랍니다!