라즈베리파이 웹서버 구축(nginx, uWSGI , Flask, Python)
집에 구매해 놓고 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 포트를 빼고도 호출이 된다!!