May 8, 2019 - IntelliJ_IDEA

서버 재시작이 안되며 에러문구

오전 11:23	Error running 'Tomcat': Address localhost:2099 is already in use
오전 11:23	Error running 'Tomcat': Unable to open debugger port (127.0.0.1:6662): java.net.SocketException "socket closed"

계속 뒤에 있는 문자때문에,

Error running ‘Tomcat’: Unable to open debugger port (127.0.0.1:6662): java.net.SocketException “socket closed”

를 해결하려고 했으나, 원인은 처음 발생했던

Error running 'Tomcat': Address localhost:2099 is already in use  

2099 포트가 문제였습니다. Tomcat edit 화면에 가서 JMX port 를 변경하여 문제를 해결했습니다.

개발할때 성격 상,
debug mode 로 값을 수정하면서 여러가지 case by case 를 테스트하는 성격이라,
서버 실행 중에 소스 수정이 많고,
재시작이 빈번한 편입니다.

또한 local(windows) 환경과, centos 환경의 차이가 있을 수 있어(Encoding), 실 서버에 ftp로 연결하면서, 윈도우 특정상 파일을 점거하고 있어,

인텔리J가 해당 파일을 변경하지 못하여, 불안정하게 종료되면서 포트가 안죽는 이슈가 간혈적으로 발생합니다.

명령프롬포트창인

netstat -a -o

를 입력합니다. 그러면 수많은 네트워크를 사용하고 있는 프로세스들의 목록이 출력됩니다. 프로토콜 / 로컬 주소 / 외부 주소 / 상태 / PID 형태로 출력이 되는데요. 너무 많은 프로세스가 뜨기 때문에, 해당 port를 특정할 필요가 있습니다.

우리가 원하는 port 는 2099 이므로 다음과 같은 형태의 살아있는 port를 찾습니다.
(아래 테스트 문구는 52124라는 포르틀 찾는 예제 명령어입니다.)

\apache-tomcat-8.5.23\bin>netstat -a -o | find ":52124"
  TCP    192.168.100.11:52124   5.62.53.224:http       CLOSE_WAIT      2728

이제 PID 번호(2728)를 확인한 다음에 해당 프로세스ID를 종료시키면됩니다.

taskkill /f /pid PID번호

를 사용하면, 바로 해당 프로세스가 종료됩니다.
저는 해당 프로세스를 킬하기보다는 JMX Port 를 변경하는 식으로 작업을 합니다.

실전예제

오후 2:31	Error running 'Tomcat': Address localhost:2088 is already in use

가 다시 발생했습니다.

clusternodeImg

인텔리j에서 제공하는 Terminal 에서 바로 명령어를 입력하여, 프로세스를 킬한 후 톰캣을 재시작하면 됩니다.

May 2, 2019 - 톰켓 버추얼 호스팅 설정하기

server.xml 을 open

4월 30일 hosts 변경 후, 특정 ip로는 접속이 안되는 서버가 있어,
원일을 찾다가 발견했습니다.

단순히, defaultHost 설정이 버추얼 호스팅 주소와 맞지 않았기 때문입니다.

특정 아이피로 호출 했을 경우, 접속되는 아이피는 자동으로 defaultHost 로 변경되게 됩니다.

그런데 vim /etc/hosts 에도 없을 경우에는 톰캣에서 해당 IP를 찾지 못했다고 판단하여 팅겨내게 됩니다.

/etc/hosts 에 없을 경우 server.xml Alias 에라도 등록해두면, 처리됩니다.

<Engine name="Catalina" defaultHost="www.testtest.com">
  <Realm className="org.apache.catalina.realm.LockOutRealm">
    <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>
  </Realm>
  <Host name="www.testtest.com"  appBase="webapps" unpackWARs="true" autoDeploy="false">
      <Context path="" docBase="/home/xxx/public_html" reloadable="false" workDir="/home/xxx/public_html/WEB-INF/work"/>
        <Alias>01.testtest.com</Alias>
        <Alias>02.testtest.com</Alias>
        <Alias>01.test001.com</Alias>
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="/home/xxx/logs/tomcat" prefix="openrtb03.mediacategory.com-access.log-" suffix="" pattern="%h %l %u %t &quot;%r&quot; %s %b &quot;%{Referer}i&quot; &quot;%{User-Agent}i&quot; %Dms &quot;IP_info: %{IP_info}c ,Start_Time: %{Start_Time}c&quot;" fileDateFormat="yyyyMMdd-HH" resolveHosts="false" />
  </Host>
</Engine>

Engine

defaultHost : Host[name]과 일치하지 않는 호스트로 접속시 기본값으로 대처할 호스트입니다.
예를 들어 서버 아이피로 접속했을 경우 자동으로 defaulthost로 변경되게 됩니다.

예제 샘플으로 쉽게 설명하자면,

<Engine name="Catalina" defaultHost="localhost">
	...
	<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
		<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t &quot;%r&quot; %s %b" />
	</Host>
	...
</Engine>

개인 PC에서 테스르를 위해, 127.0.0.1 로 접속한 경우 아래 Host[name]에는 localhost 밖에 없어 일치하는 것이 없지만 기본값 localhost를 보고 localhost로 할당하게 됩니다.

Host

name : 호스트 이름입니다. 예를들어서 도메인이름 gs.saro.me 로 접속한경우 Host[name]이 gs.saro.me 인것을 찾고 없으면 위 설명처럼 Engine[defaultHost]의 값으로 접속합니다. appBase : 기본 경로입니다. 예를들어 webapps 라면 [톰켓기본경로/webapps] 를 기본으로 접속하게됩니다. autoDeploy(자동 디플로이) : autoDeploy는 속성값이 true로 자동으로 설정됩니다. 빈번하게 재시작하면 안되는 서버의 경우는 무조건 false 로 설정하셔야합니다.

Valve

호스트 접속시 영향을 주는 것들이라고 보면됩니다.
RemoteAddrValve 같이 IP 필터같은 필터 역활을 하는 것도있고 종류도 다양합니다.
AccessLogValve 같은 로그를 남기는 기능도 있습니다. 해당 로그를 남길때는 헤더정보까지 같이 남길수 있어 매우 편리합니다.

Apr 30, 2019 - HOSTNAME 변경

HOSTSNAME 변경하는 법

  1. vim /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=xxxx-WAS-05

호스트 네임 변경.

  1. hostname xxxx-WAS-05

  2. vi /etc/hosts

    127.0.0.1   xxxx-WAS-01 localhost.localdomain localhost4 localhost4.localdomain4
    ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
    

여기서 3번은 scouter에서,

오류: 에이전트에 예외사항이 발생했습니다. : java.net.MalformedURLException: Local host name unknown: java.net.UnknownHostException: xxxx-WAS-01: xxxx-WAS-01: 이름 혹은 서비스를 알 수 없습니다.

라는 오류가 발생하는 경우가 생겨서 입니다. localhost 가 등록이 되지 않아 못찾는 것이므로 /etc/hosts에 해당 내용을 수정해야합니다.

추가로 서버를 새롭게 설정한 후에 접속이 안되는 이슈가 있었는데, /etc/hosts 에 자기 자신을 호출 할 수 있게 등록을 해줘야하는 것으로 보입니다.

127.0.0.1   xxxx-WAS-01 localhost.localdomain localhost4 localhost4.localdomain4 test.com
10.251.0.xxx test.com