파이썬기초122: Python과 Flask로 개발하는 웹개발 기본설정 프로젝트
작성자 정보
- 관리자 작성
- 작성일
컨텐츠 정보
- 3,862 조회
- 0 추천
- 목록
본문
제목 : Python과 Flask로 개발하는 웹개발 기본설정 프로젝트
* 이강좌를 보시기 전에
-------------------------------------------------------------------
어저께.. Python의 virtualenv에 대하여 간단한 강좌를 만들어서 올려 두었습니다.
아래 강좌를 먼저 참고해 주세요.
https://www.linux.co.kr/bbs/board.php?bo_table=lecture&wr_id=4296
-------------------------------------------------------------------
시작하기 전에 Nginx와 Flask에 대해서 아주 간단히 개념만 정리해보자.
Nginx란
nginx는 동시접속처리에 특화된 웹서버프로그램이다.
현재는 웹서버로서 Apache가 가장 많이 사용되지만 AWS상에서는 시장점유율 43% 정도이며 가볍고 성능이 좋은 웹서버엔진이다.
nginx는 nginx.conf파일의 location이라는 설정자를 사용하여 사용자요청을 배분하여 처리한다.
Flask란
Flask는 간단한 웹사이트 또는 간단한 API서버를 만드는데 특화된 Python Web Framework이다.
최근 웹개발환경도 클라우드환경으로 많이 이루어지고 있기에, Docker, Kubernetes에서 소규모 container단위로 개발한 후에 한꺼번에 배포하는 방식으로 자주 사용되고있다.
Python과 HTML, 그리고 CSS와 Javascript만 알면 쉽게 배울수 있다.
코드가 간단하고 쉽다.
virtualenv에 flask를 설치해서 바로 배포할 수 있다.
하지만, 아직도 복잡하고 기능이 많고 무거운 웹프로젝트는 Django를 사용하는 경우가 더많다.
즉, 가벼운 웹프로젝은 Flask로 복잡한 웹프로젝은 Django로 하면 되지만, 경계는 사실 없다. 알아서들 하시고.. ㅋ
이상으로 Nginx와 Flask에 대해 간단 설명이었고, 이제 본격적으로 시작해 보자.
자, 그럼 이제... 본격적으로 시작해 보겠다.
1. 프로그램 설치 및 설치확인
[root@sulinux01 ~]# dnf -y install nginx*
[root@sulinux01 ~]# dnf -y install python*
[root@sulinux01 ~]# python
Python 3.9.14 (main, Jan 9 2023, 00:00:00)
[GCC 11.3.1 20220421 (Red Hat 11.3.1-2)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
참고 : 만약에 우분투(18.xx or 16.xx) 기본 세팅
> sudo apt-get update
> sudo apt-get upgrade
> sudo apt-get install python3-pip python3-dev nginx
2. 가상환경(virtualenv) 설치
[root@sulinux01 ~]# python3 -m pip install --user -U virtualenv
Collecting virtualenv
Downloading virtualenv-20.23.0-py3-none-any.whl (3.3 MB)
|████████████████████████████████| 3.3 MB 3.6 MB/s
Collecting platformdirs<4,>=3.2
Downloading platformdirs-3.5.1-py3-none-any.whl (15 kB)
Collecting filelock<4,>=3.11
Downloading filelock-3.12.0-py3-none-any.whl (10 kB)
Collecting distlib<1,>=0.3.6
Downloading distlib-0.3.6-py2.py3-none-any.whl (468 kB)
|████████████████████████████████| 468 kB 24.4 MB/s
Installing collected packages: platformdirs, filelock, distlib, virtualenv
WARNING: Value for scheme.platlib does not match. Please report this to <https://github.com/pypa/pip/issues/10151>
distutils: /root/.local/lib/python3.9/site-packages
sysconfig: /root/.local/lib64/python3.9/site-packages
WARNING: Additional context:
user = True
home = None
root = None
prefix = None
Successfully installed distlib-0.3.6 filelock-3.12.0 platformdirs-3.5.1 virtualenv-20.23.0
WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv
[root@sulinux01 ~]#
3. 프로젝트 폴더 구성
[root@sulinux01 sspark]# mkdir flaskapp
[root@sulinux01 sspark]#
[root@sulinux01 sspark]# cd flaskapp
[root@sulinux01 flaskapp]#
[root@sulinux01 flaskapp]# virtualenv -p python flaskappenv
created virtual environment CPython3.9.14.final.0-64 in 137ms
creator CPython3Posix(dest=/home/sspark/flaskapp/flaskappenv, clear=False, no_ vcs_ignore=False, global=False)
seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle , via=copy, app_data_dir=/root/.local/share/virtualenv)
added seed packages: pip==23.1.2, setuptools==67.7.2, wheel==0.40.0
activators BashActivator,CShellActivator,FishActivator,NushellActivator,PowerS hellActivator,PythonActivator
[root@sulinux01 flaskapp]#
[root@sulinux01 flaskapp]#
[root@sulinux01 flaskapp]# ls -l flaskappenv
합계 4
drwxr-xr-x 2 root root 284 5월 12 14:05 bin
drwxr-xr-x 3 root root 23 5월 12 14:05 lib
drwxr-xr-x 3 root root 23 5월 12 14:05 lib64
-rw-r--r-- 1 root root 207 5월 12 14:05 pyvenv.cfg
[root@sulinux01 flaskapp]#
4. 가상환경(virtualenv) 활성화
[root@sulinux01 flaskapp]#
[root@sulinux01 flaskapp]# source flaskappenv/bin/activate
(flaskappenv) [root@sulinux01 flaskapp]#
(flaskappenv) [root@sulinux01 flaskapp]#
5. Flask 설정
(flaskappenv) [root@sulinux01 flaskapp]# pip install flask uwsgi
Collecting flask
Downloading Flask-2.3.2-py3-none-any.whl (96 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 96.9/96.9 kB 3.6 MB/s eta 0:00:00
Collecting uwsgi
Downloading uwsgi-2.0.21.tar.gz (808 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 808.5/808.5 kB 8.1 MB/s eta 0:00:00
Preparing metadata (setup.py) ... done
Collecting Werkzeug>=2.3.3 (from flask)
Downloading Werkzeug-2.3.4-py3-none-any.whl (242 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 242.5/242.5 kB 12.2 MB/s eta 0:00:00
Collecting Jinja2>=3.1.2 (from flask)
Downloading Jinja2-3.1.2-py3-none-any.whl (133 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 133.1/133.1 kB 9.3 MB/s eta 0:00:00
Collecting itsdangerous>=2.1.2 (from flask)
Downloading itsdangerous-2.1.2-py3-none-any.whl (15 kB)
Collecting click>=8.1.3 (from flask)
Downloading click-8.1.3-py3-none-any.whl (96 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 96.6/96.6 kB 18.2 MB/s eta 0:00:00
Collecting blinker>=1.6.2 (from flask)
Downloading blinker-1.6.2-py3-none-any.whl (13 kB)
Collecting importlib-metadata>=3.6.0 (from flask)
Downloading importlib_metadata-6.6.0-py3-none-any.whl (22 kB)
Collecting zipp>=0.5 (from importlib-metadata>=3.6.0->flask)
Downloading zipp-3.15.0-py3-none-any.whl (6.8 kB)
Collecting MarkupSafe>=2.0 (from Jinja2>=3.1.2->flask)
Downloading MarkupSafe-2.1.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86 _64.whl (25 kB)
Building wheels for collected packages: uwsgi
Building wheel for uwsgi (setup.py) ... done
Created wheel for uwsgi: filename=uWSGI-2.0.21-cp39-cp39-linux_x86_64.whl size=515880 sha256=d08b5feba7a24fffe0df16c7c3b38b4dfadc59ef22e909c9dccc1880babd4f44
Stored in directory: /root/.cache/pip/wheels/4c/b1/b1/9e32832706944163421d515c2c0562f66a49b5a98f3805196e
Successfully built uwsgi
Installing collected packages: uwsgi, zipp, MarkupSafe, itsdangerous, click, blinker, Werkzeug, Jinja2, importlib-metadata, flask
Successfully installed Jinja2-3.1.2 MarkupSafe-2.1.2 Werkzeug-2.3.4 blinker-1.6.2 click-8.1.3 flask-2.3.2 importlib-metadata-6.6.0 itsdangerous-2.1.2 uwsgi-2.0.21 zipp-3.15.0
(flaskappenv) [root@sulinux01 flaskapp]#
(flaskappenv) [root@sulinux01 flaskapp]#
6. 간단한 flask 앱(flaskapp.py) 생성
(flaskappenv)> python flaskapp.py
(flaskappenv) [root@sulinux01 flaskapp]# vi flaskapp.py
(flaskappenv) [root@sulinux01 flaskapp]#
(flaskappenv) [root@sulinux01 flaskapp]#
(flaskappenv) [root@sulinux01 flaskapp]# cat flaskapp.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def home():
return '<h2>Hello Flask</h2>'
if __name__ == '__main__':
app.run(host='0.0.0.0')
(flaskappenv) [root@sulinux01 flaskapp]#
(flaskappenv) [root@sulinux01 flaskapp]#
(flaskappenv) [root@sulinux01 flaskapp]#
(flaskappenv) [root@sulinux01 flaskapp]# python flaskapp.py
* Serving Flask app 'flaskapp'
* Debug mode: off
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
* Running on all addresses (0.0.0.0)
* Running on http://127.0.0.1:5000
* Running on http://192.168.19.201:5000
Press CTRL+C to quit
구동후 aws의 그룹에서 인바운드 추가(5000,80(http))
=> 문제점 : 터미널 세션을 물고 있어서, 창을 닫으면 그대로 종료된다.
=> 백그라운드에서 서비스가 구동되게 처리가 필요하다.
=> uwsgi를 사용하여 재구성
7. uwsgi를 entry point 구성
(flaskappenv) [root@sulinux01 flaskapp]# vi wsgi.py
(flaskappenv) [root@sulinux01 flaskapp]#
(flaskappenv) [root@sulinux01 flaskapp]#
(flaskappenv) [root@sulinux01 flaskapp]# cat wsgi.py
# 엔트리 포인트로서, 서버가 구동되는 메인모듈을 가져와서
# 여기서 서버가동을 시켜버린다.
#from flaskapp import app
# Flask객체의 출처를 변경함으로써 내가 작성한 서비스로 연결점을 변경한다.
from test.f12 import app
if __name__ == '__main__':
app.run()
(flaskappenv) [root@sulinux01 flaskapp]#
8. uwsgi를 entry point 실행
(flaskappenv) [root@sulinux01 flaskapp]# uwsgi --socket 0.0.0.0:5000 --protocol=http -w wsgi:app
*** Starting uWSGI 2.0.21 (64bit) on [Fri May 12 14:24:43 2023] ***
compiled with version: 11.3.1 20220421 (Red Hat 11.3.1-2) on 12 May 2023 05:07:26
os: Linux-5.14.0-162.23.1.el9_1.x86_64 #1 SMP PREEMPT_DYNAMIC Tue Apr 11 19:09:37 UTC 2023
nodename: sulinux01
machine: x86_64
clock source: unix
detected number of CPU cores: 1
current working directory: /home/sspark/flaskapp
9. 서비스 운영에 필요한 설정파일 구성
- 가상환경 빠져 나오기
(flaskappenv) [root@sulinux01 flaskapp]# deactivate
[root@sulinux01 flaskapp]#
[root@sulinux01 flaskapp]# vi flaskapp.ini
[root@sulinux01 flaskapp]#
[root@sulinux01 flaskapp]# cat flaskapp.ini
[uwsgi]
module=wsgi:app
master=true
processes=5
socket=flaskapp.sock
chmod-socket=660
vacuum=true
die-on-term=true
[root@sulinux01 flaskapp]#
10. 시스템파일 생성
- 서버 재가동시 자동으로 uwsgi, flaskapp 을 가동시켜주는 부분
[root@sulinux01 sspark]# vi /etc/systemd/system/flaskapp.service
[root@sulinux01 sspark]#
[root@sulinux01 sspark]#
[root@sulinux01 sspark]# cat /etc/systemd/system/flaskapp.service
[Unit]
Description=uWSGI service flaskapp
After=network.target
[Service]
User=sspark
Group=www-data
WorkingDirectory=/home/sspark/flaskapp
Environment="PATH=/home/sspark/flaskapp/flaskappenv/bin"
ExecStart=/home/sspark/flaskapp/flaskappenv/bin/uwsgi --ini flaskapp.ini
[Install]
WantedBy=multi-user.target
[root@sulinux01 sspark]#
11. 서비스 파일 시작 및 활성화
[root@sulinux01 sspark]# systemctl start flaskapp
[root@sulinux01 sspark]#
[root@sulinux01 sspark]# systemctl enable flaskapp
Created symlink /etc/systemd/system/multi-user.target.wants/flaskapp.service → /etc/systemd/system/flaskapp.service.
[root@sulinux01 sspark]#
12. nginx 연동 설정. proxy 요청 처리
[root@sulinux01 nginx]# vi /etc/nginx/sites-available/flaskapp
[root@sulinux01 nginx]#
[root@sulinux01 nginx]# cat /etc/nginx/sites-available/flaskapp
server {
listen 80;
server_name 192.168.19.201;
location / {
include uwsgi_params;
uwsgi_pass unix:///home/sspark/flaskapp/flaskapp.sock;
}
}
[root@sulinux01 nginx]#
13. 기타 처리해야할 것들
- 링크 설정
[root@sulinux01 nginx]# ln -s /etc/nginx/sites-available/flaskapp /etc/nginx/sites-enabled
[root@sulinux01 nginx]#
[root@sulinux01 nginx]# ls -l /etc/nginx/sites-enabled
lrwxrwxrwx 1 root root 35 5월 12 14:41 /etc/nginx/sites-enabled -> /etc/nginx/sites-available/flaskapp
[root@sulinux01 nginx]#
- 문법 체크
[root@sulinux01 nginx]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@sulinux01 nginx]#
- nginx 재가동
[root@sulinux01 nginx]# systemctl restart nginx
아래는 nginx의 시작/재시작/종료에 관한 것임. 참고하기 바람.
----------------------------------------------------------------
- nginx 시작하기
[root@sulinux01 ~]# nginx
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] still could not bind()
[root@sulinux01 ~]#
이미 80번 포트를 사용하고 있어서 실패함.
아마도 아파치(httpd)가 구동되어 있을 것임.)
[root@sulinux01 ~]# killall httpd
[root@sulinux01 ~]#
그래서 아파치 죽이고 다시 nginx 구동함.
[root@sulinux01 ~]# nginx
[root@sulinux01 ~]#
[root@sulinux01 ~]# ps -ef | grep nginx
root 10865 1 0 16:40 ? 00:00:00 nginx: master process nginx
nginx 10866 10865 0 16:40 ? 00:00:00 nginx: worker process
root 10868 10583 0 16:40 pts/0 00:00:00 grep --color=auto nginx
[root@sulinux01 ~]#
- nginx 재시작
[root@sulinux01 ~]# nginx -s reload
[root@sulinux01 ~]#
- nginx 종료하기
[root@sulinux01 ~]# nginx -s stop
[root@sulinux01 ~]#
[root@sulinux01 ~]# ps -ef | grep nginx
root 10873 10583 0 16:40 pts/0 00:00:00 grep --color=auto nginx
[root@sulinux01 ~]#
--------------------------------------------------------------------------
- nginx server 접속 허용
> sudo ufw allow 'Nginx Full'
- 코드 수정후 재시작법
[root@sulinux01 nginx]# systemctl restart flaskapp
=====================================================================
14. 웹브라우즈로 확인하기
15. 기타
서비스 상태보기
[root@sulinux01 nginx]# tail -f /var/log/nginx/access.log
[root@sulinux01 nginx]# systemctl status flaskapp
× flaskapp.service - uWSGI service flaskapp
Loaded: loaded (/etc/systemd/system/flaskapp.service; enabled; vendor preset: disabled)
Active: failed (Result: exit-code) since Fri 2023-05-12 14:44:13 KST; 1min 6s ago
Duration: 2ms
Process: 10765 ExecStart=/home/sspark/flaskapp/flaskappenv/bin/uwsgi --ini flaskapp.ini (code=exited, status=216/GROUP)
Main PID: 10765 (code=exited, status=216/GROUP)
CPU: 1ms
5월 12 14:44:13 sulinux01 systemd[1]: Started uWSGI service flaskapp.
이렇게 마무리 했습니다.
[[ 내가 개발한 서비스를 배포 ]]
다음음 참고로.. 본인이 직접 개발한 서비스를 배포하기 위한 간단한 절차 합니다.
1. ftp툴(파일질라)을 이용하여 엔트리포인트 이하로 패키지를 구성
2. 해당 패키지 밑으로 배포 (업로드)
3. 개발시 사용한 모듈설치 (서비스별로 가상환경을 별도 구성 원칙)
> source flaskappenv/bin/activate
(flaskappenv)> pip install -r ./test/requrements.txt
4. 엔트리포인트(wsgi.py)에서 app의 출처를 변경 및 저장
5. 서비스 재가동
> systemctl restart flaskapp
관련자료
-
이전
-
다음