본문 바로가기
IT/파이썬

파이썬 - Flask 모듈을 Gunicorn 을 이용하여 Nginx 에 연동하기 - WSGI 서버

Flask 를 이용해서 파이썬 서비스를 개발했다. 그런데, 실행을 시켜보면 WSGI 서버를 사용해라는 경고가 떡하니 불안하게 만드네...

WARNING: Do not use the development server in a production environment. Use a production WSGI server instead.

 

요는 개발 단계에서 테스트로 flask 서버를 이용해도 무방하지만, 실제 배포 서비스 개시하는 production 단계에서는 WSGI 서버를 사용해라는 것이 요지이다.

 

아파치나 Nginx 서버에 연동해서 이 flask 모듈을 자동으로 불러 줄 수 있도록 설정해야 한다.

 

먼저 WSGI 를 설정하려고 찾아보다가 지-유니콘 이라는 모듈을 쓰면 아주 쉽고 성능도 괜찮게 쓸 수 있다는 사실을 보고, 그냥 지유니콘을 이용해서 설정해 보려 한다.

 

각설하고, 열심히 찾아보니 아래와 같은 아주 자세한 스텝 바이 스텝 매뉴얼이 있어 고대로 따라하니 무난히 성공

나의 환경은 Nginx + Flask + Gunicorn 으로 구성했다.

 

www.digitalocean.com/community/tutorials/how-to-serve-flask-applications-with-gunicorn-and-nginx-on-ubuntu-18-04

 

How To Serve Flask Applications with Gunicorn and Nginx on Ubuntu | DigitalOcean

In this guide, you will build a Python application using the Flask microframework on Ubuntu 18.04. The bulk of this article will be about how to set up the Gunicorn application server and how to launch the application and configure Nginx to act as a f

www.digitalocean.com

요점만 정리해 보자.

일단, 메인 앱을 작성한 코드 옆에 아래 코드가 들어 있는 wsgi.py 라는 것을 만드는 것이 핵심, 나중에 이 파일을 통해 app이 실행되는 형태를 취하기 때문인 듯 하다.

from myproject import app

if __name__ == "__main__":
    app.run()

그리곤, gunicorn 설정으로 바인딩 시켜 둔다. 아래와 같은 명령으로

 

아래 포트는 5000 인데, flask app에서 기본으로 포트를 주지 않으면 5000으로 바인딩 되어서 이렇게 해 주는데 자신이 만든 app이 실행되는 port number를 주는 것이 맞겠지..

 

> gunicorn --bind 0.0.0.0:5000 wsgi:app

 

그다음 중요한 단계는 서비스 레벨로 등록 시켜 부팅이 되더라도 nginx 서버가 뜨면 이 flask app을 실행할 수 있도록 설정하는 아주 긴 여정이다.

 

일단 서비스를 하나 만든다.

 

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

 

이 파일내부는 아래와 같은 내용이 들어가면 된다. 자기 환경에 맞게 몇개의 내용만 수정하면 된다.

[Unit]
Description=Gunicorn instance to serve myproject
After=network.target

[Service]
User=sammy
Group=www-data
WorkingDirectory=프로젝트가있는절대경로/home/sammy/myproject
Environment="PATH=프로젝트의가상환경의bin폴더절대경로/home/sammy/myproject/myprojectenv/bin"
ExecStart=프로젝트의가상환경의bin폴더절대경로/home/sammy/myproject/myprojectenv/bin/gunicorn --workers 3 --bind unix:myproject.sock -m 007 wsgi:app

[Install]
WantedBy=multi-user.target

 

머 이렇게 쓰고, 저장하고 서비스를 등록하면 된다.

> sudo systemctl start myproject

> sudo systemctl enable myproject

 

이젠 nginx 서버에 해당 서비스 uri 가 들어오면 연결해주는 설정을 하면 마무리 된다.

먼저 아래 내용으로 설정파일을 하나 만든다.

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

 

내용은 아래와 같다. 서버이름은 자신의 것으로 변경하고, 

proxy_pass 부분에 경로도 자신의 작업폴더 절대 경로로 바꾸면 된다. myproject.sock 은 바로 위에 서비스 등록시에 만든 --bind unix:myproject.sock 이 부분의 이름을 그대로 사용해야 한다. 바꿨으면 같이 바꿔야 한다.

listen 포트는 아래 80으로 되어 있었는데 난 그냥 12345로 바꾸어서 설정하려면 listen 부분에 숫자를 변경하면 된다.

server {
    listen 12345;
    server_name your_domain www.your_domain;

    location / {
        include proxy_params;
        proxy_pass http://unix:/home/sammy/myproject/myproject.sock;
    }
}

이 설정을 아래와 같이 site-enabled  부분에 소프트 링크를 걸어 같이 공유하도록 하면 된다.

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

 

이제 Nginx 서버를 재 실행하면 끝!!

> sudo systemctl restart nginx

 

아~~ 방화벽 설정은 기본으로 풀어둬야 겠죠. 서비스할 포트와 하나더 (내용은 잘 모르지만 그대로 쓰자)

> sudo ufw delete allow 12345

> sudo ufw allow 'Nginx Full'

 

참고로 'Nginx Full' 방화벽 설정에 대한 설명은 여기

www.digitalocean.com/community/tutorials/how-to-install-nginx-on-ubuntu-18-04

  • Nginx Full: This profile opens both port 80 (normal, unencrypted web traffic) and port 443 (TLS/SSL encrypted traffic)
  • Nginx HTTP: This profile opens only port 80 (normal, unencrypted web traffic)
  • Nginx HTTPS: This profile opens only port 443 (TLS/SSL encrypted traffic)

이제 http://localhost:12345/ 이렇게 접근하면 따로 flask app을 띄우지 않아도 해당 프로젝트 코드가 수행됨을 확인할 수 있다.

 

venv 를 사용하는 것이 이젠 필수인듯하다. venv 환경을 빼고는 테스트 해보지 않았으니 위에 알려준 링크에 들어가서 순서대로 해보세요. 여기 정리는 나중에 다시 영문을 읽기 싫어서 끄적여 둔것이니 혹시 변경되는 부분 참고만 하시길~~

 

HTTPS 지원을 위해 좀 더 해야 하는데, 아래글을 참고해서 하나 더 테스트 해봐야 할 듯

dev.to/chand1012/how-to-host-a-flask-server-with-gunicorn-and-https-942

 

How to Host a Flask Server With Gunicorn and HTTPS

In this tutorial, we will be setting up a Flask server using Gunicorn and NGINX on Ubuntu 18.04 LTS....

dev.to

 

BJ.

proxy 프록시

Ed Webster 님의 사진, 출처: Pexels