스프링부트로 작성이 된 프로그램을 systemd 를 이용한 데모나이즈를 위해 아래와 같이 생성 한다. (가장 기본적인 부분..)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
[Unit] Description=SpringBoot application (FRONT) After=network.target [Service] Type=simple ### EDIT ### start StandardOutput=syslog StandardError=syslog SyslogIdentifier=로그이름1 User=배포계정명 WorkingDirectory=/home/배포계정명/폴더 Environment='JAVA_OPT1=-Djava.security.egd=file:/dev/urandom' Environment='JAVA_OPT2=-server -XX:MaxNewSize=384m -XX:+UseParallelGC -XX:ParallelGCThreads=2' Environment='EXEC_JAR=배포파일.war' ### EDIT ### end ExecStart=/usr/bin/java $JAVA_OPT1 $JAVA_OPT2 -jar $EXEC_JAR SuccessExitStatus=143 Restart=on-failure RestartSec=5 TimeoutStopSec=10 [Install] WantedBy=multi-user.target |
위와 같이 설정 파일을 생성 한뒤에 아래와 같은 명령어로 실행 할 수 있다.
1 2 3 4 5 6 7 8 9 10 11 |
### 프로그램 시작 ~]# systemctl start springboot-front.service ### 프로그램 정지 ~]# systemctl stop springboot-front.service ### 부팅시 시작 활성화 ~]# systemctl enable springboot-front.service ### 프로그램 시작 & 부팅시 시작 활성화 ~]# systemctl enable --now springboot-front.service |
위와 같이 실행을 할 경우 발생하는 로그는 CentOS 7 기준 /var/log/messages 파일에 누적이 된다.
가만히 두면 messages 파일이 엄청 커지거나 섞여 있어서 로그 확인에 에로 사항이 발생하게 된다.
때문에 다음 와 같이 /etc/rsyslog.d/30-springboot.conf 파일을 생성 하여 분리 하도록 한다.
1 2 3 4 5 6 7 |
if $programname == '로그이름1' then /var/log/java_front.log & stop if $programname == '로그이름2' then /var/log/java_backend.log & stop |
rsyslog 를 재시작 한다.
1 |
~]# systemctl restart rsyslog.service |
PS1. 로그 순환 설정
rsyslog 에서 생성하는 별도의 파일을 새롭게 선언 되었기 때문에 logrotate 가 안되면 파일이 무한 증식 하게 되므로 아래와 같이 순환 설정을 하여
1달동안 보관 되고 삭제 되도록 설정 한다. (생성만 해두면 다음 주기에 적용됨..재시작할 필요는 없음.)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
/var/log/java_*.log { rotate 4 weekly missingok # size 500M # compress # delaycompress notifempty create 640 root root sharedscripts postrotate /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true endscript } |
PS2. 프로그램 배포계정에 특정 데몬의 콘트롤 권한만 부여(sudo 이용) 하는 방법.
배포계정에 systemctl 을 이용 하여 특정 데몬을 콘트롤 할수 있는 권한을 부여 한다.
1 2 3 4 |
배포계정명 ALL=NOPASSWD: /bin/systemctl status springboot-front.service 배포계정명 ALL=NOPASSWD: /bin/systemctl start springboot-front.service 배포계정명 ALL=NOPASSWD: /bin/systemctl stop springboot-front.service 배포계정명 ALL=NOPASSWD: /bin/systemctl restart springboot-front.service |
배포 계정은 아래와 같이 부여된 명령어를 root 와 같은 권한으로 실행이 가능 하다.
1 2 3 4 5 6 7 8 9 |
~]$ sudo -l User 배포계정명 may run the following commands on 서버명: (root) NOPASSWD: /bin/systemctl status springboot-front.service (root) NOPASSWD: /bin/systemctl start springboot-front.service (root) NOPASSWD: /bin/systemctl stop springboot-front.service (root) NOPASSWD: /bin/systemctl restart springboot-front.service ~]$ sudo /bin/systemctl restart springboot-front.service |