리눅스 톰캣 설치 및 설정 방법 / 톰캣 실행 에러 해결

리눅스 톰캣 설치 방법

톰캣, JDK 설치 파일 준비

리눅스 서버에서 인터넷 연결이 된다면 wget 명령어로 직접 설치해도 됩니다.
인터넷 연결이 안 되는 내부망 운영서버 구축에 익숙해질 수 있도록 wget 없이 설치하면 더 좋습니다.

JDK 설치 파일 준비
윈도우에서 jdk-11.0.2_linux-x64_bin.tar.gz 파일을 다운 받고, 파일질라로 리눅스 서버의 유저 home 폴더에 올립니다.

톰캣 설치 파일 준비
윈도우에서 apache-tomcat-9.0.56.tar.gz 파일을 다운 받고, 파일질라로 리눅스 서버의 유저 home 폴더에 올립니다.

톰캣 설치 방법

PuTTY로 접속하여 유저 home 폴더에서 명령어로 압축을 해제합니다.

톰캣 압축 해제

tar xzf apache-tomcat-9.0.56.tar.gz

톰캣 폴더 이동

sudo mv apache-tomcat-9.0.56 /usr/local/tomcat

압축 해제한 톰캣 폴더를 적절한 위치에 이동시키며, 폴더명을 짧게 변경합니다.

JDK 설치 방법

JDK 압축 해제

tar xzf jdk-11.0.2_linux-x64_bin.tar.gz

JDK 폴더 이동

sudo mv jdk-11.0.2_linux-x64_bin /usr/local/jdk-11

압축 해제한 JDK 폴더를 적절한 위치에 이동시키며, 폴더명을 짧게 변경합니다.


톰캣 초기 설정 방법

리눅스 환경변수 설정

sudo vi /etc/profile

profile 파일 가장 하단에 아래와 같이 JDK, 톰캣 경로 설정 추가 후 저장합니다.

export JAVA_HOME=/usr/local/jdk-11
export CATALINA_HOME=/usr/local/tomcat
export CLASSPATH=.:$JAVA_HOME/jre/lib/ext:$JAVA_HOME/lib/tools.jar:$CATALINA_HOME/lib/jsp-api.jar:$CATALINA_HOME/lib/servlet-api.jar
PATH=$PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin

리눅스 환경변수 적용

source /etc/profile

위 명령어를 입력해야 변경된 profile 파일이 리눅스 서버에 반영됩니다.

JAVA 버전 확인

java -version

JAVA_HOME 확인

echo $JAVA_HOME

JAVA_HOME JDK 버전(11)에 비해 빌드한 프로젝트 JAVA 버전(17)이 너무 높은 경우,
URL 접속 시 404 에러가 날 수 있습니다.

catalina.out 톰캣 로그 날짜별 생성 설정

톰캣 설치 후 기본적으로 catalina.out 파일 하나에 모든 사용자 요청 로그가 저장되기 때문에,
오래 운영하다 보면 파일 용량이 커서 열리지 않기도 합니다.
이를 방지하기 위해서 매일 catalina.out 파일을 쪼개서 날짜별 로그로 생성하도록 설정해두는 것이 좋습니다.

톰켓 로그 경로

/톰캣경로/logs

톰캣용 로그 관리 도구 logrotate 생성

sudo vi /etc/logrotate.d/tomcat

아래와 같이 입력 후 저장하면 바로 자동 적용됩니다.
로그파일 사이즈가 100M 이상이 될 때 catalina.out 파일의 내용을 잘라 새 로그 파일로 저장하는 설정입니다.

/usr/local/tomcat/logs/catalina.out {
  copytruncate
  size 100M
  rotate 30
  compress
  missingok
  notifempty
  dateext
  dateformat .%Y-%m-%d_%H.log
}

logrotate 옵션에 대한 설명은 다음과 갈습니다.

copytruncate 현재 로그 파일을 복사한 후 원본 파일을 비웁니다.
daily 일 단위로 rotate를 실행합니다.
다른 회전 옵션이 공존하면, 둘 중 하나가 충족될 때 회전됩니다.
size 100M 로그 파일 용량이 100M 이상이 될 때 rotate를 실행합니다.
(파일당 100M 미만으로 저장)
rotate 30 .log, log.gz 파일 통틀어서 최근 30개의 로그파일만 저장하게 해줍니다.
현재는 catalina.out 설정이므로, catalina.out 관련 파일에만 적용됩니다.
compress 로그파일을 gzip 확장자로 압축 저장하여 디스크 공간을 절약합니다.
(예시 : catalina.out.YYYY-MM-DD_HH.log.gz)
missingok 로그 파일이 없어도 에러를 발생시키지 않습니다.
dateext 회전된 로그 파일 이름에 날짜를 추가합니다.
notifempty 로그 파일이 비어 있으면 회전시키지 않습니다.
delaycompress 최근 분할된 로그파일 1개를 제외하고 압축합니다.

logrotate 적용 명령어

sudo logrotate -f /etc/logrotate.d/tomcat

logrotate 설정 전에 생성된 로그에도 설정을 적용하고 싶을 때 실행하는 명령어입니다.
-d 옵션으로 변경하여 실행하면, 작동이 잘 되는지 미리 테스트할 수 있습니다.

30일 이상 톰캣 로그 파일 삭제 설정

톰캣 로그 삭제 쉘 스크립트 생성

vi /usr/local/tomcat/logs/tomcat-log-delete.sh

아래와 같이 입력하고 저장합니다.

find /usr/local/tomcat/logs/ -mtime +30 -name "catalina.*.log*" -exec rm {} \;
find /usr/local/tomcat/logs/ -mtime +30 -name "host-manager.*.log*" -exec rm {} \;
find /usr/local/tomcat/logs/ -mtime +30 -name "localhost.*.log*" -exec rm {} \;
find /usr/local/tomcat/logs/ -mtime +30 -name "localhost_access_log.*.txt*" -exec rm {} \;
find /usr/local/tomcat/logs/ -mtime +30 -name "manager.*.log*" -exec rm {} \;

톰캣 경로가 다른 경우, find 명령어 앞부분 톰캣 경로를 수정해줘야 합니다.
-exec 앞까지 실행하면 삭제 대상 로그 파일을 미리 볼 수 있습니다.

스크립트 실행 권한 부여

chmod +x /usr/local/tomcat/logs/tomcat-log-delete.sh

생성한 쉘 스크립트에 실행 가능 권한을 부여합니다.

스크립트 실행 테스트

cd /usr/local/tomcat/logs
./tomcat-log-delete.sh

스크립트를 실행하여 정상 작동되는지 확인합니다.
실행할 수 없다는 에러가 나지 않으면 정상 작동되는 것입니다.

크론탭 등록

crontab -e

cron 작업 편집기를 열고, 아래와 같이 입력 후 저장하여 배치 작업을 예약합니다.

0 1 * * * /usr/local/tomcat/logs/tomcat-log-delete.sh

매일 새벽 1시 0분에 톰캣 로그 삭제 쉘 파일을 실행하도록 설정합니다.

크론탭 로그 확인

tail -100f /var/log/cron

크론탭 로그를 실시간으로 확인할 수 있습니다.

톰캣 Context 설정

vi /usr/local/tomcat/conf/server.xml

ROOT 폴더를 프로젝트 폴더로 사용하면, Service 추가 및 Context 설정이 필요하지 않습니다.

<Service name="Catalina2">
	<Connector port="8081" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
  <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
	<Engine name="Catalina" defaultHost="localhost">
    <Realm className="org.apache.catalina.realm.LockOutRealm">
    <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>
    </Realm>
    <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" />
      <Context docBase="프로젝트폴더명" path="접근URL경로" reloadable="true" sessionCookiePath="/"/>
    </Host>
	</Engine>
</Service>

여러 프로젝트를 하나의 톰캣에 올리는 경우는 위 Service 설정을 프로젝트 수만큼 넣어줘야 합니다.
각 서비스의 서비스명, Connector 포트, Context docBase는 중복되지 않게 수정이 필요합니다.

서버 내 이미지 폴더 경로 추가

<Context docBase="/경로/이미지폴더명/" path="/접근URL경로" reloadable="true" />

톰캣 DB 연결 설정

이클립스 내부 톰캣, 리눅스 서버 톰캣 모두 동일한 설정으로 MariaDB에 연결되는 것을 확인하였습니다.

server.xml 설정 추가

<GlobalNamingResources>
	<Resource auth="Container" factory="org.apache.tomcat.dbcp.dbcp2.BasicDataSourceFactory" driverClassName="com.mysql.jdbc.Driver" global="jdbc/DB명" maxTotal="20" maxIdle="10" maxWait="-1" name="jdbc/DB명" type="javax.sql.DataSource" url="jdbc:mysql://DB서버IP:3306/DB명?characterEncoding=UTF-8" username="유저명" password="비밀번호" validationQuery="select 1"/>
</GlobalNamingResources>

context.xml 설정 추가

<Context>
	<ResourceLink global="jdbc/DB명" name="jdbc/DB명" type="javax.sql.DataSource"></ResourceLink>
</Context>

톰캣 폴더 소유자 변경

sudo chown -R 유저명:유저명 tomcat

root 계정 소유 폴더는 파일질라에서 다른 계정으로 접속 시 조회가 되지 않습니다.
위 명령어로 톰캣 폴더 소유자를 변경해두면 다른 계정에서도 접근 및 실행이 가능합니다.
보안상 운영서버가 아닌 개발서버에서만 소유자를 root 외 계정의 유저로 설정하는 것이 좋습니다.


기타 톰캣 설정

톰캣 로그 레벨 변경

cd /톰캣경로/webapps/프로젝트폴더명/WEB-INF/classes
vi log4j2.xml

전자정부프레임워크 기준으로 org.springframework 등의 Logger level을 ERROR가 아니라 DEBUG로 변경하면 에러 로그가 더 상세히 나옵니다.
평소 운영 중에는 ERROR로 변경해두어 너무 많은 로그가 쌓이지 않도록 합니다.

log4j2 로그 경로 설정

<RollingFile name="file" fileName="/DATA/log4j/프로젝트명/system.log" filePattern="/DATA/log4j/프로젝트명/system.log.%d{yyyy-MM-dd-hh}">
  <PatternLayout pattern="%d %5p [%c] %m%n"/>
  <Policies>
    <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
  </Policies>
</RollingFile>

/톰캣경로/webapps/프로젝트폴더명/WEB-INF/classes/log4j2.xml 파일에서 RollingFile 태그의 fileName은 현재 서버에 위치한 log4j system.log 파일이어야 합니다.

톰캣 최대 파라미터 수 변경

<Connector port="8080" protocol="HTTP/1.1" server="Server"
  connectionTimeout="20000"
  redirectPort="8443"
  maxParameterCount="2000"
  maxThreads="700"
/>

톰캣 server.xml에 톰캣 서버가 요청에서 받을 수 있는 파라미터 수를 지정할 수 있습니다.
해당 설정이 없을 때 기본값은 10000이고, 개수를 초과하는 파라미터는 무시되어 에러가 발생할 수 있습니다.


톰캣 실행 및 종료

톰캣 실행

cd /톰캣경로/bin
./startup.sh

톰캣 실행 확인

ps -ef | grep tomcat

톰캣 실행중 상태

root      PID     1  0 Jan27 ?        00:33:10 /usr/local/jdk-11/bin/java -Djava.util.logging.config.file=/톰캣경로/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /톰캣경로/bin/bootstrap.jar:/톰캣경로/bin/tomcat-juli.jar -Dcatalina.base=/톰캣경로 -Dcatalina.home=/톰캣경로 -Djava.io.tmpdir=/톰캣경로/temp org.apache.catalina.startup.Bootstrap start
ec2-user 17265 17140  0 02:31 pts/0    00:00:00 grep --color=auto tomcat

톰캣 종료 상태

ec2-user 17301 17140  0 02:33 pts/0    00:00:00 grep --color=auto tomcat

톰캣 종료

cd /톰캣경로/bin
./shutdown.sh

톰캣 접속 테스트

URL으로 톰캣 연결 확인
http://서버외부IP또는로드밸런서IP:포트 URL 접속 시 톰캣 화면이 나오면 정상 설치된 것입니다.

리눅스 서버 내부에서 톰캣 정상 확인

curl localhost:포트

해당 URL에서 반환하는 HTML을 출력하여 보여줍니다. 80 포트는 생략이 가능합니다.
외부에서 아웃바운드 보안에 막혀 접근을 못하는 것인지, 톰캣 자체에 문제가 있는지 알 수 있습니다.


톰캣 에러 해결

root 계정으로 톰캣 실행하지 않은 경우 에러메세지

Using CATALINA_BASE:   /톰캣경로
Using CATALINA_HOME:   /톰캣경로
Using CATALINA_TMPDIR: /톰캣경로/temp
Using JRE_HOME:        /usr/local/jdk-11
Using CLASSPATH:       /톰캣경로/bin/bootstrap.jar:/톰캣경로/bin/tomcat-juli.jar
Using CATALINA_OPTS:
touch: cannot touch ‘/톰캣경로/logs/catalina.out’: Permission denied
/톰캣경로/bin/catalina.sh: line 504: /톰캣경로/logs/catalina.out: Permission denied
Neither the JAVA_HOME nor the JRE_HOME environment variable is defined
At least one of these environment variable is needed to run this program

아래는 사이트 접속 시 F12 콘솔에 찍히는 에러입니다.

GET http://서버IP:포트 500 (Internal Server Error)

root 계정이 소유한 톰캣을 다른 계정으로 실행하면 발생하는 에러입니다.
root 계정으로 전환하거나 톰캣 폴더 소유자를 현재 계정으로 변경하고 실행하면 정상적으로 동작합니다.

톰캣 실행 시 DB 접근 불가 에러

Caused by: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is java.sql.SQLException: Cannot create PoolableConnectionFactory (Communications link failure

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.)
    at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:83)
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:646)
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:713)
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:738)
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:794)
    at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.query(NamedParameterJdbcTemplate.java:209)
    at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.queryForList(NamedParameterJdbcTemplate.java:303)
    at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.queryForList(NamedParameterJdbcTemplate.java:310)
    at org.egovframe.rte.fdl.security.securedobject.impl.SecuredObjectDAO.getRolesAndResources(SecuredObjectDAO.java:276)
    at org.egovframe.rte.fdl.security.securedobject.impl.SecuredObjectDAO.getRolesAndMethod(SecuredObjectDAO.java:331)
    at org.egovframe.rte.fdl.security.securedobject.impl.SecuredObjectServiceImpl.getRolesAndMethod(SecuredObjectServiceImpl.java:84)
    at org.egovframe.rte.fdl.security.intercept.MethodResourcesMapFactoryBean.init(MethodResourcesMapFactoryBean.java:56)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeCustomInitMethod(AbstractAutowireCapableBeanFactory.java:1930)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1872)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1800)
    ... 99 more

톰캣이 설치된 리눅스 서버의 3306 아웃바운드 방화벽을 허용해야 DB에 접근할 수 있습니다.

톰캣 실행 시 DB 접근 권한 에러

Caused by: java.sql.SQLException: Access denied for user '계정명'@'IP또는호스트명' (using password: YES)
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129)
    at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)
    at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:828)
    at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:448)
    at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:241)
    at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:198)
    at org.apache.tomcat.dbcp.dbcp2.DriverConnectionFactory.createConnection(DriverConnectionFactory.java:53)
    at org.apache.tomcat.dbcp.dbcp2.PoolableConnectionFactory.makeObject(PoolableConnectionFactory.java:355)
    at org.apache.tomcat.dbcp.dbcp2.BasicDataSource.validateConnectionFactory(BasicDataSource.java:116)
    at org.apache.tomcat.dbcp.dbcp2.BasicDataSource.createPoolableConnectionFactory(BasicDataSource.java:731)
    ... 122 more

MySQL DB에 접속하여 아래의 명령어로 권한을 부여하면 해당 DB 호스트에서 root 계정에 접근할 수 있습니다.

GRANT ALL PRIVILEGES ON *.* TO '계정명'@'IP또는호스트명' IDENTIFIED BY '계정비밀번호';
FLUSH PRIVILEGES; -- 변경사항 적용

톰캣 실행 시 기존 캐시 에러

Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'ChatAi.x-ncp-clovastudio-api-key' in value "${ChatAi.x-ncp-clovastudio-api-key}"
	at org.springframework.util.PropertyPlaceholderHelper.parseStringValue(PropertyPlaceholderHelper.java:180)
	at org.springframework.util.PropertyPlaceholderHelper.replacePlaceholders(PropertyPlaceholderHelper.java:126)
	at org.springframework.beans.factory.config.PropertyPlaceholderConfigurer$PlaceholderResolvingStringValueResolver.resolveStringValue(PropertyPlaceholderConfigurer.java:230)
	at org.springframework.beans.factory.support.AbstractBeanFactory.resolveEmbeddedValue(AbstractBeanFactory.java:936)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1330)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1309)
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:656)
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:639)
	at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:119)
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:399)
	... 41 more

ChatAi 관련 코드를 삭제했음에도, 관련 에러가 발생하는 경우 아래와 같이 톰캣 캐시를 삭제합니다.
Servers 탭 > 톰캣 종료 > 톰캣 우클릭 > Clean… > 톰캣 Web Modules Path 수정 (예시 : /)

톰캣 실행 시 AJP 연결자 에러

[log4j]2024-08-30 10:17:23,735  INFO [org.springframework.web.servlet.DispatcherServlet] Completed initialization in 3740 ms
8월 30, 2024 10:17:23 오전 org.apache.coyote.AbstractProtocol start
INFO: 프로토콜 핸들러 ["http-nio-8080"]을(를) 시작합니다.
8월 30, 2024 10:17:23 오전 org.apache.catalina.util.LifecycleBase handleSubClassException
SEVERE: 구성요소 [Connector["ajp-nio-127.0.0.1-8009"]]을(를) 시작하지 못했습니다.
org.apache.catalina.LifecycleException: 프로토콜 핸들러 시작 실패
	at org.apache.catalina.connector.Connector.startInternal(Connector.java:1042)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:171)
	at org.apache.catalina.core.StandardService.startInternal(StandardService.java:450)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:171)
	at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:921)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:171)
	at org.apache.catalina.startup.Catalina.start(Catalina.java:772)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:347)
	at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:478)
Caused by: java.lang.IllegalArgumentException: AJP 연결자는 secretRequired="true"로 구성되었으나 보안 속성이 널 또는 ""입니다. 이 조합은 유효하지 않습니다.
	at org.apache.coyote.ajp.AbstractAjpProtocol.start(AbstractAjpProtocol.java:277)
	at org.apache.catalina.connector.Connector.startInternal(Connector.java:1039)
	... 12 more

8월 30, 2024 10:17:23 오전 org.apache.catalina.startup.Catalina start
INFO: 서버가 [37721] 밀리초 내에 시작되었습니다.

톰캣 server.xml의 AJP 설정에 아래와 같이 secretRequired 속성을 추가합니다.

<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" secretRequired="false"/>

로그인 시 톰캣 에러 로그

Caused by: java.lang.RuntimeException: Driver net.sf.log4jdbc.sql.jdbcapi.DriverSpy claims to not accept jdbcUrl, jdbc:log4jdbc:mariadb://DB서버명.ck39dp9w2h39.ap-northeast-2.rds.amazonaws.com:3306/innodb?serverTimezone=UTC&characterEncoding=UTF-8&autoReconnect=true&validationQuery=select 1
    at cohttp://m.zaxxer.hikari.util.DriverDataSource.<init>(DriverDataSource.java:110)
    at cohttp://m.zaxxer.hikari.pool.PoolBase.initializeDataSource(PoolBase.java:331)
    at cohttp://m.zaxxer.hikari.pool.PoolBase.<init>(PoolBase.java:114)
    at cohttp://m.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:108)
    at cohttp://m.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112)
    at org.springframework.jdbc.datasource.DataSourceUtils.fetchConnection(DataSourceUtils.java:159)
    at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:117)
    at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:80)
    at org.mybatis.spring.transaction.SpringManagedTransaction.openConnection(SpringManagedTransaction.java:80)
    at org.mybatis.spring.transaction.SpringManagedTransaction.getConnection(SpringManagedTransaction.java:67)
    at org.apache.ibatis.executor.BaseExecutor.getConnection(BaseExecutor.java:337)
    at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:86)
    at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:62)
    at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:325)
    at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:156)
    at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:109)
    at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:89)
    at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:151)
    ... 70 more

위와 같이, DB 연결이 안되면 log4jdbc.log4j2.properties 파일 위치를 WEB-INF/classes 폴더 안으로 옮겨주면 됩니다.

사이트 접속이 되지 않는 경우
톰캣이 정상 실행되었으나, 사이트 접속 시 톰캣에 로그도 찍히지 않는다면 방화벽에 막혀있을 확률이 높습니다.
firewalld를 확인하고, 해당 포트가 허용되어 있지 않다면 추가하거나 firewalld를 종료해야 합니다.

톰캣 종료 시 에러

Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr/local/jdk-11
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
NOTE: Picked up JDK_JAVA_OPTIONS:  --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED
Dec 02, 2023 2:00:22 PM org.apache.catalina.startup.Catalina stopServer
SEVERE: Could not contact [localhost:8005] (base port [8005] and offset [0]). Tomcat may not be running.
Dec 02, 2023 2:00:22 PM org.apache.catalina.startup.Catalina stopServer
SEVERE: Error stopping Catalina
java.net.ConnectException: Connection refused (Connection refused)
    at java.base/java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.base/java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:399)
    at java.base/java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:242)
    at java.base/java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:224)
    at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
    at java.base/java.net.Socket.connect(Socket.java:608)
    at java.base/java.net.Socket.connect(Socket.java:557)
    at java.base/java.net.Socket.<init>(Socket.java:453)
    at java.base/java.net.Socket.<init>(Socket.java:230)
    at org.apache.catalina.startup.Catalina.stopServer(Catalina.java:514)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    at org.apache.catalina.startup.Bootstrap.stopServer(Bootstrap.java:403)
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:497)

이러한 경우, ps -ef | grep tomcat으로 좌측에 나오는 톰캣 프로세스 PID를 강제로 kill 해야 합니다.


톰캣 버전 확인

톰캣 버전 확인 스크립트 실행

cd /톰캣설치경로/bin
./version.sh

Server number:이 현재 설치된 톰캣 버전입니다.

Leave a comment