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 으로 구성했다.
요점만 정리해 보자.
일단, 메인 앱을 작성한 코드 옆에 아래 코드가 들어 있는 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
BJ.
Ed Webster 님의 사진, 출처: Pexels
'IT > 파이썬' 카테고리의 다른 글
파이썬 상속 구조 확인 - 상속된 순서를 보여주는 함수 (0) | 2021.01.25 |
---|---|
파이썬 람다 함수 - lambda inline function (0) | 2021.01.25 |
파이썬 flask 설정 값 읽어오기 - 파일에서 (0) | 2021.01.20 |
파이썬 two way referencing in mongoengine - ReferenceField 팁과 문제 해결 (0) | 2021.01.12 |
파이썬 venv 로 가상환경 설정하기 (0) | 2021.01.12 |