티스토리 뷰

nginx 와 tomcat 을 이용하여 웹 서비스 구축 시   nginx 로 들어온 요청을 reverse proxy형태로 tomcat에 요청 할 경우

client remote ip의 ip가 넘어오는게 아니라 nginx의 remote ip 가 넘어오는 현상이 있다.



                               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 &quot;%r&quot; %s %b" resolveHosts="false"/>

 

jsp source에서도 request.getHeader("X-Forwarded-For"); 로 호출하면 문제는 해결된다.

by rocksea.

댓글