서버 운영
서버를 재부팅한 후 서비스가 정말 다시 떴는지 확인하기
재부팅 후 자동 시작 설정이 제대로 작동했는지 확인하지 않으면, 한 시간 뒤에 서비스가 내려간 줄도 모르고 있을 수 있다.
서버를 유지보수하기 위해 재부팅해야 할 때가 있다. 커널 업데이트, 보안 패치, 물리적 점검 등의 이유로. 문제는 재부팅 후다.
systemd와 자동 시작 설정
Linux 서버의 대부분은 systemd를 사용한다. 서비스가 자동으로 시작되도록 설정하는 방법은 간단하다.
# 서비스를 자동 시작하도록 설정
sudo systemctl enable my-service
# 현재 자동 시작 상태 확인
sudo systemctl is-enabled my-service
# 출력: enabled 또는 disabled
재부팅 후 확인 절차
서버를 재부팅한 후에는 다음을 꼭 확인해야 한다.
# 1. 서비스가 실행 중인가?
sudo systemctl status my-service
# 2. 프로세스가 정말 떠 있는가?
ps aux | grep my-service
# 3. 포트가 열려 있는가? (예: 포트 3000)
sudo ss -lntp | grep 3000
# 4. 네트워크 응답을 하는가?
curl http://localhost:3000 || curl http://your-server:3000
문제를 찾기 위한 로그 확인
서비스가 시작되지 않은 이유를 로그에서 찾을 수 있다.
# 서비스 로그 확인
sudo journalctl -u my-service -n 50
# 또는 실시간으로 보기
sudo journalctl -u my-service -f
# 시스템 전체 로그
sudo journalctl -n 100
흔한 문제들
1. 환경 변수 미설정
재부팅 후 셸 환경이 초기화되므로, 서비스 설정 파일에서 환경 변수를 명시해야 한다.
# /etc/systemd/system/my-service.service
[Service]
Environment="NODE_ENV=production"
Environment="DATABASE_URL=postgresql://..."
ExecStart=/usr/bin/node /opt/app/index.js
2. 파일 권한 문제
로컬에서는 root로 실행했는데, 서비스는 특정 사용자로 실행될 수 있다.
# 파일 소유권 확인
ls -la /opt/app/
# 필요하면 권한 변경
sudo chown -R app-user:app-user /opt/app/
3. 포트가 이미 사용 중
이전 인스턴스가 제대로 종료되지 않았거나, 다른 서비스가 포트를 사용 중일 수 있다.
sudo lsof -i :3000 # 또는
sudo ss -lntp | grep 3000
배포 후 체크리스트
- 서비스 상태 확인 (enabled인가?)
- 프로세스 실행 중인가?
- 포트가 열려 있는가?
- 실제로 응답하는가?
- 로그에 에러가 없는가?
- 주요 기능을 몇 가지 테스트했는가?
재부팅은 한 시간, 하루가 아니라 몇 주 뒤에 문제를 드러낼 수 있다. 지금 5분 투자해서 확인하는 것이 나중의 밤샘을 막는다.