ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Python] flask+ uwsgi 간단 웹서버
    Linux 2021. 7. 15. 12:06

    CSS나 Javascript가 필요없는 정말 단순한 웹서버나 Rest API를 만들 경우에는 굳이 nginx나 apache 같은 것을 두지 않고 wsgi 단독으로 서버를 구성할 수 있다.

    클라이언트 애플리케이션과 데이터를 주고 받는 용도로는 제일 간단한 방법일 것 같다.

     

    우선, python과 pip를 쓰기 편하게 구성한다.

    striban@raspberrypi:~ $sudo nano ~/.bashrc
    
    alias python=python3
    alias pip=pip3    - 맨 마지막줄에 추가

    ~/.bashrc 파일을 수정하면 python3와 pip3 대신 python과 pip 명령어를 쓸 수 있게 된다.

     

     

    이제 flask와 uwsgi를 설치한다.

    striban@raspberrypi:~ $ pip install flask uwsgi

     

    그리고, 간단한 웹앱을 만들어 테스트해본다.

    from flask import Flask
    
    application = Flask(__name__)
    
    @application.route("/")
    def hello():
        return "<h1>Hello!&nbsp;Striban!</h1>"
        
    @application.route("/str")
    def str():
        return "<h1>Striban!</h1>"
    
    if __name__ == "__main__":
        application.run(host='0.0.0.0')

    파일을 저장하고 파이썬으로 실행한다.

    striban@raspberrypi:~ $python striban.py
    
    * Serving Flask app "striban" (lazy loading)
     * Environment: production
       WARNING: Do not use the development server in a production environment.
       Use a production WSGI server instead.
     * Debug mode: off
     * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)

     

    웹브라우저에서 '서버IP:5000'로 접속하면 Hello! Striban! 이 보이고,

    하위 경로인 '서버IP:5000/str'로 접속하면 Striban! 이 보여진다.

     

     

    이제 Flask 웹앱과 웹소켓을 연동시킬 uwsgi를 설치한다.

    striban@raspberrypi:~ $sudo apt install uwsgi uwsgi-plugin-python3

     

    Flask 웹앱이 있는 곳에 wsgi.py 파일을 생성한다.

    from striban import application
    
    if __name__ == "__main__":
        application.run()

    Flask 웹앱의 application을 불러와야 하니 from striban import application을 넣는다.

    파일명 striban과 변수명 application은 striban.py와 wsgi.py에서 동일하게 맞춰 주어야 한다.

     

    테스트를 위해 uwsgi를 실행한다.

    striban@raspberrypi:~ $uwsgi --socket 0.0.0.0:5000 --protocol=http --plugin python3 --wsgi-file wsgi.py
    
    *** Starting uWSGI 2.0.19.1 (32bit) on [Thu Jul 15 11:57:17 2021] ***
    compiled with version: 8.3.0 on 17 June 2020 09:19:11
    os: Linux-5.10.17-v7+ #1414 SMP Fri Apr 30 13:18:35 BST 2021
    nodename: raspberrypi
    machine: armv7l
    clock source: unix
    pcre jit disabled
    detected number of CPU cores: 4
    current working directory: /home/striban
    detected binary path: /home/striban/.local/bin/uwsgi
    *** WARNING: you are running uWSGI without its master process manager ***
    your processes number limit is 6873
    your memory page size is 4096 bytes
    detected max file descriptor number: 1024
    lock engine: pthread robust mutexes
    thunder lock: disabled (you can enable it with --thunder-lock)
    uwsgi socket 0 bound to TCP address 0.0.0.0:5000 fd 3
    Python version: 3.7.3 (default, Jan 22 2021, 20:04:44)  [GCC 8.3.0]
    *** Python threads support is disabled. You can enable it with --enable-threads ***
    Python main interpreter initialized at 0x86d8f0
    your server socket listen backlog is limited to 100 connections
    your mercy for graceful operations on workers is 60 seconds
    mapped 64408 bytes (62 KB) for 1 cores
    *** Operational MODE: single process ***
    WSGI app 0 (mountpoint='') ready in 1 seconds on interpreter 0x86d8f0 pid: 9200 (default app)
    *** uWSGI is running in multiple interpreter mode ***
    spawned uWSGI worker 1 (and the only) (pid: 9200, cores: 1)

    이제 다시 웹브라우저에서 동일하게 접속을 테스트를 해본다.

     

    복잡한 명령어를 항상 실행할 수 없으므로 sh파일을 만들어 실행을 간단하게 한다.

    striban@raspberrypi:~ $nano str.sh
    
    uwsgi --socket 0.0.0.0:5000 --protocol=http --plugin python3 --wsgi-file wsgi.py > wsgi.log 2>&1

    실행 결과를 wsgi.log 파일로 저장하도록 하였다.

     

    쉘스크립트이므로 crontab으로 부팅할 때마다 자동으로 실행되도록 등록하면 된다.

    striban@raspberrypi:~ $crontab -e
    
    @reboot /home/striban/str.sh   - 제일마지막에 추가

     

    댓글

Designed by Tistory.