본문 바로가기

Server Story....

Ubuntu 24.04 파이썬 가상환경(venv) 완벽 세팅 및 백그라운드 서비스 구축 기록

반응형

1. 도입 및 배경 (왜 굳이 가상환경을 쓰는가?)

윈도우에서 개발할 때는 그냥 글로벌 환경에 pip install을 때려 박아도 큰 문제가 없었음. 하지만 리눅스(특히 Ubuntu 24.04 LTS 이상)에서는 상황이 완전히 다름.

최신 우분투는 OS 구동에 필수적인 시스템 파이썬 패키지들을 보호하기 위해, 글로벌 환경에서 pip로 패키지를 설치하는 것을 원천 차단함 (PEP 668 정책). 억지로 설치하려고 하면 externally-managed-environment 에러를 뱉어냄.

따라서 리눅스 서버에서 파이썬 스크립트(특히 이전에 만든 서버 상태 모니터링 같은 것들)를 돌리려면, 시스템과 완벽히 격리된 가상환경(Virtual Environment, venv) 구축이 선택이 아닌 필수임.


2. 아키텍처 개념도 (Global vs venv)

나중에 헷갈리지 않기 위해 시스템 구조를 텍스트 아트로 남겨둠. 가상환경은 결국 독립된 파이썬 실행 파일과 라이브러리 폴더를 가지는 '복제된 샌드박스'임.

Plaintext
 
[Ubuntu 24.04 OS]
 │
 ├─ [System Python (Global)] --> /usr/bin/python3 (OS 자체 도구들이 사용, 건드리면 안 됨)
 │
 └─ [My Project Folder] : /home/user/monitor_project/
     │
     ├─ .venv/ (가상환경 폴더)
     │   ├─ bin/  --> activate (활성화 스크립트), python (격리된 실행기), pip
     │   └─ lib/  --> /site-packages/ (여기에만 외부 라이브러리 설치됨)
     │
     └─ monitor.py (이전에 만든 슬랙 알림 코드)

3. 필수 패키지 설치 (사전 준비)

우분투에는 기본적으로 파이썬3가 설치되어 있지만, venv 모듈과 패키지 관리자인 pip는 직접 설치해 줘야 함. 최근에 정리한 **[APT 패키지 관리 루틴]**을 먼저 돌린 후 아래 명령어를 실행함.

Bash
 
# 시스템 업데이트 먼저 진행
sudo apt update && sudo apt upgrade -y

# 파이썬 venv 모듈 및 pip 설치
sudo apt install python3-venv python3-pip -y

# 설치 확인
python3 --version

[메모] python이 아니라 반드시 python3 명령어를 사용해야 함.


4. 프로젝트 폴더 및 가상환경 생성

시스템 루트 경로가 아닌, 내 사용자 홈 디렉토리(~) 아래에 작업 공간을 만듦.

Bash
 
# 1. 작업용 디렉토리 생성 및 이동
mkdir ~/server_monitor
cd ~/server_monitor

# 2. 가상환경 생성 (.venv 라는 이름으로 생성하는 것이 국룰)
python3 -m venv .venv

# 3. 폴더 구조 확인 (ls -al)
# .venv 폴더가 생성된 것을 확인할 수 있음.

가상환경을 만들었다고 바로 적용되는 것이 아님. 시스템이 글로벌 파이썬 대신 이 폴더 안의 파이썬을 바라보도록 **'활성화(Activation)'**를 해줘야 함.


5. 가상환경 활성화 및 검증

활성화 스크립트는 .venv/bin/ 안에 있음. source 명령어를 사용해 현재 셸에 적용함.

Bash
 
# 가상환경 활성화
source .venv/bin/activate

[활성화 성공 시 나타나는 변화] 터미널 프롬프트 맨 앞에 (.venv)라는 글자가 붙음. 예: (.venv) user@myserver:~/server_monitor$

Bash
 
# 정말로 격리되었는지 확인하는 필수 커맨드
which python
# 출력결과: /home/user/server_monitor/.venv/bin/python (글로벌 경로가 아님을 확인)

which pip
# 출력결과: /home/user/server_monitor/.venv/bin/pip

이제 이 상태에서 패키지를 설치하면 OS 시스템에는 전혀 영향을 주지 않고 오직 .venv 폴더 안에만 쌓이게 됨.


6. 기존 모니터링 코드 이식 및 라이브러리 설치

윈도우에서 돌리던 코드를 그대로 리눅스로 가져올 차례임. 이전에 작성한 파이썬 실시간 서버 모니터링 도구 (링크) 코드를 사용할 것임.

Bash
 
# 필요한 라이브러리 설치 (가상환경이 활성화된 상태여야 함)
pip install psutil requests

# 패키지 목록 백업 (나중을 위해 requirements.txt 생성)
pip freeze > requirements.txt

[vim 에디터로 코드 작성]

Bash
 
vim monitor.py

(이전에 작성했던 슬랙 웹훅 발송 코드와 DB 체크 코드를 붙여넣기 후 :wq로 저장)

테스트 실행:

Bash
 
python monitor.py
# 슬랙으로 알림이 정상적으로 날아오면 성공.

7. [심화] systemd를 이용한 24시간 백그라운드 서비스 등록

윈도우 서버에서는 '작업 스케줄러'나 'Windows 서비스'에 등록해서 파이썬을 백그라운드로 돌렸음. 리눅스에서는 **systemd**를 사용해 데몬(Daemon)으로 띄우는 것이 정석임. 터미널을 꺼도 24시간 내내 모니터링 스크립트가 돌아가게 만들어야 함.

Bash
 
# 시스템 서비스 파일 생성 (root 권한 필요)
sudo vim /etc/systemd/system/sysmonitor.service

아래 내용을 환경에 맞게 작성함. (경로 주의!)

Ini, TOML
 
[Unit]
Description=Python Server Monitoring Service
After=network.target

[Service]
User=내리눅스계정명
WorkingDirectory=/home/내리눅스계정명/server_monitor
# 핵심: 실행 파일 경로를 가상환경(venv) 안의 파이썬으로 지정해야 함!
ExecStart=/home/내리눅스계정명/server_monitor/.venv/bin/python /home/내리눅스계정명/server_monitor/monitor.py
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target

작성 완료 후 서비스 등록 및 기동:

Bash
 
# systemd 데몬 재로드 (새 파일을 인식시킴)
sudo systemctl daemon-reload

# 서비스 부팅 시 자동 시작 등록
sudo systemctl enable sysmonitor

# 서비스 즉시 시작
sudo systemctl start sysmonitor

# 작동 상태 확인
sudo systemctl status sysmonitor

8. 트러블슈팅 및 삽질 기록 (Troubleshooting Log)

나중에 반드시 겪게 될 에러들과 해결책을 미리 텍스트로 박아둠.

Q1. pip install 시 error: externally-managed-environment 발생

  • 원인: 가상환경을 활성화(source .venv/bin/activate)하지 않고 글로벌 셸에서 바로 pip를 실행했기 때문임. (우분투 24.04의 보안 정책).
  • 해결: source 명령어로 가상환경을 먼저 켜거나, 부득이한 경우 pip install --break-system-packages 옵션을 줘야 하지만 절대 권장하지 않음.

Q2. systemctl status 확인 시 ModuleNotFoundError: No module named 'requests' 에러

  • 원인: systemd 서비스 파일(sysmonitor.service)의 ExecStart 경로를 글로벌 파이썬(/usr/bin/python3)으로 적었기 때문임.
  • 해결: ExecStart를 반드시 가상환경 파이썬 절대경로(/home/계정명/프로젝트/.venv/bin/python)로 수정하고 systemctl daemon-reload 후 재시작할 것.

Q3. 가상환경 빠져나오기 (종료) 및 삭제

  • 활성화 상태에서 터미널에 deactivate 라고 치면 원래 글로벌 환경으로 돌아옴.
  • 가상환경이 꼬여서 초기화하고 싶다면? 그냥 폴더를 통째로 날리면 끝임. (rm -rf .venv/ 후 처음부터 다시 생성)

9. 관련 기록 (Cross-References)

반응형