😭모니터링 툴을 프로젝트에 연결하는 작업을 하고 있던중 계속 프로메테우스가 해당 스프링 부트의 metric값을 가져오지 못하고 있었습니다.
🫡현재 nginx를 이용하여 프록시 서버를 활용하고 있는 상황인데 prometheus.yml의 값을 실제 공인 ip로 적용해 주어도 작동되지 않았습니다.
🤔이유는 nginx가 프록시 서버로서 역할을 하기 때문입니다. 프록시 서버인 nginx는 자기에게 오는 값을 그대로 전달해 주지만 실제 요청 ip는 감싸서 보내주기 때문에 문제가 발생했던 것입니다.
실제 요청 ip를 가져오고 싶다면 아래의 과정을 거쳐야 합니다.
String ip = request.getHeader("X-Forwarded-For");
if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_CLIENT_IP");
}
if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_X_FORWARDED_FOR");
}
if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
X-Forwarded-For
: 일반적으로 프록시 서버를 통해 요청이 전달되는 경우, 프록시 서버가 클라이언트의 IP 주소를 이 헤더에 추가합니다. 첫 번째 IP 주소가 클라이언트의 IP 주소입니다.
Proxy-Client-IP
: 클라이언트가 웹 프록시를 통해 연결되었을 때, 웹 프록시 서버가 이 헤더에 클라이언트의 IP 주소를 추가할 수 있습니다.
WL-Proxy-Client-IP
: 웹로직(WebLogic) 서버와 프록시 서버 사이에서 연결이 수립되었을 때, 웹로직 서버가 이 헤더에 클라이언트의 IP 주소를 추가할 수 있습니다.
HTTP_CLIENT_IP
: 일부 프록시 서버가 클라이언트의 IP 주소를 이 헤더에 추가할 수 있습니다.
HTTP_X_FORWARDED_FOR
: 다른 프록시 서버를 통해 요청이 전달되는 경우, 이 헤더에 클라이언트의 IP 주소가 추가될 수 있습니다.
request.getRemoteAddr()
: 위의 헤더들을 통해 IP 주소를 식별할 수 없는 경우, 기본적으로 getRemoteAddr()
메서드를 사용하여 클라이언트의 IP 주소를 가져옵니다.
위 과정을 거치고 나면 실제 요청한 클라이언트의 ip가 나오게 됩니다.
이거 때문에 거의 3일을 해멨습니다. 😭
출처 : Stack over flow