Server/Linux

라즈베리파이 웹서버 구축(nginx, uWSGI , Flask, Python)

soccerda 2021. 5. 13. 17:55
반응형

집에 구매해 놓고 1년 넘게 방치한 라즈베리파이 4를 한번 사용해보려고 서버를 구축하여 개인 프로젝트 진행해보려고 한다.

 

선행 단계로

  • raspberry pi OS 설치
  • apt update

를 해주면 된다.

 

 

파이썬으로 웹서버를 구축하려면 일반적으로 nginx - CGI - 파이썬 웹 프레임워크로 구성한다.

 

파이썬 Flask만으로도 웹서버를 구성할 수 있지만 1명밖에 사용할 수 없기 때문에 uwsgi(Web Server Gateway Interface)미들웨어 (CGI)를 앞단(소켓통신)에 넣고 서비스를 한다.

 

nginx 설치

sudo apt-get install nginx

브라우저로 http://localhost 혹은 http://127.0.0.1를 입력하여 열어보자.

위 화면이 나오면 정상적으로 설치가 된 것이다.

 

uWSGI 설치

sudo apt-get install uwsgi

설치 중 오류가 발생하였다.

sudo apt-get update --fix-missing 실행하여 해결하자.

 

sudo apt-get install uwsgi-plugin-python

소스 디렉터리 만들기

mkdir www

cd www

mkdir myproject

cd myproject

 

가상 환경 생성

 

생성한 가상 환경 디렉터리에 가서 가상 환경을 생성한다.

python3 -m virtualenv venv

가상 환경 실행

source venv/bin/activate

 

설치 라이브러리 확인

pip list 

 

 

가상 환경에 uWSGI, Flask 설치하기

 

pip install uWSGI

pip install flask

 

 

다시 설치된 라이브러리 확인

pip list

 

테스트용 페이지를 만들어 보자.

(venv) nano first.py

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
   return 'Hello World!'

if __name__ == '__main__':
   app.run(host='0.0.0.0')

 

생성한 파일을 실행해보자.

(venv) python3 first.py

 

웹브라우저를 통해서 확인!

잘 열린다.

 

Ctrl + C를 눌러  종료하자.

 

uWSGI를 연동하기 위한 파일을 만들자.

 

(venv) nano wsgi.py

from first import app

if __name__=="__main__":
    app.run()

 

uWSGI 테스트

uwsgi --socket 0.0.0.0:5000 --protocol=http --wsgi-file wsgi.py --callable app --processes 4

--callable app 옵션 값은 위에 소스상에서 정의한 값으로 application으로 정의하면 빼도 된다. default 옵션으로 application을 사용하기에..

 

동일한 URL가 실행되는지 확인하자.

 

http://172.16.8.12:5000/

 

 

wsgi.ini 파일 생성

긴 uwsgi 명령어(uwsgi --socket 0.0.0.0:5000 --protocol=http --wsgi-file wsgi.py --callable app --processes 4) 매번 입력하기 번거롭기에 설정 파일로 생성하고 호출하여 사용할 수 있다.

 

(venv) nano uwsgi.ini

[uwsgi]
module = wsgi:app
master=true
processes=4
socket=first.sock
chmod-socket = 666
vacuum = true
die-on-term = true

 

생성한 설정 파일로 wsgi를 실행해보자.

 

이제 nginx에 추가하 uwsgi를 세팅하자.

sudo nano /etc/nginx/sites-available/default

server {
    # the port your site will be served on
    listen 80;
    # the IP Address your site will be served on
    server_name 172.16.8.12;
    # Proxy connections to application server
    location / { try_files $uri @app; }
    location @app {
        include uwsgi_params;
        uwsgi_pass unix:/home/pi/www/myproject/first.sock;
    }
}

심벌 링크 생성

sudo ln -s /etc/nginx/sites-available/default /etc/nginx/sites-enabled/

 

 

nginx 재시작

sudo service nginx restart

 

5000 포트를 빼고도 호출이 된다!!

 

반응형