파이썬 python/django

[django] django로 포트포워딩(port forwarding)하는 방법 (w. middleware)

Aytekin 2024. 7. 25. 14:29

django로 포트포워딩(port forwarding)하는 방법

- Django 애플리케이션에서 클라이언트가 어떤 도메인을 통해 접근했는지를 확인하고, 해당 도메인에 따라 다른 페이지로 리다이렉션하는 방법

 

배포 관점에서 그려본 프로젝트 흐름

 

배포 관점에서 그려본 프로젝트의 전체적인 흐름이다.

 

처음에는 django admin페이지를 이용한 서비스를 구현했다.

따라서 back과 front모두 django안에서 해결 할 수 있었다.

 

도메인을 하나 구입해서 Route53을 이용해서 호스팅을 했고,

subdomain으로 first를 붙여 (예) first.webname.net으로 배포했었다.

 

탄력적 IP를 이용해서 내가 배포한 EC2에 고정적으로 접근할 수 있도록 설정해두었고,

django 웹앱을 포트번호 8000번을 이용했다.

 

여기까지는 문제 없다.

 

여기서 second.webname.net 이라는 새로운 subdomain을

React프로젝트로 연결시켜 줄 방법이 필요했다.

 

React는 포트번호 3000번을 사용했고

나는 django를 통해서 다 관리하기를 원했기에

django로 포트포워딩을 하는 방법을 찾아 구현해보았다.

 

클라이언트 입장에서는 포트 8000번으로 들어갔다가 다시 django가 안내하는 포트3000번으로 가야하는 긴 여행을 해야한다.

 

사실 nginx같은 웹서버를 통해 hosting주소에 따라 포트를 나눠줄 수 있을것 같다. 

nignx가 나에겐 아직 익숙하지 않아서 비교적 나에게 익숙한 환경인 django 안에서 해결해보았다.

 

일단, second.webname.net을 브라우저에 입력해서 들어가면 first.webname.net과 마찬가지로 django의 index페이지가 열릴것이다.

이때 나는 host에 따라서 first는 django로, second는 react로 보내고 싶은것이다.

 

서론이 길었다.

코드를 살펴보자.

 


1. 미들웨어 생성

  • 요청을 처리하기 전에 클라이언트의 호스트 헤더를 확인
  • 호스트 헤더에 따라 리다이렉션 수행
#`myapp/middleware.py` 파일 생성

from django.shortcuts import redirect
from DRAXASServer.settings import SERVICE_DOMAIN_URL, SERVICE_TO_URL

class HostRedirectMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        host = request.get_host()

        if host == HOST_DOMAIN:
            return redirect(SERVICE_TO_URL)

        response = self.get_response(request)
        return response

redirect할 대상 페이지 주소를 "SERVICE_TO_URL"이라는 변수명으로

구분하고자 하는 host 도메인 주소를 "HOST_DOMAIN"이라는 변수명으로

settings.py에 선언했다.

 

 

2. 미들웨어 등록:

  • 작성한 미들웨어를 Django 프로젝트의 설정 파일에 등록

 

# settings.py

MIDDLEWARE = [
    ...
    'myapp.middleware.HostRedirectMiddleware',  # 미들웨어 등록
    ...
]

...

SERVICE_TO_URL = "https://first.webname.net:3000/"
HOST_DOMAIN = "second.webname.net"



second.webname.net으로 django에 접근하면 django는 https://first.webname.net:3000로 보내준다.

728x90