이동식 저장소

Flask + uWSGI + nginx 환경 설정하기 본문

Tertiary/Backend

Flask + uWSGI + nginx 환경 설정하기

해스끼 2022. 9. 17. 16:20

지난 글에서 Flask를 정식으로 구동하기 위한 방법에 대해 공부했다. Flask는 단순히 애플리케이션일 뿐, 실제로 서버를 구현하려면 uWSGI와 nginx를 함께 사용해야 한다.

 

이제 실제로 Flask + uWSGI + nginx 환경을 만들어 보자. WSL2를 기준으로 설명하겠지만, 대부분의 리눅스 환경에서 적용할 수 있을 것이다.

uWSGI 설치

uWSGI와 uWSGI Python plugin을 설치하자. 파이썬 애플리케이션을 서버와 연결해야 하기 때문에 플러그인도 같이 설치해야 한다.

>> sudo apt-get install uwsgi uwsgi-plugin-python3

``python3``에서 3을 떼면 파이썬 2 버전에 대응하는 플러그인이 설치되니 주의하자. 사실 리눅스 계열 운영체제에서는 귀찮더라도 python 뒤에 3을 매번 붙이는 게 안전하다. 아니면 alias 걸던가.

 

참고로 ``>>`` 기호는 입력한 커맨드를 나타내는 내 나름의 기호이다. ``>>``가 없는 구문은 터미널에 출력되는 메시지를 나타낸다.

uWSGI 설정 파일 작성

uWSGI 설정 파일을 작성하자. 나는 프로젝트 디렉토리에 ``server.ini``라는 이름으로 작성했다. 내용은 다음과 같다.

 

아래 설명을 천천히 읽어보고 자신의 환경에 맞게 수정할 것!!

[uwsgi]

module = server:app

socket = /tmp/uwsgi.sock
chmod-socket = 666
vacuum = true

daemonize = [uWSGI 로그 파일 경로]

die-on-term = true

plugin-dir = /usr/lib/uwsgi/plugins
plugins = python3

``module``에는 Flask 애플리케이션의 경로를 지정한다. 콜론 앞에는 Flask 앱이 위치한 파일 이름을, 뒤에는 Flask 앱이 할당된 변수 이름을 적어야 한다. 아래 사진을 참고하자.

``socket``에는 서버 소켓 파일이 만들어질 경로를 지정한다. 나는 소켓을 ``/tmp`` 밑에 두었지만, 프로젝트 경로나 다른 편한 곳에 둬도 괜찮다. 단, ``root`` 또는 ``root``의 서브 디렉토리에 두면 안 된다. Nginx가 루트 디렉토리에 접근할 수 없기 때문이다. Nginx를 ``sudo``로 실행해도 마찬가지다.

 

``chmod-socket``은 그대로 놔두자. 형식을 보면 알겠지만 소켓 파일의 권한을 설정하는 부분이다.

 

``daemonize``에는 uWSGI 로그를 작성할 경로를 지정한다.

 

``plugin-dir``에서 uWSGI용 Python3 플러그인의 경로를 지정했는데, 이 경로에 ``python3_plugin.so`` 파일이 있는지 확인하자.

확인

다른 옵션은 그대로 두면 된다. 사실 나도 잘 모른다.

 

파일을 모두 작성했으면 다음의 심볼릭 링크를 설정하자. uWSGI에 방금 작성한 ``.ini`` 파일을 등록하는 과정이다. 

>> sudo ln -s [server.ini 절대 경로] /etc/uwsgi/apps-available
>> sudo ln -s /etc/uwsgi/apps-available/server.ini /etc/uwsgi/apps-enabled

또는 아예 처음부터 ``.ini`` 파일을 ``/etc/uwsgi/apps-available`` 경로에 작성한 후, 두 번째 심볼릭 링크만 설정해도 된다. 나는 ``.ini`` 파일을 Github에 올리기 위해 프로젝트 경로에 작성했다.

 

이제 uWSGI를 실행해 보자.

>> uwsgi --ini server.ini
getting INI configuration from server.ini

별다른 에러가 없다면 uWSGI 설정은 완료!

Nginx 설치

이제 nginx를 구성할 차례이다. 일단 설치부터 하자.

>> sudo apt-get install nginx

Nginx 구성

``/etc/nginx/sites-enabled/default`` 파일을 루트 권한으로 열어 보자. 뭔가 주석이 많지만 무시해도 된다. 파일 내용을 다음과 같이 수정하자. 루트 권한으로 열지 않으면 저장이 안 될 것이다.

>> sudo vi /etc/nginx/sites-enabled/default
# Default server configuration
#
server {
        listen 80 default_server;
        listen [::]:80 default_server;

        root /var/www/html;

        index index.html index.htm index.nginx-debian.html;

        server_name _;

        location / {
                try_files $uri @app;
        }

        location @app {
                include uwsgi_params;
                uwsgi_pass unix:[소켓 파일 경로];
        }
}

소켓 파일 경로는 아까 uWSGI 설정 파일에 작성한 경로를 넣으면 된다. 앞에 ``unix:``가 붙는 점에 유의. 참고로 ``location /`` 부분에서 ``$url``이 아니라 ``$uri``다.

 

방금 작성한 파일을 검증하기 위해 ``nginx -t``를 실행해 보자.

>> nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

테스트를 통과했다! 이제 nginx를 실행할 수 있다.

 Nginx 실행

>> sudo service nginx start
 * Starting nginx nginx                                                          [ OK ]

서버가 구동되었으니 이제 페이지에 접속해 보자. 이제 5000번 포트를 지정하지 않아도 된다. 그런 하찮은 포트포워딩은 nginx와 uWSGI가 대신 해준다. 서버를 로컬에서 실행했다면 ``localhost``만 입력하면 된다.

완벽 성공!

 

참고로 nginx 로그는 ``/var/log/nginx/error.log``와 ``/var/log/nginx/access.log``에서 확인할 수 있다. 뭔가 잘 안 된다면 로그를 잘 읽어보자.

참고문헌

 

[Infra] flask, nginx, uwsgi(2) 연동하기

flask, nginx, uwsgi 연동하기(실습)

losskatsu.github.io

 

[Python] Flask + uWSGI + Nginx를 연결 및 배포

이번 포스팅은 Flask + uWSGI + Nginx를 연결하여 웹 애플리케이션을 배포하는 포스팅입니다. Flask ( 웹 애플리케이션 ) Flask는 파이썬으로 작성된 마이크로 웹 프레임워크 중 하나이다. Flask 설치 $ pip i

soyoung-new-challenge.tistory.com

 

Comments