nginx 와 tomcat 을 이용하여 웹 서비스 구축 시 nginx 로 들어온 요청을 reverse proxy형태로 tomcat에 요청 할 경우client remote ip의 ip가 넘어오는게 아니라 nginx의 remote ip 가 넘어오는 현상이 있다. Reverse Proxy의 기능으로 인해.
“X-Forwarded-For” 헤더를 활용하여 처리 한다.
HTTP HTTP ( reverse proxy )
Client ———> Nginx ————-> Tomcat
(192.168.0.200) (192.168.0.100) (192.168.0.150)
위의 구조일 경우 Tomcat에서 request.getHeader(“remote_addr”) 로 불러오거나 access log에 Client의 IP ( 192.168.0.200 ) 을 가져오는 것이 아닌 NginX ( 192.168.0.100 ) 이 오기때문에 모든 요청이 Nginx의 IP를 찍게 되는 현상이 있다. 이 현상은 간단 히 해결할 수 있다.
nginx의 nginx.conf
location ~ \.jsp$ {
proxy_pass http://localhost:15000;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
}
위와 같이 X-Forwarded-For 를 헤더에 셋팅한 다음
tomcat의 server.xml
<Valve className=”org.apache.catalina.valves.AccessLogValve” directory=”logs”
prefix=”localhost_access_log.” suffix=”.txt”
pattern=”%{X-Forwarded-For}i %h %l %u %t "%r" %s %b” resolveHosts=”false”/>
jsp source에서도 request.getHeader(“X-Forwarded-For”); 로 호출하면 문제는 해결된다.