nginx 부하 CDN 가속 취득 단 진실 ip

3478 단어
더 읽 기
cdn 을 사용 하지 않 은 상태 에서 nginx 가 부하 로 실제 ip 을 가 져 올 때 nginx 설정 은 다음 과 같 습 니 다.
 
proxy_set_header        Host            $host;
proxy_set_header        X-Real-IP       $remote_addr;
proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
 
그리고 백 엔 드 서버 에서 ip 코드 가 져 오기:
 
String address = request.getHeader("X-Forwarded-For");
if (address != null && address.length() > 0
		&& !"unknown".equalsIgnoreCase(address)) {
	return address;
}
address = request.getHeader("Proxy-Client-IP");
if (address != null && address.length() > 0
		&& !"unknown".equalsIgnoreCase(address)) {
	return address;
}
address = request.getHeader("WL-Proxy-Client-IP");
if (address != null && address.length() > 0
		&& !"unknown".equalsIgnoreCase(address)) {
	return address;
}
return request.getRemoteAddr();

이렇게 하면 실제 IP 를 얻 을 수 있 습 니 다. 서버 테스트:
cdn 을 추가 하지 않 고 IP: 123.126.51 을 얻 었 습 니 다. (현재 클 라 이언 트 기기 의 실제 IP)
그리고 cdn 을 추가 한 후 도착 하 는 IP: 123.1116.126.51, 202.108.251.166 (hosts 가 cdn 을 가리 키 는 ip)
즉, client 실제 IP, 프 록 시 IP, google 의,
X - Forward - for: XFF 헤드 라 고 약칭 합 니 다. 클 라 이언 트, 즉 HTTP 요청 단의 실제 IP 입 니 다. HTTP 프 록 시 나 부하 균형 서버 를 통과 할 때 만 이 항목 을 추가 합 니 다. 。
표준 형식 은 다음 과 같다. X - Forward - for: client 1, proxy 1, proxy 2 는 표준 형식 에서 알 수 있 듯 이 X - Forward - for 헤드 정 보 는 여러 개 로 나 눌 수 있 고 중간 에 쉼표 로 구분 되 며 첫 번 째 항목 은 실제 클 라 이언 트 ip 이 며 나머지 는 지나 간 에이전트 나 부하 가 균형 잡 힌 ip 주소 이다. 몇 개 를 지나 면 몇 개가 나타난다.
 
Nginx 가 X - Forward - For 를 설정 하면 $proxyadd_x_forwarded_for 후 두 가지 상황 이 발생 합 니 다.
1. CDN 에서 온 요청 이 X - Forward - For 헤드 를 설정 하지 않 았 다 면 (보통 이런 일 은 일어나 지 않 습 니 다) Nginx 설정 은 $proxy 로 설정 합 니 다.add_x_forwarded_for 의 경우 X - Forward - for 의 정 보 는 CDN 의 IP 가 되 어야 합 니 다. Nginx 부하 균형 에 비해 클 라 이언 트 는 CDN 이기 때 문 입 니 다. 그러면 백 엔 드 웹 프로그램 은 죽 을 때 도 실제 사용자 의 IP 를 얻 을 수 없습니다.
2. CDN 은 X - Forward - For 를 설 정 했 습 니 다. 여기 서 한 번 더 설 정 했 고 값 은 $proxy 입 니 다.add_x_forwarded_for 의 경우 X - Forward - For 의 내용 이 '클 라 이언 트 IP, CDN 의 ip' 로 바 뀌 었 습 니 다. 이 경우 백 엔 드 프로그램 이 X - Forward - For 를 통 해 클 라 이언 트 IP 를 얻 으 면 쉼표 로 구 분 된 첫 번 째 항목 을 가 져 오 면 됩 니 다.
 
이것 은 머리 가 아 픕 니 다. 클 라 이언 트 의 실제 ip 만 가 져 오 려 면 백 엔 드 코드 만 수정 할 수 있 습 니 다. 여러 개 있 으 면 첫 번 째 를 가 져 옵 니 다. 이것 은 제 가 원 하 는 것 이 아 닙 니 다.
그러면 어떻게 해야만 수정 하지 않 고 실제 IP 를 사용 할 수 있 습 니까?
Nginx 에 $http x forward for 변수 가 하나 더 있 습 니 다. 이 변수 에 저 장 된 내용 은 요청 한 X - Forward - for 정보 입 니 다. 만약 백 엔 드 에서 X - Forward - for 정 보 를 얻 는 프로그램의 호환성 이 좋 지 않다 면 (X - Forward - for 에 여러 개의 IP 가 있 는 상황 을 고려 하지 않 았 다 면) X - Forward - for 를 X - Forward - for 로 설정 하지 않 는 것 이 좋 습 니 다. $proxy add x forward for. $http x forward for 로 설정 하거나 아예 설정 하지 않 아야 합 니 다!
 
위의 이 말 은 우리 가 첨가 하지 않 는 다 는 뜻 이다. $proxy_add_x_forwarded_for, 그러나 이렇게 cdn 이 없 는 상황 에서 실제 IP 를 얻 지 못 할 수 있 습 니 다. 양쪽 모두 아름 다운 방법 이 있 습 니까?
몇 가지 설정 을 거 친 후에 다음 과 같은 설정 을 한 것 을 발견 합 니 다.
 
proxy_set_header X-Forwarded-For  $http_x_forwarded_for;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;	

 
이렇게 설정 하면 처음으로 $http x forward for 를 가 져 옵 니 다. 존재 하지 않 는 다 면 $proxy add x forward for 를 가 져 옵 니 다.
이렇게 하면 cdn 환경 이 든 아니 든 클 라 이언 트 IP 를 얻 을 수 있 습 니 다.
 
(비고: 다 중 에이전트 테스트 하지 않 음)

좋은 웹페이지 즐겨찾기