2018년 7월 10일 화요일

tomcat ipv6 옵션 테스트

톰캣 서버에  java.net.preferIPv4Stack  옵션을 적용하면 실제 ipv6로 들어오는 클라이언트가 접근이 가능한지에 대한 테스트를 해보았다

리눅스에서 nic를 확인을 위해서 ifconfig 를 확인 해본다.

        inet6 fe80::22a:4aff:fe16:183  prefixlen 64  scopeid 0x20<link>

위에 보이는 거와 inet6가 보이고
/etc/sysctl.conf 파일에 보면

net.ipv6.conf.all.disable_ipv6 = 0 (disable 0이기때문에 ipv6가 활성화 되었다)
net.ipv6.conf.eth0.disable_ipv6 =  0 (disable 0이기때문에 ipv6가 활성화 되었다)

net.ipv6.conf.all.disable_ipv6 = 1 (disable 0이기때문에 ipv6가 비활성화 되었다)
net.ipv6.conf.eth0.disable_ipv6 =  1 (disable 0이기때문에 ipv6가 비활성화 되었다)

아무 내용 없다면 default 는 0이다

활성화가 되어 있는 상태에서 curl을 통해 톰켓을 호출해본다.

 java.net.preferIPv4Stack  false 경우
$ curl -g -6 "http://[::1]:8180/clientip.jsp"
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>client ip</title>
</head>
<body>
<p>client Addr: 0:0:0:0:0:0:0:1</p><p>client Host: 0:0:0:0:0:0:0:1</p><p>X-Forwarded-For: null</p>


</body>
</html>
호출이 된다.

 java.net.preferIPv4Stack ture 경우

$ curl -g -6 "http://[::1]:8180/clientip.jsp"
curl: (7) Failed connect to ::1:8180; Connection refused


결론적으로  java.net.preferIPv4Stack 을 사용할 경우에는 ipv6는 사용이 불가능하다

설정 예)
        JAVA_OPTS="$JAVA_OPTS -Djava.net.preferIPv4Stack=true"


2018년 6월 19일 화요일

오픈소스 메신저 mattermost 설치

mattermost는 설치형 메신저이고, slack을 대체하는 메신저라는 내용이 나와 있다
설치 방법은 간단하다
일단 서버에 mattermost server, mattermost에서 사용할 DB가 필요하다
DB는 mysql or postgresql 을 사용할 수 있다.

설치 방법은 심플하다
https://mattermost.com/ 에서 Download 로 가면 mattermost server 설치하는게 나와 있는데
mattermost server 종류는 두가지 이다
open source team edition과 enterprise edition 인데
말그대로 오픈소스인지 기업용인지에 대한 선택 할 수 있다.
한마디로 유료, 무료로 나눌수 있다.

그럼 필요한 설치 파일을 다운로드 한 후
서버에 ftp라는가 리눅스면 wget이라는 명령어를 통해서 다운 받을 수 있다.

다운을 받았다면 압축을 푼다.

$ tar xvfz mattermost-team-5.0.0-linux-amd64.tar.gz

압축이 끝났으면 mattermost라는 파일이 생겼을거고 나같은 경우에는
대부분 뒤에 버전을 넣어 둔다.

$ mv mattermost mattermost-5.0

mattermost server 설치는 끝났고 이제 db만 연결하면 된다.

db는 설치 되었다고 가정하고

mattermost-5.0/config/config.json 파일에서
DriverName과 DataSource 를 해당 DB에 맞게 설정한다

자세한 내용은 mattermost document를 확인
https://docs.mattermost.com/install/requirements.html#

설정이 완료 되었으면 기동을 해본다.

$ mattermost-5.0/bin/platform
기동된 상태에서 Ctrl + c를 하게 되면 종료된다. (이부분에 대한 스크립트는 따로 작성)

최초에는 계정을 생성해야하고 이 계정은 admin 계정이 된다.
그 이후 email or username 과 password로 로그인이 가능하다







2018년 4월 25일 수요일

Nexus 설치

대부분 web 개발자라면 maven을 사용 또는 적어도 이름은 들어봤을 것이다.
maven을 사용하지 않는다면 일일이 라이브러리를 다운받아서 사용해야 하는 불편함이 있다. 그래서 사람들은 maven을 많이 쓴다. maven은 pom.xml에 필요한 라이브러리를 지정하고 빌드 해주면 자동으로 저장해준다. 단 외부 통신이 가능해야 한다.

엔터프라이즈에서는 외부통신이 단절되는 경우가 많기 때문에 maven을 사용하고 싶으도 사용하지 못한다. 이럴경우 nexus를 통해서 사설 repository를 구성해서 회사 내부적으로 사용하면 라이브러리를 공통으로 사용하기 때문에 라이브러리에서 꼬이는 일이 줄어 들수 있다.

nexus 설치는 nexus 문서를 참조하면 쉽게 설치가 가능한다.

먼저 System requirements를 보면 Java 버전이 8 이여야 한다.
NXRM (Nexus Repository manager) 설치는 2, 3 버전이 있다.

Download Archives - Repository Manager 2

Download Archives - Repository Manager 3

OSS버전은 무료고, Pro버전은 유료지만 Pro버전을 14일 trial 라이선스를 발급해 준다.
우선 설치 파일을 다운 받은 후 (이글은 3버전 기준)
tar xvfz nexus-*.tar.gz
압축해제 된 디렉토리에서 ./bin/nexus run 을 실행하면 기동할수 있다.
반대로 종료할때는 ./bin/nexus stop을 하면 된다.
기동이 되었으면 /home/nexus/sonatype-work/nexus3/log/nexus.log로그를 통해서 정상 기동 확인이 가능하다.
그런 후 http://IP Adress:8081 로 접속하게 되면 console 접속이 가능하고 default 계정은
admin/admin123 이다.
IP는 서버 아이피로 사용하고 포트는 디폴트 포트(8081)를 사용해도 되고 변경도 가능하다.
콘솔을 통해서 사설 repository를 구성할수 있다.

2018년 4월 19일 목요일

apache 기동,프로세스확인 스크립트

아파치를 컴파일 하고 설치하면 아파치를 기동해야 한다.

리눅스 가정하에
cd $APACHE_HOME/bin 에서
기동시 ./apachectl start
종료시 ./apachectl stop
이런 식으로 기동하고 종료한다.

하지만 프로세스를 ps -ef | grep httpd 이런식으로 확인 한 결과 안들경우 로그를 확인해야한다.
이런 번거로운을 해결하기 위해서 스크립트를 작성했다

#!/bin/sh
SERVER_NAME=`basename /opt/web/web_11`
#echo "$SERVER_NAME Server [NAME=$SERVER_NAME]"

PID=`ps -ef|grep httpd|grep $SERVER_NAME| egrep -v "grep|log"|awk '{print $1,  $2}'`
#echo $SERVER_NAME Server [Process ID=$PID]

LISTEN_PORT=`sudo netstat -an | grep :80 | grep LISTEN|awk '{print $4}'`
#echo "$SERVER_NAME Server [LISTEN_PORT=$LISTEN_PORT]"

if [ -z "$PID" ]; then
          if [ -z "$LISTEN_PORT" ]; then

            sudo sh ./apachectl -k start;
            echo "###########################################"
            echo "$SERVER_NAME Server Started..."
            echo "###########################################"

    else
            echo "###########################################"
            echo "$SERVER_NAME already in use [$LISTEN_PORT] PORT..."
            echo "###########################################"
    fi

else
    echo "######################################################"
    echo "$SERVER_NAME Server is already RUNNING..."
    echo "######################################################"
fi


아파치는 프로세스가 있거나 혹은 포트를 리슨하고 있는 중에는 기동이 되지 않는다
if을 이용해서 체크한 기동하는 스크립트다.

또한 프로세스 확인 하는것도 매번 ps -ef | grep httpd 를 치기 번거로워서 스크립트로 작성했다

SERVER_NAME=`basename /opt/web/web_11`
echo ""
ps -ef|grep httpd|grep $SERVER_NAME|egrep -v "grep"|awk '{print $1,$2,$5,$8,$10,$12}'
echo ""

2018년 3월 25일 일요일

JBoss watches 비활성화

JBoss EAP 7.0.x 버전 사용 시에 tail을 사용하여 로그를 확인 할경우 또는 기동시에


ERROR [io.undertow] (MSC service thread 1-8:) UT005024: Could not register resource change listener for caching resource manager, automatic invalidation of cached resource will not work: java.lang.RuntimeException: java.io.IOException: User limit of inotify watches reached
    at org.xnio.nio.WatchServiceFileSystemWatcher.watchPath(WatchServiceFileSystemWatcher.java:183)
    at io.undertow.server.handlers.resource.PathResourceManager.registerResourceChangeListener(PathResourceManager.java:191)
    at org.wildfly.extension.undertow.deployment.ServletResourceManager.registerResourceChangeListener(ServletResourceManager.java:82)
    at io.undertow.server.handlers.resource.CachingResourceManager.<init>(CachingResourceManager.java:64)
    at org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService.createServletConfig(UndertowDeploymentInfoService.java:584)
    at org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService.start(UndertowDeploymentInfoService.java:283)
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1948)
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1881)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
Caused by: java.io.IOException: User limit of inotify watches reached
    at sun.nio.fs.LinuxWatchService$Poller.implRegister(LinuxWatchService.java:264)
    at sun.nio.fs.AbstractPoller.processRequests(AbstractPoller.java:260)
    at sun.nio.fs.LinuxWatchService$Poller.run(LinuxWatchService.java:329)


라는 메시지를 간혈적으로 보일경우가 있다
위 메시지를 Jboss 설정에서 default로 watches를 사용하고 있는데
이 watches를 비활성 하기 위해서는 JAVA_OPTS를 추가해야 한다.


"$JAVA_OPTS -Dio.undertow.disable-file-system-watcher=true"





2018년 3월 21일 수요일

Apache virtualhost rewrite 설정

virtualhost 설정은 기본적으로 IP 기반으로 동작한다

http는 80포트
https는 443포트

한 서버에서 테스트 시에 http와 https를 동시에 사용할 경우 문제점이 발생한다.
예를 들면
http://nonssl.testserver.com 이라는 URL을 호출하였을 시 문제가 없다
하지만 https://nonssl.testserver.com https로 호출하였을 시에 코드는 200이 떨어지면서 정상적으로 호출 된거처럼 보인다. 이건 잘못된 것이기 때문에 바로 잡아 주어야 한다.
이 원리는 기본적으로 host파일에 IP와 domain을 매핑 시키면 도메인명을 찾아 호출되는게 아니라 IP로 호출하기 때문에 https://nonssl.testserver.com 로 호출 하였을 시에
virtualhost *:443 으로 Listen하고 있는 virtualhost로 호출된다. 이 원리가 이해가 안간다면 virtualhost 동작 방식 문서를 참고하길 바란다.

IP를 추가로 할당 하여 virtualhost IP:PORT 로 설정 해주어도 가능하지만 만약 추가로 IP를 할당 받지 못할 경우 mod_rewrite를 사용하여 https 로 호출되는 것을 막을 수 있다.

RewriteEngine On (rewriteengine 사용여부 default가 off기 때문에 on)
RewriteCond %{HTTP_HOST} !^usessl\.testserver\.com$ [NC] (조건)
RewriteRule (.*) http://%{SERVER_NAME}$1 [R,L] (처리)

!는 부정이기 때문에 SERVER_NAME을 받아서 ssl을 사용하는 SERVER_NAME으로 들어왔을 경우에 다시 돌려보내는 방식으로 설정한다. 

이외에도 다른 방법들이 있지만 우선 이 방법을 사용하는 것이 가장 빠르다.