반응형

0. 들어가기.

-. NGINX는 홈서버로 여러 도메인을 호스팅하려면 웹 애플리케이션 앞단에 라우팅으로 주로 사용한다. 

-. Nginx는 각 접속 도메인에 따라 각 앱으로 전달 (proxy_pass)를 해주게 되는데, 이 경우 접속자(client)의 아이피가 전부 localhost(127.0.0.1)로 뜨는 문제가 있고, 이걸 해결하기 위한 방법.

1. NGINX 설정 예시

-. 내 경우, 하나의 메인 도메인으로 접속하는 3개의 서버를 띄워놨다. 이 경우 3개의 서버에 각각 포트를 지정해줘도 되지만, SSL (443포트)만을 열어두고 해당 포트로 들어오는 접속을 타겟 도메인별로 각 서버 포트(localhost:xxxx)로 향하게 방향지정(proxy_pass)을 해주는 것이 보안 상 안전하다고 생각된다.

 

-. 하지만 proxy_pass를 해주면, client의 ip가 전부 nginx의 ip (내 경우 localhost, 127.0.0.1)로 뜨는 문제가 있다. 

2. NGINX 설정 만지기

-. 위와 같은 경우에 client의 ip를 http header에 포함해서 전달해줘야 하는데, 구글링을 해보니 nginx에서 $remote_addr 변수를 전달해주면 된다 한다. 그 외 변수는 아래 표 참고

항목 nginx 구문 http header
접근 도메인 - HTTP_HOST': 'store.stocksidekick.xyz',
클라이언트 접속 환경 (브라우저 ..) proxy_set_header http_user_agent $http_user_agent; HTTP_HTTP_USER_AGENT': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.93 Safari/537.36'
접속 프로토콜 proxy_set_header request $request; HTTP_REQUEST': 'GET / HTTP/2.0',
  proxy_set_header status $status; HTTP_STATUS': '000',
서버주소:포트 proxy_set_header X-Forwarded-By $server_addr:$server_port; HTTP_X_FORWARDED_BY': '180.70.163.131:443',
클라이언트 ip + 중간에 거치는 다른 라우트들 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; HTTP_X_FORWARDED_FOR': '220.118.231.200',
http/https proxy_set_header X-Forwarded-Proto $scheme; HTTP_X_FORWARDED_PROTO': 'https',
클라이언트 ip proxy_set_header X-Real_IP $remote_addr; HTTP_X_REAL_IP': '220.118.231.200',

 

3. 서버에서 확인

-. 나의 경우는 가장 날먹에 최적화된 Flask를 사용하는데, 서버 가동 중 뜨는 로그는 여전히 ip가 보이지 않는다.

-. Flask 서버 실행 시 창에 뜨는 아이피는 http header가 아닌, 말 그대로 request를 요청한 nginx 서버의 ip가 뜨기 때문인데, 이를 해결하기 위해선 HTTP header의 값을 가져오는 두가지 방법 중 하나를 써야한다.

        return jsonify({'time': datetime.datetime.now(),
                        'protocol': request.scheme,
                        'ip': request.remote_addr, #바로 직전 request 아이피를 가져옴. 출력: 127.0.0.1
                        'flask.request.header.X-Real-Ip': request.headers.get('X-Real-Ip'), #header의 X-Real-IP 출력
                        'HTTP_X_REAL_IP': request.environ.get("HTTP_X_REAL_IP") #header의 X-REAL-IP 출력 2
                        }), 200

-. 해당 값 출력 시 아래와 같이 의도한대로 출력됨

728x90
반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기