CentOS7(linux) Apache daemon 설정방법 :: 자바일반[SSISO Community]
 
SSISO 카페 SSISO Source SSISO 구직 SSISO 쇼핑몰 SSISO 맛집
추천검색어 : JUnit   Log4j   ajax   spring   struts   struts-config.xml   Synchronized   책정보   Ajax 마스터하기   우측부분

자바일반
[1]
등록일:2018-07-06 23:38:14 (0%)
작성자:
제목:CentOS7(linux) Apache daemon 설정방법

금번 RabbitMQ 관련 작업을 하다가 OS 상에 백그라운드로 해당 RabbitMQ 서비스를 띄우기 위해서 사용된 아파치 프로젝트 입니다.


윈도우는 Procrun으로 실행시키고 

해당 포스트는 유닉스 및 리눅스 계열의 OS에서 사용할 jsvc 를 정리하였습니다.


Daemon? 이란 백그라운드로 실행되면서, 사용자의 인터페이스(tty)가 없는 프로그램을 말한다. 우리가 흔히 사용하는 리눅스 서비스들은 대부분 데몬으로 동작하며, -d로 끝나는 프로그램(예: sshd, syslogd)이 모두 해당된다. 리눅스 명령인 nohup으로 백그라운드 구동은 가능하지만, kill 명령으로 종료해야 한다.

따라서 비정상 종료시의 처리를 하려면, OS로부터 signal을 받아야 하므로 데몬으로 구동시켜야 한다. 

> 단독데몬
 항상 백그라운드 모드로 실행되고 메모리를 상대적으로 많이 소비한다. 그러나 서비스(응답속도)가 빠르다. httpd와 같은 웹서비스 데몬이 대표적.
> xinetd(슈퍼데몬)
 요청이 있을때마다 xinetd가 서비스를 싱행시켜주므로 메모리 소비가 적다. 그러나 단독데몬에 비해 상대적으로 서비스 속도가 느리다.

 ======apache-daemon 설치 및 운영 방법 CentOS7 기준=====
1. commons.apache.org/ 사이트 접속
2. commons-damon-1.0.15-bin.zip 다운로드
  - source 부분에서 다운로드 하세요.

3. usr7 폴더 만들고 해당 위치로 압축푼다
4. /usr7/commons-daemon/src/native/unix 이동
5. sh support/buildconf.sh 
6. configure script generated successfully 나오면 성공
7. ./configure -with-java=/usr/java/jdk1.8.0_121 (리눅스 운영체제별로 경로는 틀릴 수 있습니다.)
8. 7번까지 실행하고 나면 apache-daemon 컴파일 설정완료
9. make 명령어 실행하여 컴파일 실행
10. 해당 위치에 jsvc 명령어 생긴니다.
11. sudo cp jsvc /usr/bin (jsvc 복사) 전역설정
12. jsvc --help 명령어 실행하여 옵션확인
13. 소스상에서 maven 레파지 토리에서 commons-daemon.jar 다운로드
<dependency>
   <groupId>commons-daemon</groupId>
   <artifactId>commons-daemon</artifactId>
   <version>1.0.15</version>
</dependency>

14. 14. java Daemon 인터페이스 상속받아 4개 메서드 구현
 - init();
 - start();
 - stop();
 - destory();
ex)
package com.interpark.daemon;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;

import org.apache.commons.daemon.Daemon;
import org.apache.commons.daemon.DaemonContext;
import org.apache.commons.daemon.DaemonInitException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.interpark.dbutil.ApacheDBCPInit;
import com.interpark.exception.NamedThreadsFactory;
import com.interpark.exception.ThreadExceptionHandler;
import com.interpark.rabbitmq.RabbitMqManager;
import com.interpark.rabbitmq.RabbitMqPublishThread;
import com.interpark.util.PropertiesUtil;

public class SendingDaemonMain implements Daemon {
private static Logger LOGGER = LoggerFactory.getLogger(SendingDaemonMain.class);
    private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
    
    
@Override
public void init(DaemonContext context) throws DaemonInitException, Exception {
  // TODO Auto-generated method stub
   LOGGER.debug("RabbitMQ Sending Daemon Init...");
        String[] args = context.getArguments();
        if (args != null) {
            for (String arg : args) {
            LOGGER.debug(arg);
            }
        }
  ApacheDBCPInit adb = ApacheDBCPInit.getInstance();
  adb.initConnectionPool();
        LOGGER.debug("RabbitMQ Sending Daemon init OK.");
}
@Override
public void start() throws Exception {
  LOGGER.debug("RabbitMQ Sending Daemon Start...");
  long userId = 2;
  int threadMax =  Integer.parseInt(PropertiesUtil.getValue("thread.sending.maxThread"));
  run(userId , threadMax);
  LOGGER.debug("RabbitMQ Sending Daemon Start OK.");
}

private void run(long userId , int threadMax) throws Exception {
  // TODO Auto-generated method stub
  ThreadFactory factory = new NamedThreadsFactory(new ThreadExceptionHandler("RabbitMQ Sending Thread"));
  ExecutorService executorService = Executors.newFixedThreadPool(threadMax, factory);
  for(int i = 0; i < threadMax; i++ ){
   executorService.execute(new RabbitMqPublishThread(userId, executorService, true));
   Thread.sleep(1000);//처음 한번을 시간을 줘서 쓰레드를 각각 실행
  }
  executorService.shutdown();
  //shutdownRabbitMqManager(rabbitMqManager);
}
    protected void shutdownRabbitMqManager(final RabbitMqManager rabbitMqManager) throws Exception
    {
        rabbitMqManager.stop();
        LOGGER.debug("@@@@@@@@@@@@@@@@@@End ShutDown RabbitMq@@@@@@@@@@@@@@@@@@@@@@@@");
        LOGGER.debug("Bye!");
        System.exit(0);
    }
@Override
public void stop() throws Exception {
  // TODO Auto-generated method stub
  LOGGER.debug("RabbitMQ Sending Daemon Stop...");
  LOGGER.debug("RabbitMQ Sending Daemon Stop Ok.");
}
@Override
public void destroy() {
  // TODO Auto-generated method stub
  LOGGER.debug("RabbitMQ Sending Daemon Destory...");
  System.exit(0);
  LOGGER.debug("RabbitMQ Sending Daemon Destory Ok.");
}
}
 

15. 프로젝트 jar파일로 만든다(디펜던시까지 다 말 것).
mvn assembly:assembly -DdescriptorId=jar-with-dependencies


16. (15)번까지 수행하고 나서 jar프로젝트를 아래 sh프로그램 작성후 centos(linux)에서 돌리면 됩니다.

#!/bin/sh
echo "사용자이름 : " $USERNAME
echo "호스트이름 : " $HOSTNAME
echo "사용방법 : startPublishDaemon.sh start | stop"

JAVA_HOME=/usr/java/jdk1.8.0_121
JSVC=/usr7/commons-daemon/src/native/unix/jsvc
USER=nobody
 
DAEMON_HOME=/usr7/java
PID_FILE=$DAEMON_HOME/daemon.pid
OUT_FILE=$DAEMON_HOME/daemon.out
 
CLASSPATH=\
$DAEMON_HOME/commons-daemon-1.0.15.jar:\
$DAEMON_HOME/couponRabbitmq.jar

MAIN_CLASS=com.interpark.daemon.SendingDaemonMain

case "$1" in
  start)
         #
    # Start Daemon
         #
    rm -f $OUT_FILE
    $JSVC \
    -user $USER \
    -java-home $JAVA_HOME \
    -pidfile $PID_FILE \
    -outfile $OUT_FILE \
    -errfile $OUT_FILE \
    -cp $CLASSPATH \
    -Ddev.env=publish \
    $MAIN_CLASS
         #
    # To get a verbose JVM
    #-verbose \
    # To get a debug of jsvc.
    #-debug \
    exit $?
    ;;
 
  stop)
         #
    # Stop Daemon
         #
    $JSVC \
    -stop \
    -nodetach \
    -java-home $JAVA_HOME \
    -pidfile $PID_FILE \
    -outfile $OUT_FILE \
    -errfile $OUT_FILE \
    -cp $CLASSPATH \
    $MAIN_CLASS
    exit $?
    ;;
  *)
exit 1;;
esac
 

startPublishDaemon.sh start | stop

참조사이트 : 

[본문링크] CentOS7(linux) Apache daemon 설정방법
[1]
코멘트(이글의 트랙백 주소:/cafe/tb_receive.php?no=34678
작성자
비밀번호

 

SSISOCommunity

[이전]

Copyright byCopyright ⓒ2005, SSISO Community All Rights Reserved.