오픈소스 중 가장 많이 쓰는 웹서버 apache httpd server 를 설치 스크립트로 작성해 보았다.
httpd 설치는 두가지 방법이 있다. 패키지 설치, 소스컴파일!!
소스컴파일에 대한 스크립트이다. (패키지 설치는 너무 쉬움 yum install httpd -y)
httpd 설치는 compile 제외하곤 그리 어렵지 않다.(사실 컴파일도 그렇게 어렵지 않다) 그래도 매번 반복되는 작업을 하지 않기 위해 스크립트를 만들어보았고, 만들면서.. 과연 이게 필요할까도 생각 했지만...끝은 내고 싶었기에 완성 하였다
최초 설치에 앞서 root 또는 sudo 권한이 있는 계정으로 필수 패키지를 설치 해야한다.
centos 기반으로 만들었고 최초 vm 생성한 후 컴파일 해가며 필요한 패키지를 찾았다.
#!/bin/bash
# root or sudo permission
# Required package
array=(apr-devel apr-util-devel openssl-devel pcre-devel)
# 반복문을 통해서 패키지를 하나씩 설치 한다.
for pkg in "${array[@]}"
do
yum list $pkg > /dev/null
if [ $? -eq 0 ]; then
sudo yum install $pkg -y
else
echo "# [ERROR] $pkg not found or unknown name "
fi
done
DIR=$(pwd)
# 설치 할 configure 파일 찾음
CONFIG=`find $DIR -type f -name "configure"`
# configure 파일경로 찾음
CONFIG_DIR=$(dirname $CONFIG)
# httpd server 를 설치할 디렉토리(prefix라함), 이미 환경변수(PREFIX)에 경로를 설정했으면 yes or no 물어본 후 설치가 진행됨
PREFIX=
echo "# PREFIX=$PREFIX"
# 환경변수(PREFIX)가 설정되지 않았음 프롬프트에서 받아서 처리
if [ -z $PREFIX ]; then
echo -n "# Input PREFIX (install directory): ";
read prefix;
# 입력이 없으면 에러 발생
if [ -z $prefix ]; then
echo ""
echo "# [ERROR] Please input(prefix) it correctly!!! "
echo ""
exit ;
fi
PREFIX=$prefix
else
# 당연히 PREFIX 디렉토리는 없을 거고 웹서버가 설치 되면서 경로를 만들 것임, 하지만 이구분은 PREFIX 를 제대로 입력하였는지 확인 하는 용도
if [ ! -d $PREFIX ]; then
echo "# [INFO] PREFIX($PREFIX) will be created directory! automatically "
echo ""
# 설치 진행 할 경우 yes, y 를 입력! 설치를 원치 않으면 no, n를 입력하는데 잘못 입력할 것을 대비해서 while 과 case를 써서 정확한 입력을 받음
while true; do
read -p "# Do you want to install httpd server continue? (yes or no) " yn
case $yn in
[Yy]* ) echo "# [INFO] You entered YES"; echo "";
# 일반적으로 설치 할경우 설치파일 경로로 가서 configure, options로 설치한다. options은 크게 중요하지 않음
cd $CONFIG_DIR;
./configure --prefix=$PREFIX --with-mpm=worker --enable-modules=most \
--enable-mods-shared=most --enable-cache --enable-file-cache \
--enable-so --enable-mime-magic --enable-expires --enable-header \
--enable-proxy --enable-ssl --enable-https --enable-mpms-shared=all \
--enable-vhosts-alias --enable-rewrite \
make && make install;
break;;
# 설치 진행 대답을 no로 했을 경우 그냥 빠져 나옴!
[Nn]* ) echo "# [INFO] You entered NO"; echo ""; exit;;
* ) echo "##################################";
echo "# [WARN] Please answer Yes or No #";
echo "##################################";;
esac
done
fi
fi
2019년 7월 17일 수요일
2019년 7월 12일 금요일
java thread dump 스크립트
java process 가 서비스를 수행 중 느려지거나, 아무런 동작하지 않을 때(locked) 현재 그 java process 상태를 확인 하기 위해서 thread dump를 많이 사용한다.
thread dump를 남기는 방법은 두가지가 있다.
kill -3 or jstack command를 사용할 수 있는데,
kill -3 은 stdout 파일 예를들면 catalina.out 파일에 dump를 남기고
jstack의 경우에는 console 화면에 보여진다.
console 보여진다는 의미는 jstack $PID 를 실행하였을 시에 모니터 화면에 바로 볼 수있다.
thread dump 를 생성하는 방법은 동일하지만, 로그 내용을 쓰는데는 방식이 다르다.
catalina.out을 통해서 보는것도 좋지만, vi에서 화면을 오르랄 내리락 해야하기 때문에 jstack을 통해서 thread dump 내용을 파일로 리다이렉션 하는 것이 좀더 편해 보인다.
jstack으로 thread dump를 생성하는 것을 bash scripts 로 만들었다.
#!/bin/bash
export CATALINA_BASE=$(dirname $(dirname $(realpath $0)))
. $CATALINA_BASE/bin/env.sh > /dev/null
DATE=`date +%Y-%m-%d`
# 2초에 한번씩 총 5번 thread dump를 생성
for count in 1 2 3 4 5; do
echo "# Thread Dump : $count"
for i in `ps -ef | grep java | grep "$SERVER_NAME " | awk '{print $2}'`;do
echo "# PID [$i] jstack is running "
$JAVA_HOME/bin/jstack -l $i > $LOG_DIR/threaddump.$DATE
echo "# sleep 2 sec"
sleep 2;
done
echo "done"
sleep 3
done
echo ""
# thread dump 로그파일을 남김
echo "# Dumpfile is $LOG_DIR/threaddump.$DATE"
echo ""
2019년 7월 10일 수요일
Tomcat 기동 시 CLOSE_WAIT으로 인해 startup 이 안되는 경우
jvm 경우 프로세스를 강제종료(kill) 하면 모든 스레드도 종료된다.
하지만 특이한 경우 프로세스를 강제종료(kill) 했음에도 불구하고, 종료되지 않은 경우가 있는데 이를 확인하기 위해 netstat 으로 톰켓 포트를 확인 해 봤을 시에 해당 포트가 CLOSE_WAIT이 걸리면서 기동을 하려고 했을 때 아래와 같은 메시지가 발생할 수 있다.
SEVERE [main] org.apache.catalina.core.StandardServer.await StandardServer.await: create[localhost:8005]:
java.net.BindException: Address already in use (Bind failed)
이런 경우에 정말 깔끔하게 톰캣 프로세스를 종료 하는 스크립트를 만들어 봤다.
#!/bin/bash
export CATALINA_BASE=$(dirname $(dirname $(realpath $0)))
. $CATALINA_BASE/bin/env.sh > /dev/null
# 프로세스 id 찾은 후 변수 처리
PID=`ps -ef | grep java | grep "=$SERVER_NAME" | awk '{print $2}'`
# 현재 서비스 중이 포트를 찾아서 변수 처리 (명령어 종류는 많음)
HTTP_PORT=$CATALINA_BASE/bin/env.sh | grep HTTP_PORT
# waitng 이 걸린 connection을 찾은 후 변수 처리 cconnection 수가 많기 때문에 반복문 사용
for NETSTAT in `netstat -anp 2>/dev/null | grep $HTTP_PORT | awk '{print $4}'`;
do
echo "$NETSTAT"
done
if [ $NETSTAT != 0 ]; then
# fuser 명령어를 통해서 모든 커넥션 정리
fuser -kvn tcp ${HTTP_PORT};
# 명령어가 없을 수도 있으니 명령어가 실행 되었는지 확인 0=true not 0=false
if [ $? != 0 ]; then
echo "[ERROR] Have to install psmisc (ex) yum install psmisc -y"
exit;
fi
sleep 2;
else
echo "### Tomcat is Not Runnable ## "
echo ""
exit;
fi
현재 구성한 서버 환경에서는 잘 동작한다.
하지만 특이한 경우 프로세스를 강제종료(kill) 했음에도 불구하고, 종료되지 않은 경우가 있는데 이를 확인하기 위해 netstat 으로 톰켓 포트를 확인 해 봤을 시에 해당 포트가 CLOSE_WAIT이 걸리면서 기동을 하려고 했을 때 아래와 같은 메시지가 발생할 수 있다.
SEVERE [main] org.apache.catalina.core.StandardServer.await StandardServer.await: create[localhost:8005]:
java.net.BindException: Address already in use (Bind failed)
이런 경우에 정말 깔끔하게 톰캣 프로세스를 종료 하는 스크립트를 만들어 봤다.
#!/bin/bash
export CATALINA_BASE=$(dirname $(dirname $(realpath $0)))
. $CATALINA_BASE/bin/env.sh > /dev/null
# 프로세스 id 찾은 후 변수 처리
PID=`ps -ef | grep java | grep "=$SERVER_NAME" | awk '{print $2}'`
# 현재 서비스 중이 포트를 찾아서 변수 처리 (명령어 종류는 많음)
HTTP_PORT=$CATALINA_BASE/bin/env.sh | grep HTTP_PORT
# waitng 이 걸린 connection을 찾은 후 변수 처리 cconnection 수가 많기 때문에 반복문 사용
for NETSTAT in `netstat -anp 2>/dev/null | grep $HTTP_PORT | awk '{print $4}'`;
do
echo "$NETSTAT"
done
if [ $NETSTAT != 0 ]; then
# fuser 명령어를 통해서 모든 커넥션 정리
fuser -kvn tcp ${HTTP_PORT};
# 명령어가 없을 수도 있으니 명령어가 실행 되었는지 확인 0=true not 0=false
if [ $? != 0 ]; then
echo "[ERROR] Have to install psmisc (ex) yum install psmisc -y"
exit;
fi
sleep 2;
else
echo "### Tomcat is Not Runnable ## "
echo ""
exit;
fi
현재 구성한 서버 환경에서는 잘 동작한다.
2019년 7월 7일 일요일
jmap 을 사용하여 java process 상태 모니터링
모든 WAS의 경우 jvm에 의해 기동이 된다. (java로 기동되기 때문)
기동 된 이후에는 Xms 값만큼 사용하였다가 메모리가 더 필요할 경우 Xmx 값까지 사용한다. Xms, Xmx값은 동일 값으로 설정 해 주는 것이 좋다. 왜냐면 minimum 에서 maximum 까지 도달하는데까지 오버헤드가 발생한다. (실제 이슈가 있었던 경험도 있음)
그럼 jvm에 의해 기동 된 프로세스를 모니터링하고 싶은 경우, 여러 방법이 있지만, 단순 메모리 사이즈 또는 힙에 대한 내용을 확인 하고 싶을 경우 jmap이 가장 직관적이였다. (주관적인 기준)
명령어는 단순한다.
ps -ef| grep java 로 pid 및 프로세스 상태를 확인 한 후
jmap -heap [PID] 로 확인이 가능한다.
하지만, 아래와 같은 메시지가 발생한다.
더 자세한 내용을 확인하고 싶다.
이럴경우 OpenJDK에 debuginfo 를 설치 해주어야 한다.
http://debuginfo.centos.org/7/x86_64/
시스템 환경에 맞는 버전을 다운로드 후 설치 해준다.
다시 동일하게 실행 했을 경우, 명령어가 잘 실행 된다.
기동 된 이후에는 Xms 값만큼 사용하였다가 메모리가 더 필요할 경우 Xmx 값까지 사용한다. Xms, Xmx값은 동일 값으로 설정 해 주는 것이 좋다. 왜냐면 minimum 에서 maximum 까지 도달하는데까지 오버헤드가 발생한다. (실제 이슈가 있었던 경험도 있음)
그럼 jvm에 의해 기동 된 프로세스를 모니터링하고 싶은 경우, 여러 방법이 있지만, 단순 메모리 사이즈 또는 힙에 대한 내용을 확인 하고 싶을 경우 jmap이 가장 직관적이였다. (주관적인 기준)
명령어는 단순한다.
ps -ef| grep java 로 pid 및 프로세스 상태를 확인 한 후
jmap -heap [PID] 로 확인이 가능한다.
하지만, 아래와 같은 메시지가 발생한다.
더 자세한 내용을 확인하고 싶다.
이럴경우 OpenJDK에 debuginfo 를 설치 해주어야 한다.
http://debuginfo.centos.org/7/x86_64/
시스템 환경에 맞는 버전을 다운로드 후 설치 해준다.
다시 동일하게 실행 했을 경우, 명령어가 잘 실행 된다.
피드 구독하기:
글 (Atom)