NAS에서는 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)
https://wpgur.tistory.com/76
무한의 구글링이 진행되고 있을 무렵 내가 가장 궁금증들을 말끔히 사라지게 만든 바로 "폴더 구조"를 명확히 보여준 블로그를 찾아냈다. 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')
Python
복사
더보기
•
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
TypeScript
복사
더보기
•
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')
Python
복사
•
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
Python
복사
더보기
더보기
•
Dockerfile Docker가 Flask 이미지를 만들 때 참고할 파일
FROM python:3
WORKDIR /app
ADD . /app
RUN pip install -r requirements.txt
CMD ["uwsgi","uwsgi.ini"]
Plain Text
복사
3. root/Nginx/ 내 코드 수정 및 코드 삽입, 생성 필요 파일
•
nginx.conf 서버 이름, 응답 포트 등 서버 설정 파일
server {
listen 80;
server_name 127.0.0.1;
location / {
include uwsgi_params;
uwsgi_pass flask:5000;
}
}
Plain Text
복사
더보기
•
Dockerfile Docker가 Nginx 이미지를 만들 때 참고할 파일
FROM nginx
RUN rm /etc/nginx/conf.d/default.conf
COPY nginx.conf /etc/nginx/conf.d/
PHP
복사
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"
Plain Text
복사
5. 터미널 root/ 폴더에서 docker-compose 실행
docker-compose up -d --build
Plain Text
복사
CLI에서 flask, nginx 이미지 모습
서버 실행 후 브라우저에서 http://localhost:80으로 응답한다.