강좌
클라우드/리눅스에 관한 강좌입니다.
프로그램 분류

파이썬기초122: Python과 Flask로 개발하는 웹개발 기본설정 프로젝트

작성자 정보

  • 관리자 작성
  • 작성일

컨텐츠 정보

본문

제목 : 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. 웹브라우즈로 확인하기  


http://192.168.19.201:5000/ 



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



관련자료

댓글 0
등록된 댓글이 없습니다.

공지사항


뉴스광장


  • 현재 회원수 :  60,035 명
  • 현재 강좌수 :  35,795 개
  • 현재 접속자 :  154 명