어서와, 개발은 처음이지?

[처음부터 시작하는 EC2] nginx와 uwsgi로 django 서비스하기 본문

EC2_Ubuntu_Devops

[처음부터 시작하는 EC2] nginx와 uwsgi로 django 서비스하기

오지고지리고알파고포켓몬고 2019. 1. 27. 00:24
반응형



지난 글에 이어 django 어플리케이션을 nginx, uwsgi를 사용하여 서비스 할 수 있도록 하겠습니다.

환경 구성에 대한 내용은 위키독스를 참고하였습니다.



0. uwsgi 테스트


가상환경에서 uwsgi를 설치하고 실행해보겠습니다.


우선 프로젝트 경로로 이동하여 가상환경을 활성화합니다.

가상환경에서 uwsgi를 설치합니다.

(myvenv) > pip install uwsgi

설치가 완료되면 uwsgi 명령어를 사용하여 프로젝트를 실행합니다.

(myvenv) > uwsgi --http :8000 --home ~/app/django/firstproject/myvenv/ --chdir ~/app/django/firstproject/ --wsgi-file ~/app/django/firstproject/yuddomack/wsgi.py

uwsgi의 옵션으로 


--http은 포트 번호,

--home은 virtualenv 가상환경 경로,

--chdir은 manage.py가 들어있는 Django 프로젝트 경로,

--wsgi-file은 wsgi.py의 경로를 입력하면 됩니다.


이제 ec2 dns의 8000번 포트에 접속하면 python manage.py runserver 0.0.0.0:8000 으로 앱을 실행 했을 때처럼동작하는 모습을 볼 수 있습니다.



1. uwsgi 설치


가상환경을 이용하여 uwsgi를 설치하고, 실행할 수 있지만 nginx와 연동하여 운영할 것이기 때문에 sudo 권한을 이용하여 설치하도록 합니다.

> sudo apt-get install python3-dev python3-pip python3-setuptools
> sudo -H pip3 install --upgrade pip
> sudo -H pip3 install wheel
> sudo -H pip3 install uwsgi



2. uwsgi 서비스 등록


service 명령을 사용하여 uwsgi를 제어하기 위해 /etc/systemd/system에 uwsgi.service 파일을 생성합니다.

> sudo vi /etc/systemd/system/uwsgi.service

그리고 아래 내용을 넣고 저장합니다.

[Unit]
Description=uWSGI Emperor service

[Service]
ExecStart=/usr/local/bin/uwsgi --emperor /etc/uwsgi/sites
Restart=on-failure
KillSignal=SIGQUIT
Type=notify
NotifyAccess=all
StandardError=syslog

[Install]
WantedBy=multi-user.target

이제 아래 명령을 실행하면 uwsgi가 service에 등록됩니다.

> sudo systemctl enable uwsgi
Created symlink /etc/systemd/system/multi-user.target.wants/uwsgi.service → /etc/systemd/system/uwsgi.service.

마지막으로 아래 명령이 잘 실행되는지 확인합니다.

> sudo service uwsgi status
● uwsgi.service - uWSGI Emperor service
   Loaded: loaded (/etc/systemd/system/uwsgi.service; enabled; vendor preset: en
   Active: inactive (dead)
lines 1-3/3 (END)

위와 같은 내용이 보인다면 정상적으로 실행된 것 입니다.

키보드 키 q를 눌러서 빠져나옵니다.



3. uwsgi 옵션 생성


uwsgi 옵션 파일들을 한 곳에서 관리하기 위해 아래 경로(uwsgi.service의 emperor 옵션에 설정한 경로)에 디렉토리를 생성합니다.

> sudo mkdir -p /etc/uwsgi/sites

다음은 sites 아래에 uwsgi 옵션 파일을 생성합니다.

> sudo vi /etc/uwsgi/sites/firstproject.ini

옵션 파일 명은 django app의 이름으로 설정했습니다.


이제 아래 내용을 입력합니다.

[uwsgi]
uid = ubuntu
project = firstproject
app = yuddomack
base = /home/ubuntu/app/django

chdir = %(base)/%(project)
home = %(base)/%(project)/myvenv
module = %(app).wsgi:application

master = true
processes = 16

thunder-lock = true
max-requests = 6000
max-requests-delta = 300

stat = /tmp/firstsite.stats.sock
memory-report = true

hirakiri = 160
socket = %(base)/%(project)/%(project).sock
logto = %(base)/%(project)/uwsgi.log
chown-socket = %(uid):www-data
chmod-socket = 660
vacuum = true
touch-reload = %(base)/%(project)/%(app)/settings.py

logto에 입력한 경로에 있는 파일에서 uwsgi의 실행 로그를 볼 수 있습니다.

만약 nginx 연동 이후 정상적으로 실행되지 않는 경우, 이 곳을 살펴보시기 바랍니다.



4. nginx 설치


아래 명령을 사용하여 nginx를 설치합니다.

> sudo apt-get install nginx



5. nginx 설정


이제 nginx 설정 파일에 uwsgi로 실행한 앱 정보를 등록합니다.


우선 설정 파일을 생성합니다.

> sudo vi /etc/nginx/sites-available/firstproject

다음은 아래 내용을 입력합니다.

server {
    listen 80;
    server_name 54.xxx.xxx.179 ec2-54-xxx-xxx-179.ap-northeast-2.compute.amazonaws.com;

    location = /favicon.ico { access_log off; log_not_found off; }
    location /static/ {
        root /home/ubuntu/app/django/firstproject/yuddomack;
    }

    location / {
        include         uwsgi_params;
        uwsgi_pass      unix:/home/ubuntu/app/django/firstproject/firstproject.sock;
    }
}

listen 포트는 http 기본 포트인 80로 설정했습니다.

이제 80번 포트가 uwsgi에서 시작하는 app에 연결됩니다.


location 수정 시 본인이 생성한 app의 경로가 맞는지 확인해주세요.


server_name은 django의 ALLOWED_HOSTS와 같이 입력합니다.


다음은 설정 파일의 링크를 sites-enabled에 생성합니다.

> sudo ln -s /etc/nginx/sites-available/firstproject /etc/nginx/sites-enabled/



6. 실행


service 명령을 사용하여 uwsgi와 nginx를 실행합니다.

> sudo service uwsgi start
> sudo service nginx start

이제 포트번호 없이 퍼블릭 dns 혹은 퍼블릭 ip에 접속해도 이전과 같은 화면을 볼 수 있습니다.(포트 번호 없이 접속하면 웹 서버 기본 포트인 80번에 연결됩니다.)



여기까지 nginx와 uwsgi에 django를 연동 해봤습니다.


nginx, uwsgi의 최적의 설정 값에 대한 부분은 아직 공부가 필요한 부분이라 자세히 작성하지 않았습니다.

이 부분은 나중에 따로 작성해보겠습니다.



다음 글에서는 nodejs로 웹 서비스를 동작시키도록 해보겠습니다.

Comments