위에서 NGINX는 systemd 로 관리되는 프로그램이라고 했다.
그렇다면 systemd는 무엇이지, systemd 로 관리되는 process의 관리방법을 배워본다.
systemd와 systemctl은 꼭 Nginx 프로세스뿐만 아니라 리눅스에서 다른 프로세스도 관리할 수 있다. 다른 프로그램에도 응용할 수 있다.
systemd
는 Linux 계열에서 사용하는 시작시스템이자 시스템 매니저 표준이다. daemon 들을 관리를 통일하고 쉽게 만드는 역할을 한다.
systemd 는 PID =1 로서 운영체제가 부팅되면 가장 먼저 시작되는 프로세스이고, 리눅스의 시스템의 나머지 프로세스들을 시작시킨다.
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 이 기본설치되어있지 않은 경우도 있다. 이 경우 추가로 설치해야 한다.
/etc/systemd/
경로에 systemd 관련된 설정이 위치한다.
systemd 로 관리하는 대상은 통상 XXX.service 라는 파일로 관리한다. (.service suffix는 없어도 무방하다. 그냥 컨벤션이라고 보자.)
[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
nginx 같은 경우 기본적으로 네트워크 관련된 기본적인 시스템 관련된 거랑 네트워크 관련된 게 준비되어야 하기 때문에 syslog, network-online, remote-fs, nss-lookup. 그리고 network-online을 원한다고 쓰여 있다.
Service
systemd 는 시스템 데몬을 관리하는 시스템, 프로세스이다. systemctl 은 systemd 를 이용하기위한 관리 툴이다.
리눅스에서 이와 비슷한 관계의 다른 시스템이 있다.
journald
/ journalctl
logrotate : 파일 로그 많이 쌓이면 자동으로 파일 분리해주는 거.
logind
/ loginctl
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
systemctl daemon-reload
sudo service $servie_name $commaand
시작
sudo service nginx start
리로드
sudo service nginx reload
정지
sudo service nginx stop
sudo service nginx status
[Unit]
에 다음 설정을 추가한다.
StartLimitIntervalSec=500
StartLimitBurst=5
무한히 재시도하는 것을 방지한다. 재시도를 5회까지만 시도하고, 그래도 실패하면 시작은 실패로 끝난- 다.
[Service]
에 다음 설정을 추가한다.
Restart=on-failure
RestartSec=5s
systemctl daemon-reload
sudo service nginx start
sudo service nginx status
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을 활용해 프로세스 단위로 재기동 정책을 구성해두는 것은 리눅스 서버 운영에서 가장 기본이자 필수적인 자동화 방식이라고 할 수 있다.