Tomcat
[Tomcat] 아파치 톰캣(Apache Tomcat) Several ports (8080, 8009) required by Tomcat v8.5 Server at localhost are already in use. 오류 해결 총 정리
오류 내용
Several ports (8080, 8009) required by Tomcat v8.5 Server at localhost are already in use.
The server may already be running in another process, or a system process may be using the port.
To start this server you will need to stop the other process or change the port number(s).
주요 원인
원인 01 : 톰캣이 실행하려고 할 때 이를 무시하고, 다시 Run (톰캣 재시작)을 눌렀을 때
자세한 원인 : 톰캣을 실행 하려고 준비 중이었는데 무시하고 바로 또 Run를 할 경우 포트가 제대로 꺼지지 않았기 때문에 오류가 뜬다.
원래는 톰캣 실행이 다 끝나고 또 실행하면 겹치지않고 기존에 톰캣이 종료되고 새 프로세스를 가진 톰캣이 시작되는 게 정상이다.
원인 02 : 또 다른 프로그램이 8080 or 8009 등 톰캣에 필요한 포트를 점유하고 있기 때문입니다.
원인 03 : 이클립스(혹은 다른 IDE) 프로그램 강제종료 후 톰캣 재실행했을 때 좀비 프로세스가 남아있는 경우.
해결 (윈도우(Windows GUI))
GUI (Graphical User Interface)로 해당 프로세스 끄기
작업 관리자 창 실행
0.Windows 키 + R → 실행창에 taskmgr
javaw.exe 프로세스 종료
1. 작업 관리자 → 세부 정보 → javaw.exe 작업 끝내기(강제 종료)
해결 (윈도우(Windows CLI))
CLI (Command Line Interface)로 해당 프로세스 끄기
명령 프롬프트 실행
0.Windows 키 + R → 실행창에 cmd
포트 찾기 명령어
특정 포트가 열려 있는지 확인
1.netstat -na | findstr 8009
열려 있는 포트의 PID 확인
2.netstat -nao | findstr 8009
PID(Process IDentifier) 찾기
3.tasklist |findstr "PID"
PID 프로세스 종료 (죽이기)
4.taskkill /f /pid "PID"
★ 참고 : "PID" 부분에 PID를 적으시고 명령어를 실행하면 됩니다. PID는 계속 변경됩니다.
해결 (리눅스(linux))
리눅스 (linux) 해당 프로세스 끄기
열려있는 포트 확인
1.netstat -tnlp
특정 포트(8080) 상태 확인
2.netstat -nap | grep 8080
특정 포트(8080) 종료
3.fuser -k -n tcp 8080
※ 주의 : 리눅스는 윈도우랑 다르게 PID가 아닌 port로 명령어를 실행합니다.
'Tomcat' 카테고리의 다른 글
[Tomcat] JNDI(Java Naming and Directory Interface) 설정 총 정리 (1) | 2020.04.19 |
---|
[Tomcat] JNDI(Java Naming and Directory Interface) 설정 총 정리
JNDI(Java Naming and Directory Interface)는 디렉터리 서비스에서 제공하는
데이터 및 객체를 발견(discover)하고 참고(lookup) 하기 위한 자바 API다.
출처 : 위키백과
JNDI는 DB Connection을 WAS에서 제어하면서 서버에서 하나의 커넥션 풀을 가진다.
(중요하니까 본명 조 폰트)
이 글에서 설명하는 JNDI 예시 환경
JNDI를 설정하기전에 체크
1.자기 환경의 WAS
2.자기 환경의 JDBC 방식
3.자기 환경의 Spring framework 버전 혹은 MVC / Boot
WAS : tomcat 8.5
Spring framework MVC Project : 5.0.3
jdbc 방식 : dbcp
DB : MariaDB 10.2
JNDI (Java Naming and Directory Interface) 사용 이유
1. 여러 프로젝트에서 하나의 datasource를 공유해서 사용할 때
2. 실제 프로젝트는 WAS에 올라가 운영되는데 개발/소스를 잘 모르는 운영자가 이해하기 쉽게 하기 위함
3.WAS의 교체에도 신속한 대응이 가능하다.
1.Spring 프로젝트 내부 설정
1-1.root-context.xml 상단 내용 추가 ( jee를 쓰기 위함 )
<xmlns:jee="http://www.springframework.org/schema/jee"
xsi:schemaLocation="http://www.springframework.org/schema/jee
http://www.springframework.org/schema/jee/spring-jee.xsd">
1-1.root-context.xml 하단 내용 추가
기존 JDBC 방식 (변경 전)
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.mariadb.jdbc.Driver" />
<property name="url" value="jdbc:mariadb//localhost:3306/databaseName" />
<property name="username" value="dkanro" />
<property name="password" value="dkanro1" />
</bean>
JDNI 방식 (변경 후)
<jee:jndi-lookup id="dbDataSource"
jndi-name="jdbc/projectName"
expected-type="javax.sql.DataSource" />
jndi-name : 자기가 설정하고 싶은 별칭 (하지만 이 이름이 설정 페이지와 동일해야 된다.)
1-2.web.xml
<resource-ref>
<description>jndiprojectName</description>
<res-ref-name>jdbc/projectName</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
2.Tomcat 설정
$CATALINA_HOME == 톰캣이 위치한 경로
2-1.server.xml 설정하기
$CATALINA_HOME/conf/server.xml 내용 추가
<GlobalNamingResources>
<Resource auth="Container" driverClassName="org.mariadb.jdbc.Driver"
factory="org.apache.tomcat.dbcp.dbcp2.BasicDataSourceFactory"
name="jdbc/projectName"
type="javax.sql.DataSource"
url="jdbc:mariadb://172.10.0.10:3306/databaseName"
username="dkanro1" password="dkanro1"/>
</GlobalNamingResources>
톰캣 안에 <GlobalNamingResources> </GlobalNamingResources> 태그는 원래 존재합니다.
직접 만드는 것이 아닙니다.
안에 내용 <Resource ~~..>만 기술하는 것입니다.
2-2.context.xml 설정하기
$CATALINA_HOME/conf/context.xml 내용 추가
<Context>
<ResourceLink name="jdbc/projectName" global="jdbc/projectName" type="javax.sql.DataSource"/>
</Context>
2-3.mariaDB JDBC.jar 드라이버 파일 추가
$CATALINA_HOME/lib 폴더에 mariadb-java-client-1.5.9.jar 파일 추가 ( 버전은 꼭 1.5.9가 아니어도 됩니다. )
mariadb-java-client-1.5.9.jar
3.Tomcat 서비스 재시작
systemctl restart tomcat (서비스 이름은 다 다릅니다.)
추가 참고사항
※ 자주 뜨는 오류
원인 : mariadb-java-client-1.5.9.jar 파일이 $CATALINA_HOME/lib 폴더에 존재하지 않는 경우.
해결 : mariadb-java-client-1.5.9.jar를 다운받아 $CATALINA_HOME/lib에 넣은 후 서비스 재시작
The web application [] registered the JDBC driver [org.mariadb.jdbc.Driver]
but failed to unregister it when the web application was stopped. To prevent a memory leak,
the JDBC Driver has been forcibly unregistered.
※ mariadb-java-client-1.5.9.jar 드라이버 다운로드 주소
https://mvnrepository.com/artifact/org.mariadb.jdbc/mariadb-java-client/1.5.9
링크 들어가셔서 상단 Files에 jar 버튼 누르시면 다운로드됩니다.
※ DB가 다를 경우
driverClass와 url을 변경하시면 됩니다.
//예시 Oracle일 경우
driverClassName="oracle.jdbc.OracleDriver"
url="jdbc:oracle:thin:@172.10.0.10:1521:SID"
※ JDBC 방식이 다를 경우
이 부분을 원하는 JDBC 방식 문법에 맞게 변경하면 됩니다.
<Resource auth="Container" driverClassName="org.mariadb.jdbc.Driver"
factory="org.apache.tomcat.dbcp.dbcp2.BasicDataSourceFactory"
name="jdbc/projectName"
type="javax.sql.DataSource"
url="jdbc:mariadb://172.10.0.10:3306/databaseName"
username="dkanro1" password="dkanro1"/>