톰캣 CATALINA_HOME vs. CATALINA_BASE

톰캣에 존재하는 두개의 배치 장소 CATALINA_HOME 과 CATALINA_BASE 의 관한 이야기.
도대체 어디에 디플로이 해야 하는거야!?

환경
우분투 서버 14.04 LTS
톰캣 7.0

기본적인 지식부터 깔아두고 시작하자.
CATALINA_HOME : 톰캣의 인스톨 장소. 실행 파일이 들어있는 bin 폴더가 있다.
CATALINA_BASE : 톰캣의 인스턴스가 존재하는 곳이라고 한다.

카탈리나 홈은 톰캣이 설치 된 장소이고, 카탈리나 베이스는 유저가 디플로이나 설정을 해서 실제로 사용하는 곳 정도로 파악된다.

그런데 헷갈리게도 카탈리나 홈에도 webapp 나 conf 디렉토리가 있고, 실제로 이곳에 war 파일을 넣고, conf에 있는 server.xml을 수정해서 bin 폴더의 startup.sh로 기동하면 잘 작동 된다!
게다가 카탈리나 베이스에서도 webapp 디렉토리에 war 파일을 넣고 conf 디렉토리에 server.xml을 수정하고 service tomcat7 start 를 하게 되면 잘 작동 된다!

차이를 알았나?

카탈리나 홈은 bin 디렉토리에 있는 startup.sh로 기동했을 때 카탈리나 베이스로서 작동한다.
우분투 서버에서 apt-get으로 톰캣7을 설치 했을 경우에
CATALINA_HOME=/usr/share/tomcat7
CATALINA_BASE=/var/lib/tomcat7
이렇게 설정되고 사용자는 CATALINA_BASE/webapps 디렉토리에 war 파일을 전개해서 사용하는게 정석이다.
어디까지나 기본적인 사용법이 그렇다는 얘기고…

사도(?)의 방법으로 CATALINA_HOME/webapps 디렉토리에 war 파일을 전개해서 CATALINA_HOME/bin/startup.sh 로 톰캣을 기동해서 사용하는 방법이 가능하다.
startup.sh로 기동하게 되면 CATALINA_HOME=CATALINA_BASE 가 되어서 /usr/share/tomcat7 디렉토리의 webapps, conf, work 디렉토리를 사용해서 톰캣이 기동하게 된다.
당연히 별도 설정이 없는한은 서버 재기동시 자동 기동 같은건 되지 않는다.

서버가 기동할때 실행되는 /etc/init.d/tomcat7 나 service tomcat 에서는
CATALINA_BASE=/var/lib/tomcat7
로 되어 있기 때문에 /var/lib/tomcat7 디렉토리의 webapps, conf 디렉토리를 사용하게 된다.
그리고, CATALINA_BASE 는 인스턴스 디렉토리이기 때문에 여러개의 톰캣 인스턴스로 기동할 수도 있다.
tomcat7-instance-create 을 참조

결론적으로 실제 서버로서 사용할 때는 자동으로 기동 되는 CATALINA_BASE 에 설정과 디플로이를 하는 것이 정답이고,
그 외에 개발 등의 특별한 목적으로 톰캣을 사용하는 경우에는 CATALINA_HOME 을 쓰는 것도 괜찮을 것 같다.

내 생각에는 이렇게 헷갈리는 구성이 된 이유는
원래(?) 톰캣이 설치 된 디렉토리에서 디플로이 하는 것이 당연했던 예전(또는 우분투 이외의 리눅스)의 모습을 유지하기 위해서가 아닌가 싶다.
실제로 나도 당연한 듯이 CATALINA_HOME 에서 설정 파일을 만지고 startup.sh 와 shutdown.sh 로 톰캣을 재기동 했으니까.
서버 재기동 후에 톰캣이 자동으로 기동 되었는데도 웹어플리케이션은 죽어있었기 때문에 (CATALINA_BASE에는 아무것도 없으니까!) 깨닫게 되었다.

구글링을 해 봐도 영문 포럼에서나 조금 이야기 되고 있는 내용이고, 한글로 된 내용은 없는 듯해서 이렇게 이야기를 풀어 보았다.

Problem with directory /usr/share/tomcat7/common/classes

톰캣 기동시 나오는 에러의 해결 방법.

8 27, 2015 12:56:56 午前 org.apache.catalina.startup.ClassLoaderFactory validateFile
警告: Problem with directory [/usr/share/tomcat7/common/classes], exists: [false], isDirectory: [false], canRead: [false]
8 27, 2015 12:56:57 午前 org.apache.catalina.startup.ClassLoaderFactory validateFile
警告: Problem with directory [/usr/share/tomcat7/common], exists: [false], isDirectory: [false], canRead: [false]
8 27, 2015 12:56:57 午前 org.apache.catalina.startup.ClassLoaderFactory validateFile
警告: Problem with directory [/usr/share/tomcat7/server/classes], exists: [false], isDirectory: [false], canRead: [false]
8 27, 2015 12:56:57 午前 org.apache.catalina.startup.ClassLoaderFactory validateFile
警告: Problem with directory [/usr/share/tomcat7/server], exists: [false], isDirectory: [false], canRead: [false]
8 27, 2015 12:56:57 午前 org.apache.catalina.startup.ClassLoaderFactory validateFile
警告: Problem with directory [/usr/share/tomcat7/shared/classes], exists: [false], isDirectory: [false], canRead: [false]
8 27, 2015 12:56:57 午前 org.apache.catalina.startup.ClassLoaderFactory validateFile
警告: Problem with directory [/usr/share/tomcat7/shared], exists: [false], isDirectory: [false], canRead: [false]
8 27, 2015 12:57:02 午前 org.apache.coyote.AbstractProtocol init
情報: Initializing ProtocolHandler ["http-bio-127.0.0.1-8080"]
8 27, 2015 12:57:02 午前 org.apache.coyote.AbstractProtocol init
情報: Initializing ProtocolHandler ["ajp-bio-8009"]
8 27, 2015 12:57:02 午前 org.apache.catalina.startup.Catalina load
情報: Initialization processed in 4545 ms
8 27, 2015 12:57:02 午前 org.apache.catalina.core.StandardService startInternal
情報: サービス Catalina を起動します

디렉토리가 없어서 에러가 나는 것 같으니 디렉토리를 만들어 준다. 끝.

cd /usr/share/tomcat7
mkdir -p common/classes
mkdir -p server/classes
mkdir -p shared/classes

우분투 root 계정 사용하기 / 잠그기

우분투에서는 보안관계상 기본적으로 root 계정을 사용하지 못하게 되어 있다.
root 계정이 필요할 경우에는 sudo나 su 명령을 쓰게 되어 있는데, root 계정에 비밀번호를 설정하면 root 접속이 가능해진다.

아래 명령으로 root 계정의 패스워드를 설정하면 root 계정을 사용할 수 있게 된다.

아래 명령을 치고, 위에서 설정한 패스워드로 root 계정으로 접속.

위처럼 root 계정을 활성화하면 보안상으로는 그리 좋지 않기 때문에 root 계정을 사용하는 것은 되도록 자제하는게 좋겠다.

다시 root 계정을 비활성화하기 위해서는 아래 명령을 사용한다.

root 계정이 잠긴 상태는 아래 명령으로 확인할 수 있다.

L이면 잠긴 상태 P이면 풀린 상태이다.

워드프레스 이미지를 자르는데 에러가 발생했습니다.

이미지 자르기 에러
이미지 자르기 에러

워드프레스에서 이미지 자르기에서 발생하는 에러의 문제 해결 방법.

에러 메시지는 아래와 같다.

PHP에서 이미지 관련 처리를 하는 php gd 라이브러리가 없어서 나오는 에러이다.
우분투 서버 14.04 LTS에서는 아래와 같은 커맨드로 php gd를 설치한다.

다시 이미지 자르기를 해 보면 잘 된다!

아파치-톰캣 mod_jk 연동시 에러 문제 해결

아파치와 톰캣을 mod_jk로 연동했을 때 나오는 에러 메시지를 없애는 방법.
톰캣 연동 자체에는 문제가 없기 때문에 고치지 않아도 되는 문제지만, mod_jk.log에 계속 에러가 뜨고 있어서 신경 쓰이기 때문에 찾아봤다.

원인은 jk-manager와 jk-status라는 mod_jk관리와 상태를 표시해주는 웹모듈이 활성화 되어있어서 그런듯한데 그런거 안쓰기 때문에 그냥 주석처리로 해결했다.

에러 메시지 내용

[error] extension_fix::jk_uri_worker_map.c (564): Could not find worker with name 'jk-manager' in uri map post processing.
[error] extension_fix::jk_uri_worker_map.c (564): Could not find worker with name 'jk-status' in uri map post processing.

/etc/apache2/mods-available/jk.conf 파일을 열어서 아래 부분을 찾아서 주석처리한다.

    <Location /jk-status>
        # Inside Location we can omit the URL in JkMount
        JkMount jk-status
        Order deny,allow
        Deny from all
        Allow from 127.0.0.1
    </Location>
    <Location /jk-manager>
        # Inside Location we can omit the URL in JkMount
        JkMount jk-manager
        Order deny,allow
        Deny from all
        Allow from 127.0.0.1
    </Location>

주석처리 후

#    <Location /jk-status>
#        # Inside Location we can omit the URL in JkMount
#        JkMount jk-status
#        Order deny,allow
#        Deny from all
#        Allow from 127.0.0.1
#    </Location>
#    <Location /jk-manager>
#        # Inside Location we can omit the URL in JkMount
#        JkMount jk-manager
#        Order deny,allow
#        Deny from all
#        Allow from 127.0.0.1
#    </Location>

아파치 모듈이니까 아파치를 리로드하거나 재기동 해야지 적용될듯하다.