Raspberry Pi에 Flask로 작성된 웹프로그램을 퍼블리싱 하는 과정을 기록합니다. 클로드 코드의 도움을 받아 진행했습니다.
최초작성 2025. 12. 27
1: 라즈베리파이 기본 설정
2: 프로젝트 디렉토리 생성
3: Flask 및 필요한 패키지 설치
4: Flask 애플리케이션 작성
5: 환경 변수 파일 생성
6: 로컬 테스트
7: Gunicorn 설정 파일 생성
8: Systemd 서비스 생성 (자동 시작)
9: Nginx 리버스 프록시 설정
10: 방화벽 설정
11: 테스트
12: HTTPS 설정 (선택사항 - 도메인이 있는 경우)
13: 로그 확인 및 모니터링
14: 유용한 관리 명령어
문제 발생시 해결
1: 라즈베리파이 기본 설정
SSH로 라즈베리파이 접속합니다.
$ ssh pi@192.168.0.100
사용할 웹서버로 nginx를 설치합니다.
$ sudo apt install nginx -y
현재 설치된 파이썬 버전은 다음과 같습니다. conda를 설치안하고 진행했습니다.
$ python -V
Python 3.13.5
설치된 nginx 버전은 다음과 같습니다.
$ nginx -version
nginx version: nginx/1.26.3
2: 프로젝트 디렉토리 생성
홈 디렉토리에 프로젝트 폴더를 생성합니다.
‘
$ cd ~
$ mkdir flask-api
$ cd flask-api
파이썬 가상환경을 생성합니다.
$ python -m venv venv
가상환경을 활성화합니다.
$ source venv/bin/activate
프롬프트가 (venv)로 시작하게 됩니다.
pi@raspberrypi:~/flask-api $ source venv/bin/activate
(venv) pi@raspberrypi:~/flask-api $
3: Flask 및 필요한 패키지 설치
가상환경이 활성화된 상태에서 다음 패키지들을 설치합니다.
$ pip install flask
$ pip install gunicorn
$ pip install python-dotenv
4: Flask 애플리케이션 작성
테스트에 사용할 app.py 파일을 생성합니다. 본 포스트에선 nano를 사용하여 진행합니다.
$ nano app.py
app.py 내용을 다음처럼하고 Ctrl + O 눌러 저장, Ctrl + X 눌러 nano에서 빠져나옵니다.
5: 환경 변수 파일 생성
OpenSSL로 SECRET_KEY를 생성합니다.
$ openssl rand -hex 32
.env 파일을 생성합니다.
$ nano .env
.env 내용을 다음처럼하고 Ctrl + O 눌러 저장, Ctrl + X 눌러 nano에서 빠져나옵니다.
6: 로컬 테스트
Flask 개발 서버로 동작하는지 테스트해봅니다.
$ python app.py
* Serving Flask app 'app'
* 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.0.100:5000
피시의 웹브라우저에서 http://192.168.0.100:5000 접속되는지 합니다. 문제 없으면 json이 출력됩니다.
잘 작동하면 Ctrl+C로 중단합니다.
7: Gunicorn 설정 파일 생성
wsgi.py 파일을 생성합니다.
$ nano wsgi.py
wsgi.py 내용을 다음처럼하고 Ctrl + O 눌러 저장, Ctrl + X 눌러 nano에서 빠져나옵니다.
Gunicorn를 테스트해봅니다.
$ gunicorn --bind 0.0.0.0:5000 wsgi:app
피시의 웹브라우저에서 http://192.168.0.100:5000 접속되는지 확인합니다.
잘 작동하면 Ctrl+C로 중단합니다.
8: Systemd 서비스 생성 (자동 시작)
서비스 파일 생성하여 웹 프로그램이 자동으로 실행되도록 합니다.
$ sudo nano /etc/systemd/system/flask-api.service
flask-api.service 내용을 다음처럼하고 Ctrl + O 눌러 저장, Ctrl + X 눌러 nano에서 빠져나옵니다.
ExecStart의 명령은 최적화해서 변경해야 할 수도 있습니다.
다음 명령들을 사용하여 동작을 확인합니다.
서비스 시작
$ sudo systemctl start flask-api
서비스 상태 확인
$ sudo systemctl status flask-api
부팅 시 자동 시작 설정
$ sudo systemctl enable flask-api
# 소켓 파일 확인.
$ ls -la /home/pi/flask-api/flask-api.sock
9: Nginx 리버스 프록시 설정
홈 디렉토리에 외부 사용자(www-data)가 진입할 수 있도록 실행 권한 부여합니다.(첫번째 방법)
또는 보안을 더 신경 쓴다면 그룹에만 권한 부여해줍니다.(두번째 방법)
첫번째 방법
$ chmod 755 /home/pi
두번쨰 방법
$ sudo chgrp -R www-data /home/pi/flask-api
$ sudo chmod -R 750 /home/pi/flask-api
Nginx 설정 파일을 생성합니다.
sudo nano /etc/nginx/sites-available/flask-api
flask-api 내용을 다음처럼하고 Ctrl + O 눌러 저장, Ctrl + X 눌러 nano에서 빠져나옵니다.
기본 사이트를 비활성화하고
$ sudo rm /etc/nginx/sites-enabled/default
새 설정을 활성화합니다.
$ sudo ln -s /etc/nginx/sites-available/flask-api /etc/nginx/sites-enabled/
Nginx 설정을 테스트합니다.
$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Nginx 재시작합니다.
$ sudo systemctl restart nginx
Nginx 상태를 확인합니다. fail 메시지가 없어야 합니다.
$ sudo systemctl status nginx
10: 방화벽 설정
UFW 방화벽을 설치합니다.
sudo apt install ufw -y
필요한 포트를 열어줍니다.
SSH 포트 허용
sudo ufw allow 22
HTTP 포트 허용
sudo ufw allow 80
HTTPS 포트 허용 (나중에 SSL 사용 시)
sudo ufw allow 443
방화벽을 활성화합니다.
sudo ufw enable
상태를 확인해보면 열린 포트가 보입니다.
$ sudo ufw status
11: 테스트
서비스가 자동으로 활성화 되는지도 확인하기 위해 라즈베리파이를 재부팅하여 확인해봅니다.
같은 인터넷 공유기에 있는 컴퓨터나 스마트폰의 웹브라우저에서 접속해보면 JSON이 출력됩니다.
다음처럼 라즈베리파이의 아이피를 입력해주면 됩니다.
http://192.168.0.77
12: HTTPS 설정 (선택사항 - 도메인이 있는 경우)
아직 진행해보지는 않았습니다.
Certbot 설치
sudo apt install certbot python3-certbot-nginx -y
SSL 인증서 발급 (도메인이 있어야 함)
sudo certbot --nginx -d yourdomain.com
이메일 입력, 약관 동의, 리다이렉트 설정 등 진행
자동 갱신 설정 확인
sudo certbot renew --dry-run
13: 로그 확인 및 모니터링
Flask 서비스 로그를 실시간으로 확인할 수 있습니다.
sudo journalctl -u flask-api -f
Nginx 에러 로그를 확인합니다.
sudo tail -f /var/log/nginx/error.log
Nginx 접속 로그를 학인합니다.
sudo tail -f /var/log/nginx/access.log
서비스 재시작이 필요한 경우 다음처럼 해야 합니다.
sudo systemctl restart flask-api
sudo systemctl restart nginx
14: 유용한 관리 명령어
# 서비스 중지
sudo systemctl stop flask-api
# 서비스 시작
sudo systemctl start flask-api
# 서비스 재시작
sudo systemctl restart flask-api
# 서비스 상태 확인
sudo systemctl status flask-api
웹 프로그램 코드를 수정했다면 서비스 재시작을 반드시 해야 합니다.
코드 수정을 했다면
cd ~/flask-api
nano app.py
서비스를 재시작해야 변경사항이 반영됩니다.
sudo systemctl restart flask-api
패키지를 추가 설치시에도 서비스를 재시작 해줘야 합니다.
가상환경을 활성화후 원하는 패키지를 설치해줍니다.
cd ~/flask-api
source venv/bin/activate
pip install 패키지명
서비스를 재시작해야 합니다.
sudo systemctl restart flask-api
문제 발생시 해결
서비스가 시작되지 않을 때 다음처럼 로그를 확인해보면 원인을 파악할 수 있습니다.
sudo journalctl -u flask-api -n 50 # 최근 50줄 로그 확인
502 Bad Gateway 에러가 발생시 소켓 파일 권한을 확인합니다.
ls -la ~/flask-api/flask-api.sock
서비스를 재시작합니다.
sudo systemctl restart flask-api nginx
포트가 이미 사용 중일때 다음처럼 확인합니다.
sudo netstat -tulpn | grep :80
sudo lsof -i :5000
