주요글: 도커 시작하기

이클립스에서 톰캣 서버를 구동하다보면 아래 그림과 같이 "Server Tomcat Server at localhost was unable to start within 45 seconds" 메시지가 뜨면서 톰캣 서버 실행에 실패할 때가 있다.



이 경우 이클립스의 톰캣 서버 실행 제한 시간을 늘려주거나 실행 시간에 영향을 주는 원인을 제거하면 된다. 이 글에서는 실행 시간을 늘려주는 방법을 설명한다.


먼저 이클립스의 [Window] -> [Show View] -> [Other] 메뉴를 실행한 뒤에 Server/Servers 뷰를 선택하고 오픈한다. Servers 뷰에서 서버를 더블 클릭하면 아래와 같이 편집 영역에 서버 설정 정보가 보인다.



서버 설정 정보에서 Timeouts을 클릭하면 아래 그림과 같이 설정 시간을 변경할 수 있는데 여기서 Start 항목의 시간을 늘려준 뒤 저장(CTRL + S)하면 된다.



톰캣 구동 시간 자체를 줄이는 방법 중 하나로 jar 파일 스캔 제외처리가 있는데 이에 대한 내용은 "Jar 파일 스캔 제외로 톰캣 시작 시간 단축(http://javacan.tistory.com/475)" 글을 참고한다.



  1. sweet 2018.02.27 14:58

    저 같은경우엔 항상 999로 설정해 두는데 프로그램 마다 엄청 무거운것들이 있어서 구동되는데만 5분 이상 걸리니 여유롭게 쓸 수 있더라고요.
    근데 이 시간이 이렇게 999 길게 걸어두었을 때 문제가 되는 부분이 있을까요?
    단순히 시간제한에 대한 설정으로 timeout만 걸리지 않는걸까요?

    • 최범균 madvirus 2018.02.28 10:34 신고

      999초면 15분 이상으로 잡은거네요. 다소 길게 느껴지긴 합니다. 근데 이 시간은 이클립스의 톰캣 구동 시간 타이아웃이니까 길게 잡는다고 문제가 될 건 없어 보입니다.
      실제 구동 시간이 5분 이상 걸리는 점이 문제가 될 순 있을 것 같아요.

톰캣 구동 속도에 영향을 주는 것은 jar 파일 탐색이다. 톰캣은 기본적으로 다음의 두 가지를 위해 jar 파일의 클래스나 자원을 스캔한다.

  • 특정 애노테이션을 가진 클래스 검색
  • TLD 파일

위 내용과 상관없는 jar 파일을 스캔 대상에서 제외하면 톰캣 구동 속도가 그만큼 빨라진다.


대상 jar 파일을 찾기 위한 로깅 설정


톰캣을 구동할 때 로그에 아래와 같은 메시지가 출력될 때가 있다.


org.apache.jasper.servlet.TldScanner.scanJars At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.


이 메시지는 웹 어플리케이션에 포함된 jar 파일을 탐색하는데 해당 jar 파일에 커스텀 태그와 관련된 TLD 파일이 없을 때 발생한다. TLD 파일이 없는 jar 파일을 탐색하는 건 시간 낭비이므로 TLD 파일 검색 대상에서 해당 jar 파일을 제외하면 톰캣 시작 시간을 줄일 수 있다.


추가로 웹 어플리케이션과 관련된 애노테이션을 붙인 클래스가 없는 jar 파일을 검색하는 것 역시 톰캣 구동 시간을 느리게 만드므로 이런 jar 파일도 검색 대상에서 제외하면 톰캣 시작 시간을 줄일 수 있다.


이 두 종류의 jar 파일을 찾아내기 위해 [톰캣]/conf/logging.properties 파일에 TLD 관련 로그 레벨을 FINE으로 바꾼다.


# logging.properties 파일 하단에 추가


# 탐색하는 jar 파일 목록 출력

org.apache.catalina.startup.ContextConfig.level = FINE

# TLD 관련 로그 출력

org.apache.jasper.servlet.TldScanner.level = FINE


톰캣을 재시작하면 아래와 같은 로그가 출력되는 것을 확인할 수 있다.


22-Feb-2018 13:25:52.781 미세 [localhost-startStop-1] org.apache.catalina.startup.ContextConfig.processAnnotationsJar Scanning jar file for class files with annotations [file:/C:/Java/jdk1.8.0_51/jre/lib/rt.jar]

...

...

22-Feb-2018 20:42:24.130 미세 [localhost-startStop-1] org.apache.jasper.servlet.TldScanner$TldScannerCallback.scan No TLD files were found in [file:/C

:/apache-tomcat-8.5.27/webapps/sp5-chap09/WEB-INF/lib/spring-expression-5.0.2.RELEASE.jar]. Consider adding the JAR to the tomcat.util.scan.StandardJarScanFilter.jarsToSkip property in CATALINA_BASE/conf/catalina.properties file.


애노테이션 스캔 대상 jar 파일과 TLD 파일이 없는 jar 파일을 확인하고 [톰캣]/conf/catalina.properties 파일에 탐색 생략 대상으로 추가한다. 아래 코드는 JDK의 rt.jar 파일과 spring 관련 jar 파일을 생략 대상에 추가한 예이다.


tomcat.util.scan.StandardJarScanFilter.jarsToSkip=\

bootstrap.jar,commons-daemon.jar,tomcat-juli.jar,\

...생략

xom-*.jar,\

rt.jar,\

spring-*.RELEASE.jar


tomcat.util.scan.StandardJarScanFilter.jarsToScan=\

log4j-web*.jar,log4j-taglib*.jar,log4javascript*.jar,slf4j-taglib*.jar,\

spring-webmvc-*.jar



위 코드에서 tomcat.util.scan.StandardJarScanFilter.jarsToScan 속성(검색 대상)에 spring-webmvc-*.jar 를 추가했는데 이는 spring-webmvc 모듈에 스프링이 제공하는 커스텀 태그와 관련된 TLD 파일이 포함되어 있기 때문이다. spring-webmvc 모듈을 검색 대상에 넣지 않으면 <spring:message>와 같이 스프링이 제공하는 커스텀 태그를 사용할 수 없게 된다.


이클립스에서는 다음과 같이 Servers 프로젝트의 catalina.properties 파일을 수정하면 된다.




catalina.properties 파일에 검색 대상 jar 파일을 설정했다면 다시 톰캣을 구동해보자. 설정 전보다 빠르게 구동되는 것을 확인할 수 있을 것이다.


  1. 윤하민 2019.04.24 14:46

    감사합니다 덕분에 훨씬 빨라졌어요

RPM

kafka를 yum 리포지토리에 올려 설치해야 할지 몰라 kafka를 rpm으로 만드는 과정을 정리해 본다.


먼저, rpmbuild 도구가 필요하니 없다면 yum으로 설치한다.


$ sudo yum install rpmbuild


rpm을 생성할 때 사용할 기준 디렉토리를 생성한다. 여기서는 /vagrant/rpmbuild-kafka라고 가정한다. 다른 경로를 사용해도 무방하다.


/vagrant/rpmbuild-kafka 디렉토리에 kafka 파일인 kafka_2.11-0.9.0.0.tgz를 복사한다.


다음으로 rpmbuild가 스펙으로 사용할 kafka.spec 파일을 /vagrant/rpmbuild-kafka 폴더에 작성한다. 옵션에서 %define으로 _topdir을 설정하고 있다. 이 설정을 하지 않으면 ~/rpmbuild를 기준으로 동작하는데, 여기서는 rpmbuild를 사용할 디렉토리의 rpmbuild 디렉토리를 기준으로 잡기 위해 _topdir을 설정했다.


%define _topdir %(echo $PWD)/rpmbuild


Name:           kafka_2.11

Version:        0.9.0.0

Release:        0

Summary:        A kafka package


Group:          Development

License:        Apache

URL:            http://kafka.apache.org/

Source0:        kafka_2.11-0.9.0.0.tgz

BuildRoot:      %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX)

BuildArch: noarch


BuildRequires:  /bin/rm, /bin/mkdir, /bin/cp

Requires:       /bin/bash


%description

 A kafka package


%prep

%setup -q



%build


#configure

#make %{?_smp_mflags}


%install

rm -rf $RPM_BUILD_ROOT

#make install DESTDIR=$RPM_BUILD_ROOT

mkdir -p $RPM_BUILD_ROOT/home/hadoop/servers/kafka

cp -R * $RPM_BUILD_ROOT/home/hadoop/servers/kafka


%clean

rm -rf $RPM_BUILD_ROOT


%files

%defattr(-,hadoop,hadoop,-)

#%doc


%attr(0755,hadoop,hadoop)/home/hadoop/servers/kafka


%changelog

* Wed Jan 12 2016 Kafka - 0.9.0.0

- Initial RPM


매번 명령어를 입력하면 귀찮으니, 명령을 실행할 build.sh을 /vagrant/rpmbuild-kafka에 작성한다.


rm -rf rpmbuild

mkdir rpmbuild

pushd rpmbuild

mkdir BUILD RPMS SOURCES SPECS SRPMS

popd


cp kafka_2.11-0.9.0.0.tgz rpmbuild/SOURCES/

cp kafka.spec rpmbuild/SPECS/


rpmbuild -ba rpmbuild/SPECS/kafka.spec


이제 build.sh 파일을 실행한다. 그러면 rpmbuild/RPMS/noarch/kafka_2.11-0.9.0.0-0.noarch.rpm 파일이 생성된 것을 확인할 수 있다.


타 부서에서 이미지 서버로 사용할 장비가 필요하다 해서 다음과 같이 설정했다.

  • 이미지 업로드용 계정 생성 : imageuser
  • 해당 계정의 /images 경로 생성 : /home/imageuser/images
  • 아파치 httpd로 이미지 경로 설정 : /home/imageuser/images
  • imageuser 계정은 ssh 접근 막음
  • imageuser 계정으로 sftp 연결하면, /home/imageuser 를 루트 디렉토리로 인식함
과정을 정리해보면 다음과 같다.

1. imageuser 계정 생성

계정을 생성하고 암호를 설정한다.

$ useradd imageuser
$ passwd imageuser

2. 업로드할 파일을 보관할 디렉토리 생성

imageuser 계정으로 로그인한 뒤 /home/imageuser에 images 디렉토리를 생성한다.

$ su imageuser
$ cd ~
$ mkdir images

3. sshd_config 설정

/etc/ssh/sshd_config 파일의 설정을 변경하고 sshd를 재시작한다.

# imageuser 계정이 sftp로 연결할 수 있게
Subsystem       sftp    internal-sftp

# imageuser 계정이 sftp로 연결한 경우, /home/imageuser를 루트디렉토리로 인식하게 설정
Match User imageuser
        ForceCommand internal-sftp
        ChrootDirectory /home/imageuser

위 설정에서 ChrootDirectory 설정은 /home/imageuser를 루트 디렉토리로 인식하도록 설정한다.

4. 홈디렉토리를 root 소유로 변경하고 접근 권한 변경

Chroot를 적용하기 위해 /home/imageuser를 root 소유로 변경하고 접근 권한을 755로 변경한다.

$ chown root:root /home/imageuser
$ chmod 755 /home/imageuser

http://lists.mindrot.org/pipermail/openssh-unix-dev/2009-May/027651.html

5. imageuser 계정 쉘 접근 차단

/etc/passwd에서 imageuser 계정의 쉘을 /sbin/nologin으로 바꾼다.

imageuser:x:501:501::/home/imageuser:/sbin/nologin


6. sftp로 연결해서 확인

sftp로 연결해서 디렉토리를 확인해보면 /home/imageuser 디렉토리를 루트 디렉토리로 인식하는 것을 알 수 있다.

$ sftp imageuser@imageserver.mycompany.com
imageuser@imageserver.mycompany.com's password: 암호입력
sftp> ls -la
drwxr-xr-x    3 0        0            4096 Jun 17 03:56 .
drwxr-xr-x    3 0        0            4096 Jun 17 03:56 ..
....생략
drwxrwxr-x    4 501      501          4096 Jun 17 08:03 images
sftp> pwd
Remote working directory: /
sftp> 




CentOS 6의 yum 리포지토리에 포함된 MySQL 버전은 5.1이다. 그래서 yum을 이용해서 MySQL 5.5 버전을 설치하려면 별도 작업을 해 주어야 한다. 이 글에서는 두 가지 방법을 소개한다.


1. Webtatic Yum 리포지토리 사용


아래 명령어를 리포지토리를 추가해 준다.


$ rpm -Uvh http://mirror.webtatic.com/yum/el6/latest.rpm


기존에 mysql을 설치했다면, 제거한다.


MySQL 5.5 버전은 다음과 같이 설치한다.


$ yum install mysql55w mysql55w-server


이전 방식이 mysql55w와 같이 다른 이름을 사용하는데, mysq55w-libs 모듈이 설치된 상태에서 mysql-libs를 필요로 하는 모듈을 설치하려면 에러가 발생할 수 있다. 5.5 버전을 mysql55w가 아니라 mysql을 사용해서 설치하고 싶다면 Remi 리포지토리를 이용하면 된다.


2. Remi Yum 리포지토리 사용


다음과 같이 Remi 리포지토리를 추가한다.


## Remi Dependency on CentOS 6 and Red Hat (RHEL) 6 ##

rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm

 

## CentOS 6 and Red Hat (RHEL) 6 ##

rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm


MySQL 5.5 설치는 다음과 같이 진행한다.


$ yum --enablerepo=remi,remi-test install mysql mysql-server


--enablerepo 옵션을 사용하는 건 remi 리포지토리가 기본적으로 비활성화되어 있기 때문인데, 이를 활성화시키고 싶다면 /etc/yum.repos.d/remi.repo 파일에서 [remi]와 [remi-test]의 enabled 값을 1로 변경하면 된다.

  1. 낭객 2015.02.27 15:42

    yum --enablerepo=remi,remi-test install mysql mysql-server

    install 명령이 빠져서 설치가 실패합니다.

    위처럼 수정 해주시면 될 것 같네요.

    수고하세요 :)

PHP를 이용해서 프로젝트를 할 가능성이 높아져서, 로컬에 PHP 개발을 시작할 수 있는 가장 기본적인 환경을 구축해봤다. PC가 윈도우 7이어서 이를 기준으로 정리한다.


아파치 웹 서버 설치


PHP를 실행하기 위한 웹 서버를 설치하는데 여기서는 아파치를 설치한다. 이 글을 쓰는 시점에 윈도우용 인스톨 버전은 2.2.25 버전이 나와 있다. (2.4 버전은 아직 윈도우용 인스톨 버전이 없다.) http://httpd.apache.org/download.cgi 사이트에서 httpd_2.2.25-win32-x86-openssl-0.9.8y.msi 파일(이름은 버전에 따라 다르다) 을 다운로드 받은 후 실행하면 설치가 진행된다.


설치 디렉토리를 변경하지 않으면 C:\Program Files\Apache Software\Apache2.2 디렉토리에 설치된다. 64비트 윈도우인 경우에는 C:\Program Files (x86)\Apache Software\Apache2.2 에 설치된다.


PHP 다운로드


다음으로 할 작업은 PHP를 다운로드 받아 설치하는 것이다. 설치 과정이라고 해서 대단한 건 없고, 파일을 다운로드 받아 압축만 풀면 된다.http://windows.php.net/download 에서 다운로드 받으면 되는데, 현 시점에서 아파치 2.2 버전에 맞는 윈도우 PHP 버전은 5.4.17 버전이기에 이 글에서는 이 버전의 파일인 php-5.4.17-Win32-VC9-x86.zip 를 다운로드 받았다. 이 파일의 압축을 알맞은 곳에 푼다. 여기서는 c:\devtool 에 풀었다고 가정하고 설정 부분을 진행한다.


php 파일 설정


php 설정 파일인 php.ini 파일을 다음의 두 곳 중에 한 곳에 생성해준다.

  • c:\windows
  • 아파치설치디렉토리

개발용 php.ini 파일은 php 압축을 푼 디렉토리에 포함되어 있는 php.ini-development 파일을 복사해서 사용하면 된다.


php가 확장 기능을 사용할 수 있도록 php.ini 파일에서 extension 경로를 알맞게 지정해 준다.


; On windows:

; extension_dir = "ext"

extension_dir = "C:\devtool\php-5.4.17-Win32-VC9-x86\ext"


...

...

extension=php_mysqli.dll <-- MySQL을 사용하려면 아래와 같이 주석 제거

extension=php_mysqli.dll



아파치 웹 서버 설정


PHP를 설치했으므로 그 다음으로 할 작업은 아파치 설정에 PHP 연동 부분을 추가해주는 것이다. 아파치 설치 디렉토리의 conf\httpd.conf 파일을 열어서 아래 줄을 추가한다.아래 설정에서 주의 할 점은 LoadModule 설정에서 파일 경로를 지정해 줄 때 \ 대신 / 를 사용한다는 점이다.


LoadModule php5_module "C:/devtool/php-5.4.17-Win32-VC9-x86/php5apache2_2.dll"


AddType application/x-httpd-php .php


설정이 올바르게 되었는지 확인하기 위해 명령행 프롬프트를 열고 아파치 설치 디렉토리로 이동한 뒤에 "httpd -t"  명령어를 실행하자. 이 명령어를 실행했을 때 Syntax OK 가 출력되면 설정이 올바르게 된 것이다.


c:\>cd [아파치설치디렉토리]\bin

c:\...\bin> httpd -t

Syntax OK


테스트


이제 남은 작업은 php를 작성해서 올바르게 동작하는지 확인해보는 것이다. 아래 파일을 [아파치디렉토리]\htdocs 디렉토리에 test.php 파일로 작성하자.


<?php

 

phpinfo();

 

phpinfo(INFO_MODULES);

 

?>


웹 브라우저를 열고 http://localhost/test.php 를 실행해보자. 아래 이미지와 비슷한 화면이 출력되면 정상적으로 실행된 것이다.





  1. 고슴도치 2013.07.31 14:12

    xampp 쓰시면 apache, php, mysql... 무려 xdebug 까지 한방에 설치 되용 ^^

    • 최범균 madvirus 2013.07.31 14:43 신고

      현재는 로컬에 아파치, 톰캣, MySQL이 이미 설치되어 있어서 php만 따로 설치하느라 이렇게 했는데요, OS 다시 설치할 때, 이 패키지를 써 봐야 겠네요. 좋은 정보 고맙습니다.

  2. 오유경 2014.04.28 15:52

    Syntax OK
    까지 떴는데도

    http://localhost/test.php 를 실행하면
    test.php소스만 보이네요..왜이럴까요..

  3. 오유경 2014.04.28 16:11

    오..껐다가 다시 시작했더니 됐어요 감사합니다.

  4. 오유경 2014.05.08 09:34

    담아갈게요~

  5. 최은우 2014.07.26 03:19

    감사합니다~~
    "php 설치"로 검색하다가 들어왔는데
    덕분에 쉽게 PHP 설치 완료했습니다. ^^

  6. ㅜㅜ 설치가 매우 힘드네요ㅜㅜㅜ 2014.09.18 23:45

    ㅜㅜ 설치가 매우 힘드네요ㅜㅜㅜ
    The requested operation has failed! 이런 에러가 뜨네요 ㅜㅜㅜ

    httpd.exe: Syntax error on line 37 of C:경로 httpd.conf: ServerRoot must be a valid directory 이런 에러가 납니다

    문제가 뭔지,,,

    • 최범균 madvirus 2014.09.23 09:23 신고

      설정 파일을 열어보면 ServerRoot 라는 설정이 있는데, 이 값에 지정한 디렉토리 경로가 올바르지 않아서 발생한 문제입니다.

  7. 질문자 2015.07.07 14:14

    syntex OK 메시지 까지 출력했는데 test.php 페이지를 못찾습니다 ㅜ

  8. 김수영 2015.08.12 22:28

    php 파일을 만들라는게 뭔소리인가요?? 그냥 텍스트로 만들고 .php 붙이면 되나요??

+ Recent posts