반응형


톰캣(tomcat)의 기본포트가 8080인 이유를 아시나요???


많은 분들이 WAS로써 톰캣(tomcat)을 사용하실텐데요. 


특히나 요즘은 스프링부트로 인한 임베디드 톰캣을 사용하실줄로 압니다.


톰캣도 그렇고 스프링부트의 임베디드 톰캣도 그렇고 그럼 왜 기본 디폴트 포트는 8080이냐???하는 의문이 생길 수도 있는데요...(저는 그랬습니다...)


간단히 설명을 드리자면 리눅스나 유닉스는 1024이하의 포트(well-known port)들은 일반 유저 권한에서 바인딩 할 수 없도록 되어 있습니다.


이유는 보안때문인데요~!



8080포트에 대한 특별한 이유는 없습니다. 그저 1024이상의 포트중 하나를 임의로 디폴트로 설정한 것 일뿐(이라고 저는 생각합니다.)


하지만 외부 서비스를 해야하는경우에는 80포트로의 접근이 필요한 경우가 있습니다.


단순히 naver.com:8080이라고 사용자들이 접속하게 된다면 불편할테니까요...


그래서 루트권한(sudo)로 톰캣 포트를 80으로 설정 후 어플리케이션을 기동시켜서 사용할 수 는 있습니다.


다만! 위에서 말씀드렸듯 보안 문제가 존재합니다.


애드센스 자동삽입 광고


톰캣서버는 구동시에 tomcat 유저 권한으로 구동되게 됩니다. 때문에 톰캣을 통해 서비스되는 웹을 통해 해킹이 되더라도


tomcat유저 권한에 해당하는 부분까지만 접근 가능하게 됩니다.


따라서 루트권한(sudo)로 80포트로 구동시키게 된다면 해킹당했을 경우보단 안전하다고 할 수 있습니다.




물론 이런 문제를 회피하는 방법은 iptables를 통한 포트포워딩 방식이나 WAS앞단에 웹서버(apache, nginx)를 둬서 해결할 수 있지만


저 경험상에 의해서 iptables를 통해 포트포워딩을 할 경우 문제가 있었던 경험이 있기에 톰캣 80포트 8080 포트로 포워딩 이슈 


앞단에 웹서버를 두시고 서비스하는 방법이 좋다고 생각합니다.

반응형
반응형

톰캣은 웹 애플리케이션을 어떻게 관리하는가?


톰캣은 한 번에 여러 개의 웹 애플리케이션을 실행할 수 있도록 설계되어 있다.

웹 애플리케이션은 배포 명세서 web.xml을 가진 WAR 파일로 정의되어 있다. 대개 서버는 하나의 톰캣 인스턴스를 실행하며 관련된 WAR 파일이 톰캣 인스턴스의 webapps 디렉터리에 설치된다. 이는 기본 설정이며 위치를 변경할 수 있다.


톰캣의 구성 요소들

톰캣은 몇 가지 구성 요소로 이루어져 있는데, 그중 하나가 서블릿 컨테이너와 JSP를 처리하는 것이다. 서블릿 컨테이너 구성 요소는 카탈리나(Catalina)라고 하며 JSP 구성 요소는 재스퍼(Jasper)라고 한다.


톰캠 사용 문서를 읽다 보면 이 이름들에 대한 참조를 쉽게 볼 수 있다. 예를 들어 결과 로그 파일의 기본 이름은 catalina.out이고, 톰캣 홈 디렉터리의 환경 변수는 $CATALINA_HOME이다.


기본으로 실행 중인 톰캣 인스턴스는 webapps 디렉터리에서 일어난 변화를 감지한다. 새 WAR 파일이 이 디렉터리에 저장되면 톰캣은 WAR 파일 이름에 대응하는 디렉터리에 파일 내용을 풀어놓고 컨텍스트의 애플리케이션을 해당 이름에 대응시킨다.


예를 들어 BookingApplication.war라는 WAR파일을 webapps 디렉터리에 배포하면 그 파일은 BookingApplication 디렉터리에 압축을 푼다. 톰캣은 WEB-INF 하위에 있는 web.xml 파일을 읽고 정의된 대로 애플리케이션을 실행하고 /BookingApplication 경로를 통해 클라이언트에게 제공한다.


이 접근 방법은 개발 방향을 빠르게 전환하는 데 상당히 유용하다. 지속해서 배포 할 수 있는 방법을 갖게 할 뿐만 아니라 접근할 수 있는 서버에 단위 테스트를 완료해 빌드된 WAR 파일을 자동으로 배포할 수 있으며 통합 테스트를 준비할 수 있기 때문이다. 테스트 범위가 충분하고 팀의 개발 프로세스가 가능하다면 실제 환경에도 자동으로 배포되게 할 수 있다.


# Reference - 자바프로그래밍 면접 이렇게 준비한다.

반응형
반응형

 


 안녕하세요. 이번에는 최근에 읽은 '아파치 톰캣 7 따라잡기' 책에 대해 정리를 해보도록 하겠습니다. 처음에 회사에 왔을 때 아파치, 톰캣에 대한 지식이 많이 부족해 어려움들을 많이 겪었는데요. 서점에서 우연히 책을 보다가 해당 책의 제목을 발견하고 여전히 부족한 지식을 채우는데 도움이 될 것같아 일치의 망설임 없이 사서 읽게 되었습니다. 읽은지는 한 달정도 됬는데 한 번 읽고 넘기니 내용이 금방 가물가물 해지더라구요. 이참에 정리도 해놓고 틈틈히 보도록 해야겠다는 마음에 정리를 하게 되었습니다.


# 제가 몰랐던 내용이나 좀 더 확고히 하고 싶은 내용들에 대해서만 정리하기에 일목요연하지 못한점 양해 부탁드립니다.


ˇ 톰캣 bin 디렉터리에는 version.sh라는 스크립트가 있는데, 이 스크립트를 이용해 톰캣 버전과 시스템 정보를 확인할 수 있다. 

 


˚ 스크립트 설정 변경을 확인할 수 있도록 아주 유용한 스크립트 configtest.sh도 제공(톰캣 bin 디렉터리) 한다. configtest.sh 스크립트는 시스템 설정을 검토하고 에러를 찾아낸다. 


˚ 톰캣 설정파일인 conf 내부의 파일들에 대해 알아보자

  - catalina.policy : 톰캣 7의 보안 정책 권한을 설정하는 파일. JVM이 웹 애플리케이션에 어떤 보안 정책 권한을 적용할지를 결정한다.

  - catalina.properties : 이 파일은 서버를 시작할 때 검색하는 서버, 공유로더, JAR 등의 공유 정의를 포함한다.

  - server.xml : 톰캣의 중요 설정 파일 중 하나로 IP 주소, 포트, 가상 호스트, 컨텍스트 경로 등과 같은 중요 정보를 포함한다.

  - tomcat-users.xml : 역할에 기반한 정의에 따라 인증, 승인에 사용하는 파일이다. 이 파일은 데이터베이스의 사용자/암호/역할을 이용한 인증과 컨테이너로 관리되는 보안 구현에 사용된다. 이 파일을 고쳐서 사용자를 추가/삭제하거나 기존 사용자에 역할을 할당/비할당할 수 있다.

  - logging.properties : 톰캣 인스턴스의 로깅 프로퍼티(스타트업 로그 같은)를 정의한다.

  - web.xml : 톰캣 인스턴스가 시작될 때 모든 애플리케이션(톰캣 인스턴스로 로딩되는)의 기본 값을 정의한다. 웹 애플리케이션의 자신만의 배포 디스크립터를 포함하면 기본 디스크립터의 설정을 애플리케이션의 디스크립터의 설정으로 바꾼다.

  - context.xml : 애플리케이션을 실행할 때 이 파일의 내용을 로드한다. context.xml에는 세션 저장, 코밋 연결 추적 등과 같은 설정 파라미터가 있다.


˚ JDBC : 자바 데이터베이스 연결 JDBC, Java Database Connectivity은 자바 기반 데이터베이스 접근 기술로 클라이언트가 서버 데이터베이스에 접근하는데 필요한 API를 제공한다. JDBC는 관계형 데이터베이스에 맞게 만들어졌으며 데이터베이스 질의, 갱신 기능을 제공한다.


˚ JNDI : 자바 네이밍과 디렉터리 인터페이스 JNDI, Java Naming and Directory Interface 서비스는 자바 프로그래밍 언어를 사용해 만들어진 애플리케이션에 네이밍, 디렉터리 기능을 제공하는 자바 플랫폼 API다.


˚ DataSource : JDBC API를 이용해 관계형 데이터베이스에 접근할 때 사용하는 자바 객체다. 


˚ 톰캣의 배포, 설정 과정에서 흔히 발생하는 문제

  1. 

  [ 문 제 ] 


 ˚  사용자가 애플리케이션을 배포한 다음에도 여전히 예전 코드가 보인다고 불평


  [ 해결과정 ] 


 ˚  doc 베이스의 파일이 최근 파일인지 확인한다.


 ˚  톰캣 7의 logs 디렉터리에 있는 catalina.out을 통해 특정 WAR 파일명이 배포되었는지 확인한다


 ˚  이전 두 가지 모두 확인했는데도 문제가 해결되지 않으면 톰캣 서비스를 중지하고 다음 명령어를 이용해 work/Catalina/localhost 디렉터리에 있는 temp 디렉터리의 컨텐츠를 삭제한다. work/Catalina/localhost 디렉터리에 는 temp 디렉터리의 컨텐츠를 삭제한다.


cd /opt/tomcat/temp

rm -rf ../temp/*


cd /opt/tomcat/work/Catalina/localhost/

rm -rf ../localhost/*
 

 ˚ 톰캣 서비스를 재시작하고 사용자에게 다시 애플리케이션을 확인하도록 한다.



  2.

  [ 문 제 ] 


 ˚ 사용자가 한 노드에서는 현재 배포된 코드를 볼 수 있지만 다른 노드에서는 여전히 예전 코드가 표시된다고 불평


 [ 해결과정 ]


 ˚ doc 베이스의 파일이 최근 파일인지 확인한다.


 ˚ 톰캣 7의 logs 디렉터리에 있는 catalina.cout을 통해 특정 WAR 파일명이 배포되었는지 확인한다.


 ˚ 이전 두 가지 모두 확인했는데도 문제가 해결되지 않으면 node2의 톰캣 서비스를 중지한다. node1의 코드를 복제하도록 설정하고 다음 명령어를 이용해 work/Catalina/localhost 아래의 temp 디렉터리의 컨텐츠를 삭제한다. 


cd /opt/tomcat/temp

rm -rf ../temp/*


cd /opt/tomcat/work/Catalina/localhost/

rm -rf ../localhost/*


 ˚ 톰캣 서비스를 재시작하고 사용자에게 애플리케이션을 확인하도록 한다. 또한 node1과 node2가 복제 모드로 동작하는지 데이터베이스 상태를 확인한다.

 ˚ 양쪽 노드에서 데이터베이스에 연결한다.


  3.

  [ 문 제 ]

 ˚ server.xml을 고친 이후로 톰캣 인스턴스가 실행되지 않는 현상이 발생했다.


  [ 해결 과정 ]


 ˚ 톰캣 bin 디렉토리로 이동한다.


 ˚ configtest.sh를 실행한다.


 ˚ 출력된 내용들 중에 에러 메시지를 보면 톰캣이 이미 실행 중임을 알 수 있다. 따라서 웹 서버를 중지하고 temp 디렉터리를 비운다.


 ˚ 서비스를 다시 시작한다.




˚ 톰캣 7의 커넥터 종류 


 : 커넥터란 요청을 수락하고 응답을 리턴하는 교차점을 가리킨다. 톰캣에는 자바 HTTP 커넥터, 자바 AJP 커넥터, ARP(HTTP/AJP) 커넥터 세 가지 종류의 커넥터가 있다. 애플리케이션은 자신의 요구사항에 맞는 커넥터를 사용한다.


 1. 자바 HTTP 커넥터 


 : HTTP 프로토콜을 기반으로 하는 자바 HTTP 커넥터는 HTTP/1.1 프로토콜만 지원한다. 톰캣은 자바 HTTP 커넥터를 이용해 독립형standalone 웹 서버로 동작 할 수 있으며, jsp/서블릿 호스트 기능도 제공할 수 있다.



 2. 자바 AJP 커넥터


 : 자바 AJP 커넥터는 AJP(아파치 JServ 프로토콜)와 AJP를 통한 웹 서버 통신을 기반으로 한다. 자바 서블릿 컨테이너를 인터넷에 노출하고 싶지 않을 때 AJP 커넥터를 사용(다른 프론트엔트 서버를 이용)하며 톰캣 7에서 SSL 터미네이션을 처리하지 않는 상황이라면 AJP 커넥터를 매우 유용하게 활용할 수 있다. AJP 구현 예제로 mod_jk, mod_proxy 등이 있다.



 3. APR(AJP/HTP) 커넥터


 : ARP(Apache Portable Runtime)은 확장성, 성능, 다른 웹 서버와의 협력 작업 상황에서 능력을 발휘한다. 



 

오늘 정리는 여기서 마치도록 하고 정리 하지 못한 내용은 part.2로 포스팅하도록 하겠다.



반응형
반응형

 


 월 초(15.01)에 현재 팀에 분산 되어 있는 빌드 및 CI 서버 통합 작업을 진행하였다. 이번 포스팅은 서버 통합 작업을 하다가 발생한 java.lang.OutOfMemoryError: PermGen space문제에 대해 알아보도록 하겠다. 먼저 첫 번째로 문제가 발생한 현상에 대해 살펴보고 둘 째, 어떻게 해결했는지 살펴보고 마지막 셋째, java.lang.OutOfMemoryError: PermGen space에 대해 자세히 알아보자.



 1. 서버 작업 중 발생한 현상


 기존 서버에서 빌드 되는 프로젝트들도 많았지만 (약 50개 정도) 해당 부분에 대해서는 많은 문제가 되지 않았다. 왜냐하면 여러 프로젝트(10개 이상)가 동시에 빌드 작업을 진행하는 경우는 제로에 가까웠기 때문이다. 문제는 특정 소스코드가 수행되었을 때 자동으로 빌드되 commit_build와 특정 시간 간격마다 수행되게 하는 배치 빌드 등을 추가하면서 부터 발생하였다. 처음에는 서버 통합작업을 잘 진행하고 있었는데 어느 순간 부터(c_build, i_build)가 여러 개 추가되는 시점부터 서버가 뻗어버리는 현상이 발생하였다. 


 


 다음 그림과 같이 java.lang.OutOfMemoryError: PermGen space 에러가 발생한 것을 볼 수 있다. 이로 인해 서버가 뻗어 버리는 현상이 주기적(약1시간 간격)으로 나타났다. 그래서 일차적으로 주기적으로 빌드 되는 프로젝트들에 대해 주기적으로 빌드 되지 않도록 작업하였다.



  2. 해결한 방법

먼저 해결책을 말하자면 해당 서버의 톰캣/bin catalina.sh 에 들어가서 밑의 그림과 같이 추가해주었다.

 

그림이 잘 안보인다 ㅠㅠ 아무튼

 JAVA_OPTS="-server -Xms2048m -Xmx2048m -XX:MaxPermSize=512m -XX:-UseConcMarkSweepGC"

를 선언해주어 해결하였다. (기존에는 -XX:MaxPermSize가 선언되어 있지 않았다. (기본 20m로 설정되있다고 한다)


# -XX:+UseConcMarkSweepGC

 // 표준 garbage collector가 아닌 perm gen도 gc하는 concurrent collector를 사용하도록 한다.


-XX:+CMSPermGenSweepingEnabled

 // perm gen 영역도 gc의 대상이 되도록 한다.


-XX:+CMSClassUnloadingEnabled

// 클래스 데이타도 gc의 대상이 되도록 한다.


# -XX:MaxPermSize=64m

// 어느정도 크기가되어야 gc가 자주 발생하지 않는다. 기본값이 8M인듯.




  3. java.lang.OutOfMemoryError: PermGen space 관련 정보들에 대해 알아보자. (두서 없이 정리됨을 양해바람)


# java.lang.OutOfMemoryError: PermGen space문제는 기본적으로 동적 클래스를 많이 사용할 경우 빈번히 발생하는 문제로 JSP->SERVLET 변화. SPIRNG에서의 동적 클래스를 많이 사용하는 프레임워크로 인해 발생한다.


# JVM이 새로운 클래스 정의를 로드해야 하는데 이를 수행하기 위한 PerGen 공간이 충분하지 않아 발생한다. 즉, 이미 너무 많은 클래스들이 로딩되어 있으며 서버가 현재 크기의 PermGen이 처리할 수 없을 만큼 많은 클래스들을 사용하고 있기 때문이기도 하다. 


# 보통 Java heap이나 힙의 특정 영역에 객체를 할당 할 수 있는 공간이 충분하지 않을 때 발생


# PermGen space 라는 메시지는 permanent generation 이 가득 찬 상태라는 것을 알려준다. permanent generation은 클래스와 메쏘드 객체가 저장되는 힙의 영역을 나타낸다. 어플리케이션이 많은 수의 클래스를 로드하면, -XX:MaxPermSize 옵션을 사용하여 permanent generation의 크기를 증가시킬 필요가 있다. 


# 보통 톰캣을 사용하다가 이 에러를 보았다면 대체로 웹 어플리케이션을 너무 많이 Update 하거나 Reload 한 것이 원인이 될 수 있다. 톰캣과 JVM은 웹 어플리케이션을 삭제하고 다시 생성할 때 할당한 모든 메모리를 해제하지는 않는다. 톰캣을 여러 번 리로드 하면 할당된 메모리가 바닥나서 동작하지 않게 된다. 


# 톰캣에서 이 에러가 발생했을 경우 해결 방법은 1. 톰캣을 재시작 하는 것(임시적으로 해결) 2. 톰캣이 할당할 수 있는 메모리를 늘려 준다. 3. 메모리 누수가 발생하지 않도록 톰캣을 설정 (불필요한 프로젝트 들이 로딩되지 않도록 정리)


# Heap은 프로그램이 돌아가는 도중에 생성 삭제되는 곳으로 garbage-collected가 일어나는 곳이며 Permenant는 프로그램이 끝날 때까지 영원히 메모리를 차지하고 있는 공간으로 garbage-collected가 일어나지 않는 곳이다. Heap에는 동적으로 생기는 메모리 들이 들어가는 곳이고, Permenanat는 Class names, Internalized strings, Objects 등이 들어가며 PermGen도 이곳에 해당한다. 


참조 :

http://mindasom.tistory.com/96

http://jwchoi85.tistory.com/155#recentComments





반응형

+ Recent posts