일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- beautifulsoup
- github
- PYTHON
- mysql
- requests
- atlas
- portfolio
- flaskframework
- Crawling
- mongodb
- Project
- java
- POST
- get
- CSS
- synology
- flask
- venv
- json
- body
- Algorithm
- openapi
- backend
- javascript
- NAS
- fetch
- OOP
- CRUD
- frontend
- pymongo
- Today
- Total
wisePocket
[NAS 배포★] Synology NAS 배포 사전 테스트 Docker-compose로 서버 구축하기(Nginx-uwsgi-flask) 배포 전 로컬 테스트 04 본문
[NAS 배포★] Synology NAS 배포 사전 테스트 Docker-compose로 서버 구축하기(Nginx-uwsgi-flask) 배포 전 로컬 테스트 04
ohnyong 2023. 7. 19. 23:14NAS에서는 Docker, Nginx 등을 사용할 수 있다.
우선적으로 내 로컬 PC의 Docker로부터 Nginx를 통한 웹 서버 연결을 진행하면 NAS에서도 그대로 진행할 수 있다고 생각했다. 아주 많은 오류를 부딪히면서 Docker-compose를 통한 웹 서버를 생성했다. 이전 AWS EB로 배포한 프로젝트가 얼마나 쉽게 세팅하고 이미지를 만들고 배포해 주는지 깨닫게 되기도 했지만 생각보다 겹치는 부분이 많고 한번 진행하니 감이 온다.
간단히 요약하면 우선 Docker에서
- Flask+uwsgi를 묶어서 1개의 이미지 생성
- Nginx를 1개의 이미지로 생성
- 그리고 root폴더인 1개의 컨테이너가 위 2개의 이미지를 동시에 실행한다고 생각하면 된다.
그리고 이미지를 만드는 조건은 각 폴더를 구성하고[root/flask/, root/nginx/] 설정 파일들을 넣어두면 root폴더에 위치한 docker-compose가 알아서 각 이미지로 빌드 및 컨테이너에 담아준다.
간단해 보이지만 진행하는데 튀어나오는 혼란스러운 용어들과 "적당한 예제는 어디있을지", "나와 같이 NAS를 활용한 사례", "NAS에서는 어떤 WAS가 적당한지", "uwsgi는 무엇인지" 등등 찾느라 하루 온종일 매달렸다. 다행히 AWS EB배포를 한번 진행했고, Docker를 이전에 Oracle을 사용하기 위해서 설치하고 이것저것 만져본 경험이 있어서 Docker 자체의 기본 설정이나 Docker 자체가 무엇인지 이해도를 조금 가지고 시작해서 그나마 하루 정도로 실행되는 모습을 본 것 같다.(지식이 늘었다+1)
무한의 구글링이 진행되고 있을 무렵 내가 가장 궁금증들을 말끔히 사라지게 만든 바로 "폴더 구조"를 명확히 보여준 블로그를 찾아냈다. AWS EB 배포에서도 deploy/ 폴더가 실질적인 프로젝트 업로드&배포의 대상이었다. 나는 Nginx가 내 조그마한 프로젝트에 어떤 게 너의 메인 파일이고 Flask Framework인지 확인하고, 포트는 어떤 것을 사용할 것이며, index.html, style.css, script.js는 어딨 냐고 물어보길 원했다. 하지만 이것은 uwsgi라는 Middleware존재와 전체적인 폴더 구조, 설정 파일의 위치를 보고 모든 의문이 풀렸다.
1. 폴더 구조
2. root/Flask/ 내 코드 수정 및 코드 삽입, 생성 필요 파일(+uwsgi)
- app.py 엔트리 포인트 수정
from flask import Flask
//Blueprint로 route를 관리할 경우 아래 코드 사용
from route.app_route import app_route
app = Flask(__name__)
//Blueprint로 route를 관리할 경우 아래 코드 사용
app.register_blueprint(app_route)
...
if __name__ == '__main__':
app.run(host='0.0.0.0')
*BluePrint?
이러한 URL 매핑을 @app.route('/')라는 어노테이션 만들어 준다. 이때 @app.route와 같은 어노테이션으로 URL을 매핑하는 함수를 라우팅 함수라고 한다.
그런데 하나 생각해 볼 점이 있다. 지금까지 작성한 대로라면 새로운 URL 매핑이 필요할 때마다 라우팅 함수를 create_app 함수 안에 계속 추가해야 한다. 이렇게 라우팅 함수가 계속 추가된다면 create_app 함수는 엄청나게 크고 복잡한 함수가 될 것이다. 블루프린트(Blueprint)를 사용하면 이 문제를 해결할 수 있다.
- uwsgi.ini 파일 생성 및 옵션 설정
[uwsgi]
wsgi-file = app.py
callable = app
socket = :5000
processes = 4
threads = 2
master = true
vacum = true
chmod-socket = 660
die-on-term = true
*uWSGI란?
WSGI라는 규칙을 따라서 만들어진 소프트웨어이며 정적인 웹 서버(Apache / Nginx)와 python으로 작성된 Web Framework(Flask / Django) 사이의 통신을 도와주는 역할을 한다.
주요 기능
- wsgi-file을 flask app 진입점인 app.py로 설정
- callable : 연결될 Flask 모듈이름
- socket : uwsgi어플리케이션과 웹서버가 통신할 소켓 경로 또는 uwsgi서버가 동작하는 서버의IP와 포트 번호 명시(만약 nginx와 같이 배포하지 않는다면 http-socket으로 변경)
- route/app_route.py (Blueprint로 route를 관리할 경우 아래 코드 사용)
from flask import Blueprint, render_template
app_route = Blueprint('first_route',__name__)
@app_route.route('/')
def index():
return render_template('index.html')
- requirements.txt 프로젝트에서 사용된 라이브러리 목록(freeze로 생성)
uWSGI==2.0.21
anyio==3.7.1
beautifulsoup4==4.12.2
blinker==1.6.2
bs4==0.0.1
certifi==2023.5.7
charset-normalizer==3.2.0
click==8.1.5
dnspython==2.4.0
exceptiongroup==1.1.2
Flask==2.3.2
h11==0.14.0
httpcore==0.17.3
idna==3.4
importlib-metadata==6.8.0
itsdangerous==2.1.2
Jinja2==3.1.2
MarkupSafe==2.1.3
pymongo==4.4.1
requests==2.31.0
sniffio==1.3.0
soupsieve==2.4.1
urllib3==2.0.3
Werkzeug==2.3.6
zipp==3.16.2
*uWSGI 패키지를 설치하지 않으면 오류가 발생해서 설치하고 재빌드했었음
pip3 install uwsgi
*방금 패키지 추가 설치해 놓고 requirements.txt에 추가 안 해서 또 에러가 발생함
pip freeze > requirements.txt
- Dockerfile Docker가 Flask 이미지를 만들 때 참고할 파일
FROM python:3
WORKDIR /app
ADD . /app
RUN pip install -r requirements.txt
CMD ["uwsgi","uwsgi.ini"]
3. root/Nginx/ 내 코드 수정 및 코드 삽입, 생성 필요 파일
- nginx.conf 서버 이름, 응답 포트 등 서버 설정 파일
server {
listen 80;
server_name 127.0.0.1;
location / {
include uwsgi_params;
uwsgi_pass flask:5000;
}
}
*nginx.conf 파일을 안 만들어서 오류가 발생했었음.
- Dockerfile Docker가 Nginx 이미지를 만들 때 참고할 파일
FROM nginx
RUN rm /etc/nginx/conf.d/default.conf
COPY nginx.conf /etc/nginx/conf.d/
4. root/ 내 코드 수정 및 코드 삽입, 생성 필요 파일
- docker-compose.yml 이미지 2개를 합쳐 1개의 컨테이너로 발행하는 docker-compose 명령어를 수행할 때 참고할 파일
version: "3.7"
services:
flask:
build: ./flask
container_name: flask
restart: always
environment:
- APP_NAME=FlaskTest
expose:
- 5000
nginx:
build: ./nginx
container_name: nginx
restart: always
ports:
- "80:80"
5. 터미널 root/ 폴더에서 docker-compose 실행
docker-compose up -d --build
GUI에서 flask, nginx 이미지 모습
CLI에서 flask, nginx 이미지 모습
2개 이미지가 동시 실행되는 컨테이너의 모습
서버 실행 후 브라우저에서 http://localhost:80으로 응답하는 웹 페이지 화면
해당 프로젝트는 아래 깃을 통해 업데이트되고 있습니다.
https://github.com/yzpocket/Flask_project_fan
'Synology NAS Server Tutorials' 카테고리의 다른 글
1 (0) | 2023.07.20 |
---|---|
[NAS 배포] Synology NAS 자체 웹 호스팅을 위한 NAS DNS 서버 세팅 및 도메인 Name Server 설정 05 (0) | 2023.07.20 |
[NAS 배포] Synology NAS 동기화 폴더 Synology Drive Client 설치 03 (0) | 2023.07.19 |
[NAS 배포] Synology NAS DSM 접근 02 (0) | 2023.07.19 |
[NAS 배포] Synology NAS 초기화? 01 (0) | 2023.07.19 |