저작권 안내: 저작권자표시 Yes 상업적이용 No 컨텐츠변경 No

스프링5 입문

JSP 2.3

JPA 입문

DDD Start

인프런 객체 지향 입문 강의

클라우드 서버에 실수로 용량이 큰 이미지 파일을 올리면 과도한 트래픽 발생으로 높은 비용을 지불할 수도 있다. 이런 상황을 방지하는 방법 중 하나는 아파치 웹 서버 설정에서 응답 파일의 크기를 제한하는 것이다. 아파치 웹 서버에서는 RewirteCond에서 filesize() 식을 사용해서 특정 크기보다 큰 파일에 대한 접근을 거부할 수 있다. 다음은 <Directory> 설정은 1 MB(1048576 바이트) 큰 파일에 접근할 때 403 상태 코드를 응답하도록 설정한 예이다.


<Directory /var/www/html/images/>

  RewriteEngine On

  RewriteCond expr "filesize('%{REQUEST_FILENAME}') -gt 1048576"

  RewriteRule .* - [F]

</Directory>


참고로 filesize()를 이용한 설정은 아파치 2.4부터 지원한다.

Posted by 최범균 madvirus

댓글을 달아 주세요

이클립스에서 톰캣 서버를 구동하다보면 아래 그림과 같이 "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)" 글을 참고한다.



Posted by 최범균 madvirus

댓글을 달아 주세요

  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 파일을 설정했다면 다시 톰캣을 구동해보자. 설정 전보다 빠르게 구동되는 것을 확인할 수 있을 것이다.


Posted by 최범균 madvirus

댓글을 달아 주세요

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 파일이 생성된 것을 확인할 수 있다.


Posted by 최범균 madvirus
TAG 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> 




Posted by 최범균 madvirus

댓글을 달아 주세요

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로 변경하면 된다.

Posted by 최범균 madvirus

댓글을 달아 주세요

  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 를 실행해보자. 아래 이미지와 비슷한 화면이 출력되면 정상적으로 실행된 것이다.





Posted by 최범균 madvirus

댓글을 달아 주세요

  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 이런 에러가 납니다

    문제가 뭔지,,,

  7. 질문자 2015.07.07 14:14 신고  댓글주소  수정/삭제  댓글쓰기

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

  8. 김수영 2015.08.12 22:28 신고  댓글주소  수정/삭제  댓글쓰기

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