본문 바로가기

AI Inventors 개발 Story

AI Inventors History#2-5 "Personalcolor AI 개발 - Nginx 연동" 본문

IT 개발 프로젝트/Personalcolor AI 개발

AI Inventors History#2-5 "Personalcolor AI 개발 - Nginx 연동"

ai.inventors 2020. 9. 1. 23:20

안녕하세요

AI Inventors 입니다 :)

 

오늘은 상용 Web서버 구현을 위한 Nginx 웹서버 어플리케이션 연동 부분을 공유드리고자 합니다.

이전 포스팅에서 말씀드렸던 것처럼,

파이썬 라이브러리로 구현된 Flask Framework은 기본적인 웹서버 기능을 탑재하고 있지만,

동시 접속 세션 수 제한 등의 기능제한이 있어, 개발용 이외에는 사용이 다소 어렵습니다.

 

따라서, 상용 웹서버 어플리케이션인 Nginx와의 연동을 해주어서 상용 서버에 deploy해주셔야 합니다.

Flask Framework과 Nginx 웹서버 어플리케이션은 uWSGI라는 인터페이스, 프레임워크를 통해 연동합니다.

uWSGI란, FLASK와 같은 WSGI 표준 프레임워크와 연동하기 위한 규격이라고 보시면 될 것 같습니다.

 

 

 

Nginx / uWSGI 설치

 

우선, Nginx/uWSGI 어플리케이션 설치를 위해기본 설치 과정부터 진행합니다.

저희 퍼스널컬러AI 서비스는 Ubuntu 16.04 서버 위에서 개발하였으며,

향후 소개드리는 내용 역시 해당 시스템 내에서 동작하였음을 미리 말씀드립니다.

 

apt install nginx
apt install uwsgi 
apt install uwsgi-plugin-python

기본 리눅스 명령어로 nginx, uwsgi를 설치해주신 후, uwsgi-plugin까지 설치를 해줍니다.

uwsgi plugin은 python과 uwsgi를 연결하는 플러그인 이라고 보시면 됩니다.

 

 

 Nginx 설정

 

설치가 마무리되셨다면,

하단과 같이 Nginx를 설정해볼텐데요

 

 

 

$ vi /etc/nginx/sites-available/default

server {
        listen  80; #외부에서 서버로 접속할 Port
		server_name 0.0.0.0;
		server_name personalcolorai.site; #보유하고있는 도메인
		server_name www.personalcolorai.site;


        location / {
                include uwsgi_params;
                uwsgi_pass unix:/tmp/uwsgi.sock; ## uwsgi와 nginx를 연결할 socket파일이 위치할 디렉토리
        }
}

etc/nginx/sites-available/default 파일은 

nginx 어플리케이션이 구동되었을때, 행동할 default내역을 설정해주는 파일입니다.

 

어떤분들은 sites-enabled에 파일을 설정하고, 바로가기 link를 sites-available에 링크시키는 분들도 계시는데,

저는 해당 서버는 이 퍼스널컬러AI 하나의 서비스만 구동할 예정이기에 따로 그렇게 하지는 않았습니다.

 

우선 vi편집기를 열어

default파일을 수정모드로 열어주시고!!

위 config 내역과 같이 자겅해줍니다.

 

listen은 외부에서 어떤 ip, url, port로 접속할건지 여부를 물어보는 항목인데요.

웹서버로써 기능을 할 예정이고, https가 아닌 http로 동작시킬 예정이니 80포트를 열어주고,

모든 IP에서의 접속을 허용할 예정이니

server_name은 0.0.0.0으로 설정해주시고,

갖고계신 도메인이 있으시다면, server_name "도메인" 의 형태로 작성해주세요!

 

그리고, Nginx는 단독으로 설정해서 사용하는 방식이 아닌, 

Flask와 연동해서 사용해줄 예정이니, uwsgi_pass를 적어주어야합니다.

uwsgi_pass 뒤에, socket파일이 위치할 디렉토리를 적어주시면 되는데, 특별히 선호하시는 디렉토리가 없다면

위와같이 tmp 디렉토리 하단에 위치하도록 적어주시면 되겠습니다.

 

 

 uWSGI 설정

 

이제, Flask와 Nginx를 이어줄 uWSGI를 설정해줄 차례입니다.

 

$ touch /home/user/pcolor_ai/uwsgi.ini
$ vi /home/user/pcolor_ai/uwsgi.ini

chdir = "디렉토리명" ## ex) /home/user/pcolor_ai
chmod-socket = 666
socket = /tmp/uwsgi.sock
module = app
callable = app
virtualenv = /opt/conda/envs/OpenCV-master-py3

 

우선 touch 명령어를 사용하여, 프로젝트 최상위 디렉토리 내에 "uwsgi.ini" 파일을 만들어줍니다.

이후, 해당 파일을 vi편집기를 통해 수정모드로 열어주시고,

위 config를 입력해줍니다.

 

chdir 뒤에는 내 프로젝트의 디렉토리를 적어주시면 되구요,

socket은 아까 Nginx 설정을 하실때 작성하셨던 socket의 디렉토리를 적어주시면되고,

module, callable은 

Flask에서 사용하셨던 모듈명을 적어주시면 됩니다.

보통, app.route, application.route의 형태로 Flask 코드를 작성하셨을텐데요.

본인의 코드를 보고 맞게 작성해주시면 되겠습니다.

 

virtualenv는 python 가상환경 경로인데요.

제가 맨 처음 개발할때 당시에는 anaconda환경에서 opencv를 설치해서 사용을 했어서

virtualenv가 그대로 남아있는데,

본인이 사용하신 가상환경을 적어주시면 되겠습니다!

 

 

 Nginx 구동

 

Nginx 구동을 위해선 주의해주셔야할 부분이 2가지 있습니다.

 

1. Nginx, uWSGI 재시작2. 기본 Nginx 프로세스 kill

 

 

우선, 아래와 같이 service restart 명령어로, nginx와 uwsgi를 재시작하여, 설정한 config들이 어플리케이션에 잘 할당될 수 있도록 해줍니다.

sudo service nginx restart
sudo service uwsgi restart

 

 

하지만, 주의하셔야할게,

nginx를 재시작하고 나면,

간혹 nginx 기본 프로세스가 80포트를 차지하고 있어, python 파일을 실행시키더라도,

아래와 같은 에러메시지를 만나게 되실 수도 있습니다.

socket.error: [Errno 98] Address already in use

 

 

이 경우, "lsof -i"명령어를 입력하셔서, 아래와 같이 현재 사용중인 process 리스트들을 확인하시고, 

그중 하단의 python 3.6의 Name column에 보시면 있는 것과 같이 "http Listen"을 점유하고 있는 프로세스가 있다면

"kill -9 xxxx(PID)" 명령어를 입력하셔서, 프로세스를 kill시키시기 바랍니다.

$ lsof -i

COMMAND     PID USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
dhclient    732 root    6u  IPv4   12346      0t0  UDP *:bootpc 
container  1007 root    7u  IPv4   16173      0t0  TCP localhost:40731 (LISTEN)
python3.6 xxxxx root    3u  IPv4 xxxxxxx      0t0  TCP *:http (LISTEN)

 

이후, python 파일을 실행시키시면, 무리없이 파일을 실행시킬 수 있습니다.

 

지금까지 AI Inventors 였습니다.

감사합니다 :)

Comments