[웹서버로 콘텐츠 구분해서 서빙하기] systemd,systemctl 로 nginx process 관리하기

Hyunjun Kim·2025년 5월 17일
0

Data_Engineering

목록 보기
78/153

7 systemd,systemctl 로 nginx process 관리하기

위에서 NGINX는 systemd 로 관리되는 프로그램이라고 했다.
그렇다면 systemd는 무엇이지, systemd 로 관리되는 process의 관리방법을 배워본다.

systemd와 systemctl은 꼭 Nginx 프로세스뿐만 아니라 리눅스에서 다른 프로세스도 관리할 수 있다. 다른 프로그램에도 응용할 수 있다.

7.1 systemd와 systemctl

7.1.1 systemd란

systemd 는 Linux 계열에서 사용하는 시작시스템이자 시스템 매니저 표준이다. daemon 들을 관리를 통일하고 쉽게 만드는 역할을 한다.
systemd 는 PID =1 로서 운영체제가 부팅되면 가장 먼저 시작되는 프로세스이고, 리눅스의 시스템의 나머지 프로세스들을 시작시킨다.

7.1.2 systemctl이란

systemctl 은 init system(systemd)을 관리하는 도구이다.
systemd 서비스를 어떻게 관리할지를 정의하고, 상태확인, 상태 변경, 설정파일 관리 기능 등을 제공한다.

대표 명령어

  • systemctl start/stop $service : 서비스를 시작, 정지 한다. (service 명령어로 대체가능)
  • systemctl status $service : 서비스의 상태를 볼 수 있다. (service 명령어로 대체가능)
  • systemctl daemon-reload : systemd 설정을 적용, 리로드한다.
  • systemctl list-units : systemd unit 들을 모두 표기한다.
  • systemctl list-unit-files : systemd unit이 정의된 파일들의 위치를 알려준다.

리눅스 배포판에 따라서 systemctl 이 기본설치되어있지 않은 경우도 있다. 이 경우 추가로 설치해야 한다.

7.1.3 systemd 파일 위치

/etc/systemd/ 경로에 systemd 관련된 설정이 위치한다.
systemd 로 관리하는 대상은 통상 XXX.service 라는 파일로 관리한다. (.service suffix는 없어도 무방하다. 그냥 컨벤션이라고 보자.)

7.1.4 systemd 설정 구성

[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStart=/usr/sbin/nginx

Unit

  • 이 시스템 서비스가 어떤 서비스야. 라는 걸 정의한 것
  • systemd 서비스에 대한 설명이다. 다른 systemd 서비스들 사이의 관계 (어떤 시스템 서비스 이후에 실행되어야 한다는 등) 정보도 표기한다.
    • After : 다른 시스템 뒤에 이게 와야 돼.
    • Wants : 이 systemd가 돌기 위해서 다른 어떤 시스템 서비스가 필요해?

nginx 같은 경우 기본적으로 네트워크 관련된 기본적인 시스템 관련된 거랑 네트워크 관련된 게 준비되어야 하기 때문에 syslog, network-online, remote-fs, nss-lookup. 그리고 network-online을 원한다고 쓰여 있다.

Service

  • systemd 서비스를 관리하기 위한 정보이다.
  • PIDFile(PID 어느 파일에 남는지), 어떻게 시작하는지, ExecStart(어떤 명령어로 시작하는 거야), 어떤 명령어를 수행하는 지 등의 정보를 표기한다.

7.1.5 비슷한 관계의 다른 리눅스 시스템

systemd 는 시스템 데몬을 관리하는 시스템, 프로세스이다. systemctl 은 systemd 를 이용하기위한 관리 툴이다.
리눅스에서 이와 비슷한 관계의 다른 시스템이 있다.

journald / journalctl

  • jouranld 는 로그를 관리하는 데몬 시스템이다. logrotate 가 이것을 이용해서 동작한다.
  • journalctl 은 journald를 사용하기위한 관리 툴이다.

logrotate : 파일 로그 많이 쌓이면 자동으로 파일 분리해주는 거.

logind / loginctl

  • logind 는 유저 세션을 관리하는 데몬 시스템이다.
  • loginctl 은 logind를 사용하기위한 관리 툴이다.

7.2 systemctl로 nginx service 등록하기 실습

7.2.1 service 설정 파일등록

sudo vi /etc/systemd/system/nginx.service
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/usr/sbin/nginx -s reload
ExecStop=/usr/sbin/nginx -s stop
PrivateTmp=true

[Install]
WantedBy=multi-user.target
  • Unit의 After, Wants 에 있는 작업들은 linux 의 다른 systemd 서비스들이다.
  • ExecStop 에서 stop 을 사용할지, quit 을 사용할지는 선택해서 사용한다.
    • ExecStop=/bin/kill -s QUIT $MAINPID 는 stop 과 같다.
  • ExecStartPre 를 통해서 start 이전에 syntax validation을 하도록 설정했다.
  • systemctl 은 다음 지정된 명령에 대한 동작만 정의할 수 있다.
    • {start|stop|restart|reload|force-reload|status|configtest|rotate|upgrade}

7.2.2 설정 변경 적용

systemctl daemon-reload

7.2.3 service 명령어 사용

sudo service $servie_name $commaand

시작

sudo service nginx start

리로드

sudo service nginx reload

정지

sudo service nginx stop

7.2.4 service 상태 확인

sudo service nginx status

7.3 systemctl로 죽지 않는 프로세스 만들기

7.3.1 자동 재시작 설정

[Unit] 에 다음 설정을 추가한다.

StartLimitIntervalSec=500
StartLimitBurst=5

무한히 재시도하는 것을 방지한다. 재시도를 5회까지만 시도하고, 그래도 실패하면 시작은 실패로 끝난- 다.

[Service] 에 다음 설정을 추가한다.

Restart=on-failure
RestartSec=5s
  • system crash (mem, disk) 또는 강제종료(systemctl 명령어에 의한 것이 아닌)에 대해서 restart 가 동작한다.
  • 5초 기다린 뒤에 재시작한다. (리소스 정리에 시간이 필요하다.)

7.3.2 실습

systemctl daemon-reload
sudo service nginx start
sudo service nginx status
  • 여기서 master process의 pid 확인. 이하 $PID

kill 로 강제종료 후 status 로 재기동 확인

sudo kill -9 $PID
sudo service nginx status

nginx 명령어로 강제종료 후 status 로 재기동 확인

sudo nginx -s quit
sudo service nginx status


이번에는 systemd가 무엇인지, 그리고 이를 제어하는 도구인 systemctl이 무엇인지 배웠고, 이를 통해 프로세스가 무한히 실패하더라도 자동으로 재시작되도록 설정하는 방법을 익혔다.

이러한 구성이 가지는 가장 큰 장점은 예상치 못한 시스템 환경에서의 안정성 확보다. 예를 들어, 소켓이 과도하게 열려 파일 디스크립터(FD)가 부족해지거나, 메모리 사용량이 급증해 프로세스가 크래시되는 상황에서도 자동으로 서비스를 복구할 수 있다.

실제로 서버를 단 한두 대가 아닌, 수십 대에서 수천 대까지 운영하는 환경에서는 개별 프로세스 상태를 사람이 일일이 확인하고 수동으로 재기동하는 것은 불가능에 가깝다.

따라서 systemd와 systemctl을 활용해 프로세스 단위로 재기동 정책을 구성해두는 것은 리눅스 서버 운영에서 가장 기본이자 필수적인 자동화 방식이라고 할 수 있다.

profile
Data Analytics Engineer 가 되

0개의 댓글