systemd에 reactjs 실행/중지 서비스 추가

입질쾌감 물때표

Next.js로 구현된 서비스를 systemd에서 실행/중지 하는 daemon service 추가 방법

# cat /etc/systemd/system/react.service 
[Unit]
Description=React App Run

[Service]
Type=simple
ExecStart=/root/bin/react.sh -start
ExecStop=/root/bin/react.sh -stop
TimeoutStartSec=0
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

react.service를 systemd 서비스에 등록

# systemctl enable react
# systemctl status react

● react.service - React App Run
     Loaded: loaded (/etc/systemd/system/react.service; enabled; preset: disabled)
     Active: active (running) since Tue 2023-09-12 17:22:36 KST; 4min 12s ago
   Main PID: 1415762 (react.sh)
        CPU: 19ms
     CGroup: /system.slice/react.service
             └─1415762 /bin/bash /root/bin/react.sh -start

Sep 12 17:22:36 tester systemd[1]: Started react.service.
Sep 12 17:22:36 tester runuser[1415763]: pam_unix(runuser-l:session): session opened for user user1(uid=1000) by user1(uid=0)

status의 내용중에 Active 상태 정보를 보면 running중인지 여부를 알수 있는데, 만일 running중이면 ‘systemctl start react’로 다시 커맨드를 쳐봐도 ‘ExecStart’의 실행 커맨드를 진행해 주지 않으므로, start했으면 stop을 처리하고 다시 start를 하도록 한다.

/root/bin/react.sh 파일내용

# cat bin/react.sh 
#!/bin/bash

############################################################################
# 커맨드 처리
############################################################################

if [[ "-start" == "$1" ]]; then
	#echo "react start: $1" >> /root/react.log #로그를 남겨보면서 if문을 잘 타는지 확인
	runuser -l www -c '/home/www/bin/react.sh'
fi

if [[ "-stop" == "$1" ]]; then
	#echo "react stop: $1" >> /root/react.log
	PID=`netstat -tnlp | grep 3000 | awk '{print $7}' | awk -F'/' '{print $1}'`
	kill -9 $PID

	killall -9 next-render-worker-app
	killall -9 next-render-worker-pages
fi

스크립트 내용중 start부분의 내용은 runuser 명령어를 사용하면 root로 systemd 서비스에서 다른 user 권한으로 특정 커맨드를 실행시킬수 있다. www의 유저로 /home/www/bin/react.sh 스크립트를 실행시키라는 의미이다. /home/www/bin/react.sh 파일에는 react를 실행시킬 내용을 적어두면 된다.

npm 및 npx로 실행되는 next.js 서비스는 중지해주거나 하는 커맨드가 따로 존재하지 않는다. 따라서 나는 직접 프로세스 PID를 찾아서 kill 하는 방법을 선택했다.

apache에 next.js의 3000포트를 proxy 연결

<VirtualHost *:80>
	ServerName sub1.webterror.net

	SetEnv LANG ko_KR.UTF-8
	SetEnv LC_ALL ko_KR.UTF-8
	SetEnv LC_LANG ko_KR.UTF-8

	ProxyRequests Off
	ProxyPreserveHost On
	ProxyVia Full
	<Proxy *>
		Require all granted
	</Proxy>
		ProxyPass / http://127.0.0.1:3000/
		ProxyPassReverse / http://127.0.0.1:3000/
	</VirtualHost>

</IfDefine>

vhost 설정에 위의 내용대로 작성하고 아파치를 재기동하면 proxy를 통해 next.js 서버에 연결되는것을 확인할수 있다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다