관리 메뉴

막내의 막무가내 프로그래밍 & 일상

[네트워크] 도커(docker) + nginx + django 웹 페이지 서빙 본문

네트워크/도커(Docker)

[네트워크] 도커(docker) + nginx + django 웹 페이지 서빙

막무가내막내 2019. 12. 18. 01:17
728x90

 

 

 

 

 

도커내에서 웹 프레임워크를 활용해서 웹 페이지를 서빙해봤다.

 

이를 위해 nginx, uwsgi, django를 사용한다.

uwsgi(Web Server Gateway Interface) 웹서버와 웹 애플리케이션의 인터페이스를 위한 파이선 프레임워크다. nginx(서버)가 보낸 요청을 django가 알아들을 수 없다. 즉 둘은 직접 연동이 안된다. 그래서 uwsgi를 사용해서 nginx 보낸 요청을 파이썬으로 해석해서 django와 연동되게 해주고 알맞게 웹페이지를 불러오게 해준다.(간단히 말하면 uwsgu가 인터페이스 역할을 한다.) 또한 nginx는 정적인 웹만 지원하므로 동적 웹, 데이터베이스 연동을 위해 웹 어플리케이션인 django가 필요하다.

 

Client Server(nginx) Socket Uwsgi Django

그러므로 위와 같은 구조가 된다.

 

 

 

 

dockerfile

먼저 위와 같이 Dockerfile을 만들어 이미지 생성 후 docker run -it v /home/u201404377/u201404377/network:/network -p 1234:80 -p 443:443 -p 2345:8000 --name net_container_v0.5 network-class:0.1 /bin/bash 로 도커 컨테이너를 만들었다. 80포트를 12348000포트를 2345mapping 시켰다. (포트포워딩 => 내부포트:외부포트)

 

uwsgi 설정을 시작하기에 앞서 가상환경에서 작업하기 위해 virtualenvsource bin/activate 명령어를 통해 가상환경에 들어갔다. virtualenvpython의 가상환경 모듈이라 볼 수 있다. 작은 python을 새로 설치해서 내가 원하는 모듈만 운용하는 바구니라고 생각하면 된다.

 

가상환경을 생성하고 접속 후 해당 가상환경을 만든 폴더로 들어간다음 Django 프로젝트를 생성해야한다. django-admin.py startproject mysite 명령어를 통해 mysite라는 이름의 Django 프로젝트를 생성하였다.

 

그 후 pip3 install uwsgiuwsgi를 설치 후 생성한 Django 프로젝트에 들어가 uwsgi를 테스트해봤다. tes.py는 다음과 같다.

 

 

 

 

 

다음은 uwsgi 테스트한 결과이다. 잘 동작함을 볼 수 있다.

uwsgi --http : 8000 --wsgi-file test.py

에서 http프로토콜을 사용하고 8000 포트를 사용하여 지정된 test.py를 실행 시키고 test.py는 내가 코드에 작성한 것을 출력해준다.

 

test.py(8000포트) 실행결과

 

 

 

 

이 테스트가 성공함으로써 client uWsgi- python 간의 동작이 된다는 것을 의미한다. 다음은 test.py 말고 Djano 서버를 실행 및 테스트를 해봤다. 다음과 같이 잘 동작함을 볼 수 있다.

uwsgi --http :8000 module mysite.wsgi

client uWSGI Djano가 잘 연동됨을 볼 수 있다. 이제는 clientUwsgi가 직접 대화(연결)하지 않고 웹 서버가 할 역할이므로 nginx를 클라이언트와 연결해주면 된다.

 

 

 

 

 

 

nginx와 django를 사용할려면 다음과 같은 설정 세팅이 필요하다. (nginx/conf.d)

conf.d

 

 

위의 conf파일은 nginx에게 파일 시스템에서 미디어 및 정적 파일을 제공하고 Django의 개입이 필요한 요청을 처리하도록 지시한다. (, nginx가 어떻게 동작해야 하는가를 지정하는 기능으로 파일에 설정 값을 기술한다)

 

여기서 server 블록은 하나의 웹사이트를 선언하는데 사용된다. location 블록은 server 블록 안에 등장하면서 특정 url을 처리하는 방법을 정의한다.

 

location /static staticresource를 서빙해야한다면 alias를 통해 서빙할 수 있다. 다른 staticresource를 사용하고 싶으면 주석처리한 media처럼 location /media하고 적어주면 된다. 그리고 static한 자원들 외의 모든 요청은 location / 로 오게되고 이 블록에 있는 설정된 django로 보내지게 된다. (django가 위에 upstream djago로 되어있는 곳으로 보내진다는 뜻이다.) 그러므로 uwsgi_pass를 위에 upstream으로 설정한 블록의 이름을 적어주면된다. uwsgi를 사용할려면 uwsgi_params파일이 필요하고 이 파일이 있는 경로를 include에 지정해주면 된다.

 

upstream django블록은 nginx가 요청을 전달할 django 서버의 정보를 적어주면 된다. 위에 2개가 있는데 하나는 unix파일 소캣을 사용하는 방법이고 다른 하나는 http 통신을 사용하는건데 전자가 더 가볍게 동작할 수 있어 좋다고 한다. 위 문단에서 말한 것처럼 location / 으로 온 요청들은 이 upstream으로 오게 된다.

 

 

 

 

uwsgi.ini

 

위는 uwsgi.ini 설정 파일이다. 

조금 설명하자면

먼저 chdir은 장고 프로젝트의 base directory를 의미한다.

module은 장고의 wsgi파일을 의미한다.

home은 가상환경인 virtualenvpath를 의미한다.

socket은 해당 mysite.sock가 있는 mysite/ 디렉토리에 대해서 모든 권한을 갖게 해준다. 그 밑의 chownchmodsocket의 소캣 소유자와 고유권한을 의미한다.

vacuumuWSGI 종료 시 socket파일 삭제 여부를 의미한다.

 

이렇게 ini파일을과 함께 실행되도록 uWSGI를 구성할 수 있다. uWSGI에 사용한 것과 동일한 옵션을 파일에 넣은 다음 uWSGI에 해당 파일을 실행하도록 요청할 수 있고 구성을보다 쉽게 ​​관리 할 수 ​​있다.

 

 

 

 

 

 

[최종결과]

전체적인 구조는(?) 다음과 같다.

client - nginx - unix socket - uWSGI django web server python, html, db

728x90
Comments