Flask 서버를 윈도우 서비스에 등록하는 방법

요즘 Visual Basic Code 에 Claude Sonnet 3.7 을 에이전트로 사용해 개발하는데 맛을 들렸다. 평소에 구상은 해두었지만, 직접 개발하기엔 시간이 오래 걸려서 손 놓고 있던 다양한 프로젝트들을 빠르게 개발, Docker 화해서 NAS 서버에 올려 생산성을 극대화하고 있다.
그러던 와중 작성한 웹 애플리케이션 중 하나가 반드시 Windows OS 의 로컬 PC 에서 실행해야 할 상황이 발생했다. 이 웹 애플리케이션을 서비스 형태로 백그라운드에서 상시 운영하기 위해 이 글을 작성하게 되었다.
이 글에서는 OS 에서 제공하는 윈도우 서비스를 직접 사용하지 않고 NSSM를 통해 서비스를 생성할 것이다. 이렇게 하는 이유는 윈도우 서비스 기능을 이용해 bat 파일을 등록하면 즉시 bat 파일을 실행 후 종료되기 때문에 서비스를 직접 컨트롤할 수 없기 때문이다. NSSM 을 통해 윈도우 서비스를 등록하면 bat 파일을 직접 실행하지 않고 nssm.exe 파일의 인자 값으로 bat 파일을 전달하므로 서비스를 컨트롤할 수 있다.
테스트 환경은 다음과 같다.
- Windows 10 OS
- Python 버전은 3.11.0
- Python venv 모듈로 가상화.
1. NSSM 다운로드 & 설치
NSSM 사이트에 접속 후, 좌측 네비게이션에서 Download
를 클릭한다.

중간의 Latest release
의 최신 버전을 다운로드한다.

NSSM 은 특별한 설치 파일을 필요로 하지 않는다. 다운로드한 ZIP 파일을 압축 해제하면 안에 몇몇 개의 폴더가 존재하며, win32
에는 32비트 nssm.exe
실행 파일이, win64
폴더에는 64비트 실행 파일이 존재한다. 본인의 OS 아키텍처에 맞게 실행 파일을 선택하자.

2. BAT 파일 작성
이제 NSSM 에 등록할 서비스가 실행할 명령어를 담을 bat 파일을 작성해야 한다. 그 전에 Flask 앱의 구조에 대해 간략하게 설명하겠다. 내가 작성한 웹 애플리케이션은 venv
폴더에 가상화 모듈을 저장하고 있으며, run.py
를 실행해 서버를 시작한다.

수동으로 서버를 실행할 시 다음과 같은 명령어들을 실행한다.
PS C:\Users\Moonding\Downloads\test_flask> .\venv\Scripts\activate
(venv) PS C:\Users\Moonding\Downloads\test_flask> python .\run.py
* Serving Flask app 'app'
* Debug mode: on
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:5012
* Running on http://192.168.0.5:5012
위 과정을 bat 파일에 담으면 아래와 같다. 실행 경로와 실행 파일, 등은 본인의 상황에 따라 적절하게 수정하면 된다.
@echo off
SET APP_ROOT="웹 애플리케이션 루트 경로"
call "%APP_ROOT%\venv\Scripts\activate.bat"
cd "%APP_ROOT%"
python run.py
3. 윈도우 서비스 등록
이제 앞서 작성한 bat 파일을 NSSM 으로 서비스 등록하면 된다. 우선 앞서 다운로드한 nssm.exe
파일을 관리자 권한으로 실행하면 아래와 같은 GUI 창이 출력된다.
> nssm.exe install {서비스 이름}
GUI 창에서는 서비스 등록을 위한 자세한 인자 값들을 설정할 수 있다. 주요 설정 값은 다음과 같다.
- Path : 앞서 생성한 flask 서버 실행 bat 파일
- Startup directory : 웹 애플리케이션의 루트 경로.
- arguments : bat 실행 시 전달할 인자. 이 예제에서는 필요 없어서 공란이다.
등록된 서비스는 Windows OS 에서 제공하는 서비스 패널에서도 확인이 가능하다.

4. 윈도우 서비스 삭제
등록한 서비스를 삭제할 때는 remove
명령어를 전달하면 된다. 서비스 정보를 수정할 때는 edit
을 사용하면 된다,
> nssm.exe remove {서비스 이름}
> nssm.exe edit {서비스 이름}
