매일 업데이트
2022-11-20 14:38 11 min

Ngrok을 사용하여 Django 데모 앱을 인터넷에 노출하는 방법은 무엇입니까?

Django 데모 앱을 인터넷에 공개하는 방법

호스팅 서비스에 배포하지 않고도 Django 데모 애플리케이션을 인터넷에 노출시키는 방법을 자세히 알아보겠습니다. 간단히 말해, 로컬 환경에서 개발 중인 Django 앱을 다른 사람과 공유하고 싶을 때 유용한 방법입니다.

Django 앱의 데모를 보여주기 위해 별도의 스테이징 환경을 설정하는 것은 번거롭고 시간 낭비일 수 있습니다. 특히, 몇 분 동안만 URL이 필요한 경우 클라이언트나 팀원에게 공유하기에는 더욱 그렇습니다.

이럴 때 가장 효과적인 방법은 현재 로컬 서버를 외부에 노출하는 도구를 활용하는 것입니다. 이렇게 하면 전 세계 어디에서든 로컬 컴퓨터에서 실행되는 웹 사이트를 볼 수 있게 됩니다.

이러한 목적을 달성하기 위해 우리는 ngrok라는 편리한 도구를 사용할 것입니다. 이 도구는 로컬 컴퓨터의 특정 포트를 기반으로 공개적으로 접근 가능한 URL을 생성해줍니다. 이 모든 것은 터널링이라는 기술 덕분에 가능합니다.

시작하기 전에, 이 튜토리얼에서 사용된 모든 코드는 GitHub 저장소에서 확인할 수 있습니다.

필수 조건

이 튜토리얼을 원활하게 따라가기 위해서는 기본적인 프로그래밍 및 Django 개발 지식이 필요합니다.

Django 앱 생성

단계별 가이드를 제공하기 위해 Django 프로젝트 생성 과정을 안내해 드리겠습니다. 이미 Django 프로젝트가 있다면 이 섹션은 건너뛰어도 됩니다.

가상 환경 설정

가장 먼저, Python 가상 환경을 설정해야 합니다. 이를 통해 프로젝트에 필요한 특정 라이브러리 및 Python 버전을 격리하여 관리할 수 있습니다.

  • 시스템 터미널(또는 쉘)을 엽니다.
  • 만약 시스템 터미널을 여는 것이 번거롭다면, 코드 편집기의 내장 터미널을 이용해 보세요.
  • 코드 편집기의 "터미널 > 새 터미널"을 선택하면 화면 하단에 쉘이 나타납니다.
  • 내장된 Python 도구를 사용하여 가상 환경을 생성하려면 다음 명령을 입력하십시오.
python -m venv .venv

이 명령은 다음과 같은 의미입니다.

"Python아, 현재 디렉토리에 '.venv'라는 이름의 가상 환경을 만들어줘 (-m venv)."

  • 이제 현재 디렉토리의 파일을 확인하면 '.venv' 폴더가 생성된 것을 볼 수 있습니다.
$ ls -l
drwxr-xr-x    - daniel 30 abr 23:12 .venv
# 기타 파일 ...
  • 가상 환경을 활성화하려면 'source' 명령을 사용해야 합니다.
source .venv/bin/activate
  • 만약 문제가 발생한다면, Python 공식 문서에서 제공하는 다음 표를 참조하세요.
플랫폼 가상 환경 활성화 명령어
POSIX bash/zsh $ source <venv>/bin/activate
fish $ source <venv>/bin/activate.fish
csh/tcsh $ source <venv>/bin/activate.csh
PowerShell Core $ <venv>/bin/Activate.ps1
Windows cmd.exe C:> <venv>\Scripts\activate.bat
PowerShell PS C:> <venv>\Scripts\Activate.ps1

정상적으로 명령을 실행했다면 쉘 프롬프트에 가상 환경 이름이 표시되어야 합니다.

$ source .venv/bin/activate.fish

(.venv) $ 

Django 설치

가상 환경이 활성화된 후, 원하는 Django 버전을 설치할 수 있습니다. 여기서는 최신 버전을 설치하는 것을 추천합니다.

$ pip install django
Collecting django
  Using cached Django-3.2-py3-none-any.whl (7.9 MB)
Collecting pytz
  Using cached pytz-2021.1-py2.py3-none-any.whl (510 kB)
Collecting asgiref<4,>=3.3.2
  Using cached asgiref-3.3.4-py3-none-any.whl (22 kB)
Collecting sqlparse>=0.2.2
  Using cached sqlparse-0.4.1-py3-none-any.whl (42 kB)
Installing collected packages: pytz, asgiref, sqlparse, django
Successfully installed asgiref-3.3.4 django-3.2 pytz-2021.1 sqlparse-0.4.1

이제 공개할 Django 앱의 기본 프로젝트 구조를 생성할 차례입니다.

$ django-admin startproject mytestingproject

이 명령은 'mytestingproject'라는 이름의 Django 프로젝트를 만듭니다. 프로젝트 생성 후, 해당 디렉토리로 이동해야 합니다. 이제 해당 디렉토리로 이동한 후 Django 서버를 실행해 보겠습니다.

# 프로젝트 디렉토리로 이동
(.venv)$ cd mytestingproject/

# 프로젝트 내부 파일 목록 확인
(.venv) $ ls
mytestingproject  manage.py 

이제 Django 서버를 실행하여 어떻게 보이는지 확인해 보겠습니다.

 (.venv) $python manage.py runserver
Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).

You have 18 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
May 01, 2021 - 04:34:25
Django version 3.2, using settings 'mytestingproject.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

기본적으로 Django는 로컬 호스트(127.0.0.1은 항상 로컬 호스트를 가리킵니다)의 8000번 포트에서 로컬 서버가 실행 중임을 알려줍니다.

오류 메시지에 대해서는 걱정하지 마십시오. 먼저 로컬 서버에서 모든 것이 정상적으로 작동하는지 확인해야 합니다. 웹 브라우저를 열고 다음 주소를 입력해 보세요.

http://localhost:8000/
# localhost와 127.0.0.1이 동일하다는 것을 아시나요?

정상적으로 작동한다면 Django의 멋진 기본 페이지를 볼 수 있습니다.

이것으로 Django 설치는 완료되었습니다.

이제 Django 프로젝트를 외부에 공개해 보겠습니다. 더 복잡한 프로젝트에서도 동일한 방법으로 Django 앱을 노출시킬 수 있습니다.

Ngrok을 사용하여 Django 앱 노출

앞서 언급했듯이, Ngrok은 로컬 서버를 인터넷에 노출시킬 수 있는 유용한 도구입니다. 먼저 Ngrok 공식 웹사이트에서 다운로드하세요.

설치가 완료되면 다음 명령을 실행하여 Ngrok을 사용할 준비를 합니다.

Django 서버가 실행 중인 터미널은 그대로 유지하고 새로운 쉘을 열어서 다음 명령어를 입력합니다.

$  ngrok help
NAME:
   ngrok - tunnel local ports to public URLs and inspect traffic

More commands ....

이렇게 하면 Ngrok에서 제공하는 사용 가능한 명령들을 볼 수 있으며, 설치 과정이 올바르게 완료되었는지 확인할 수 있습니다.

이제 우리 서버에 접근할 수 있는 URL을 생성해 봅시다.

    $ ngrok http 8000 
# 8000번 포트 웹 서버를 위한 보안 공개 URL 생성

이 명령은 로컬 호스트의 8000번 포트에 연결할 수 있는 URL을 생성하기 위해 'http' 인수를 사용합니다.

아래는 출력 예시입니다.

ngrok by @inconshreveable                                                                      (Ctrl+C to quit)
                                                                                                               
Session Status                online                                                                           
Session Expires               1 hour, 59 minutes                                                               
Update                        update available (version 2.3.39, Ctrl-U to update)                              
Version                       2.3.35                                                                           
Region                        United States (us)                                                               
Web Interface                 http://127.0.0.1:4040                                                            
Forwarding                    http://cac2165aa7f8.ngrok.io -> http://localhost:8000                            
Forwarding                    https://cac2165aa7f8.ngrok.io -> http://localhost:8000                           
                                                                                                               
Connections                   ttl     opn     rt1     rt5     p50     p90                                      
                              0       0       0.00    0.00    0.00    0.00       

보시다시피, Ngrok은 로컬 호스트를 가리키는 보기 흉한 URL을 제공합니다. 이제 Ngrok에서 제공한 URL을 브라우저에 입력하면 놀라운 일이 벌어집니다.

settings.py 파일 수정

잠깐, 무슨 일이 일어난 거죠? 😱

DisallowedHost 설정 때문에 Django에서 오류가 발생했습니다. Django 서버가 실행 중인 쉘과 Ngrok 세션이 있는 쉘을 확인하면 몇 가지 디버그 메시지를 볼 수 있습니다.

# Django 메시지
Invalid HTTP_HOST header: 'cac2165aa7f8.ngrok.io'. You may need to add 'cac2165aa7f8.ngrok.io' to ALLOWED_HOSTS.
Bad Request: /
[01/May/2021 05:07:46] "GET / HTTP/1.1" 400 65196
Invalid HTTP_HOST header: 'cac2165aa7f8.ngrok.io'. You may need to add 'cac2165aa7f8.ngrok.io' to ALLOWED_HOSTS.

# Ngrok 메시지
HTTP Requests                                                            
-------------                                                            
                                                                         
GET /favicon.ico               400 Bad Request                           
GET /                          400 Bad Request                           
                                              

Django가 알려주듯이, 연결을 허용할 도메인을 ALLOWED_HOSTS 구성 변수에 추가해야 합니다. 하지만 도메인 이름이 너무 길고 복잡하다는 문제가 있습니다.

이 오류를 해결하기 위해 Django 설정을 약간 수정해 보겠습니다. 프로젝트 폴더 안에 있는 'settings.py' 파일을 엽니다.

# mytestingproject/settings.py

# 28번째 줄

# 다음을 찾아서:
ALLOWED_HOSTS = []

# 다음과 같이 변경:
ALLOWED_HOSTS = ["*"]

정규 표현식을 안다면, 모든 호스트를 허용하는 와일드카드를 설정했다는 것을 알 수 있습니다.

이제 사이트를 다시 로드하고 결과를 확인하십시오.

이제 모든 것이 완벽하게 작동합니다! 그리고 프로젝트에 대한 애플리케이션을 생성하고 URL과 뷰를 설정하기 시작하면 모든 것이 해당 공개 URL에 반영될 것입니다.

주의: 프로덕션 환경에서는 ALLOWED_HOSTS 설정을 변경하는 것을 잊지 마십시오. 보안상의 큰 취약점이 될 수 있습니다.

결론

이 튜토리얼에서는 Django 프로젝트를 배포하지 않고 데모 URL을 만드는 방법을 학습했습니다.

Django 프로젝트를 생성하는 방법과 Django의 'settings.py' 파일을 다루는 방법을 연습했습니다.

마지막으로, Ngrok을 사용하는 방법과 이를 통해 로컬 서버를 외부에 노출하는 방법을 익혔습니다.

다음으로는 인기 있는 Python 프레임워크 중 일부를 탐색하여 API를 구축하는 방법을 알아보겠습니다.

저자
Korea

기술 트렌드와 실용적인 팁을 전하는 लेखक입니다.