아파치(Apache)와 톰캣(Tomcat)
아파치(Apache):
- 아파치 소프트웨어 재단에서 만든 오픈 소스 `웹 서버(WS)`입니다.
- 정적인 웹 페이지를 처리하고, 클라이언트로부터의 HTTP 요청을 받아 해당 요청에 대한 응답을 제공합니다.
톰캣(Tomcat):
- `아파치 톰캣(Apache Tomcat)`이라고도 불리며, 자바 `웹 애플리케이션 서버(WAS)`입니다.
- JSP(Java Server Pages)와 서블릿(Servlet)과 같은 자바 기술을 사용하는 동적인 웹 애플리케이션을 실행하는 데 특화되어 있습니다. 웹 애플리케이션을 서비스하기 위해 필요한 자바 `서블릿 컨테이너`를 제공하며, HTTP 요청을 처리하고, JSP와 서블릿 코드를 실행합니다.
- 아파치 소프트웨어 재단에서 개발하고 있으며, 아파치와 연계하여 사용할 수 있습니다.
WS(Web Server)와 WAS(Web Application Server)
WS(Web Server):
정적인 컨텐츠(HTML, CSS, 이미지 파일 등) 제공과 요청 전달에 특화된 서버입니다. WS는 주로 HTTP 프로토콜을 사용하여 클라이언트와 통신하고, 클라이언트의 요청을 전달하는 역할을 수행합니다.
WAS(Web Application Server):
웹 서버와 달리 동적인 컨텐츠를 생성하고 처리하는 데에 중점을 두고, 다양한 기능과 서비스를 제공하여 웹 어플리케이션의 실행, 관리, 보안, 확장성 등을 지원합니다. WAS는웹 어플리케이션을 실행하기 위한 서블릿 컨테이너 등을 포함하고 있고, 데이터베이스 연동 및 데이터 조작 등의 동적인 처리를 담당합니다.
아파치 톰캣이라 부르는 이유?
톰캣은 WAS로서 Apache(WS)와 연동하여 동적인 웹 애플리케이션을 실행하고 관리할 수 있도록 설계되었습니다. Apache가 정적인 파일 제공과 요청 전달을 담당하면서 톰캣이 웹 애플리케이션 실행, 자바 서블릿 컨테이너, JSP 컨테이너 등을 담당하게 됩니다. 이러한 형태로 톰캣이 사용되기 때문에, `아파치 톰캣`이라고 부릅니다.
WS와 WAS를 같이 사용하여 웹 어플리케이션의 성능과 확장성을 향상시키는데 도움이 됩니다. 웹 어플리케이션을 구성할 때 WAS 만을 사용하는 것이 아니라 `정적인 컨텐츠`를 처리할 때 WS에 위임하므로 WAS의 부하를 줄일 수 있습니다. 또한 WS를 앞단에 두어 `로드밸런싱`을 통해 들어오는 요청을 여러 WAS로 분배하여 부하를 분산할 수 있고, 확장성이 좋아집니다. 그리고 WS를 통해 `보안` 설정 및 방화벽을 관리하여 보안을 높일 수 있습니다.
Tomcat 설치
Tomcat 다운로드 및 설치 방법
Apache Tomcat 공식 웹 사이트 https://tomcat.apache.org/
위 사이트에서 Tomcat 다운로드 링크에 들어가 환경에 맞게 다운로드 및 설치합니다.
환경 설정 및 포트 설정
환경 설정:
- {Tomcat 설치 디렉토리}/conf 폴더로 이동합니다.
- server.xml 파일을 편집기로 엽니다.
- 필요한 환경 설정을 변경합니다. 예를 들어, 포트 번호, 호스트 설정, SSL 설정 등을 변경할 수 있습니다.
포트 설정:
- server.xml 파일에서 Connector 요소를 찾습니다. 이 요소는 Tomcat이 클라이언트 요청을 처리하는 데 사용하는 포트를 지정합니다.
- HTTP 요청을 처리하는 기본 Connector는 다음과 같이 정의되어 있습니다:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
- 포트 번호를 원하는 값으로 변경합니다. 예를 들어, 8080 대신 5000을 사용하려면 다음과 같이 변경할 수 있습니다:
<Connector port="5000" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
톰캣의 파일 구조
bin 디렉토리:
톰캣 실행과 관련된 실행, 종료 가능한 스크립트 파일이 위치합니다. (startup.bat, shutdown.bat 등)
-Windows에서는 .bat 파일
-Unix/Linux에서는 .sh 파일
conf 디렉토리:
톰캣의 설정 파일들이 위치합니다. 주요 파일은 `server.xml`입니다. 이 파일은 톰캣의 주요 구성 요소와 환경 설정을 정의합니다. 다른 설정 파일로는 `web.xml`, `context.xml` 등이 있습니다.
lib 디렉토리:
톰캣 실행에 필요한 라이브러리 파일들이 위치합니다. 톰캣에서 사용되는 여러 기능 및 기능 확장을 제공하는 `JAR 파일`들이 포함됩니다.
logs 디렉토리:
톰캣의 로그 파일들이 위치합니다.
톰캣의 실행 로그, 액세스 로그, 오류 로그 등이 여기에 저장됩니다.
webapps 디렉토리:
웹 애플리케이션 파일들을 배치하는 공간입니다.
각 웹 애플리케이션은 해당 디렉토리에 별도의 폴더를 가지며, WAR 파일이나 웹 애플리케이션의 컨텐츠 파일들이 포함됩니다. 톰캣이 실행되면 이 디렉토리의 애플리케이션들이 자동으로 로드되고 실행됩니다.
work 디렉토리:
JSP 파일의 컴파일된 Java 클래스 파일과 임시 파일들이 여기에 저장됩니다.
temp 디렉토리:
톰캣이 실행 중에 생성되는 임시 파일들이 위치합니다.
예를 들어, 업로드된 파일의 임시 복사본이나 세션 데이터가 여기에 저장될 수 있습니다.
logs, work, temp 디렉토리:
톰캣이 실행될 때 자동으로 생성되며 필요한 파일들을 저장하기 위한 디렉토리입니다.
Tomcat 실행
- 터미널 또는 명령 프롬프트에서 Tomcat 설치 디렉토리로 이동합니다.
- bin 폴더로 이동한 후, 실행할 스크립트를 선택합니다.
- Windows에서는 `startup.bat`을 실행
- Unix/Linux에서는 `./startup.sh`을 실행
- 웹 브라우저에서 "http://localhost:{포트번호}"를 입력하면 Tomcat의 기본 환영 페이지 확인 가능합니다.
Tomcat 배포
- WAR 파일 생성:
웹 애플리케이션을 배포하기 위해서는 먼저 `WAR(WEB Archive)` 파일을 생성해야 합니다. WAR 파일은 웹 애플리케이션의 모든 컨텐츠와 구성 요소를 압축한 파일입니다. 웹 애플리케이션 프로젝트를 빌드하여 WAR 파일을 생성할 수 있고 빌드 도구인 Maven, Gradle 등을 통해 WAR 파일을 생성할 수도 있습니다. - WAR 파일 배포:
WAR 파일을 톰캣에 배포하여 실행할 수 있습니다.
WAR 파일을 배포하기 위해 톰캣의 webapps 디렉토리에 해당 WAR 파일을 복사하거나 이동합니다.
톰캣이 실행 중인 경우, WAR 파일을 webapps 디렉토리에 복사하면 톰캣이 자동으로 WAR 파일을 감지하고 애플리케이션을 배포합니다. WAR 파일을 배포하면 톰캣은 해당 애플리케이션을 자동으로 압축을 해제하고 실행합니다. - 웹 애플리케이션 디렉토리 구조:
톰캣의 웹 애플리케이션은 webapps 디렉토리에 배치됩니다.
WAR 파일이 배포되면 톰캣은 WAR 파일을 압축 해제하여 웹 애플리케이션 디렉토리를 생성합니다.
각 웹 애플리케이션은 별도의 디렉토리를 가지며, 해당 디렉토리에는 웹 애플리케이션의 컨텐츠 파일들이 위치합니다.
웹 어플리케이션 디렉터리 구조
- WEB-INF 디렉토리: 웹 애플리케이션의 구성 요소를 포함하는 디렉토리입니다. 주요 파일로는 web.xml, lib 디렉토리가 있습니다.
- WEB-INF/web.xml: 웹 애플리케이션의 배포 설명자 파일로, 애플리케이션의 구성과 설정을 정의합니다.
- WEB-INF/lib 디렉토리: 웹 애플리케이션에서 사용하는 라이브러리 JAR 파일들이 위치합니다.
- WEB-INF/classes 디렉토리: 웹 애플리케이션의 클래스 파일들이 위치하는 디렉토리입니다.
위와 같은 방식으로 WAR 파일을 생성하고 배포하여 톰캣에서 웹 애플리케이션을 실행할 수 있습니다.
Tomcat 설정 관리
server.xml
톰캣 서버의 주요 설정 파일로, 서버의 전반적인 동작과 구성을 제어합니다.
`<Server>` 요소:
- 톰캣 서버를 정의하는 최상위 요소
- `port` 속성을 통해 서버의 종료 명령을 수신할 포트를 지정합니다.
<Server port="8005" shutdown="SHUTDOWN">
<!-- 서버 구성 요소들 -->
</Server>
`<Listener>` 요소:
- 톰캣 이벤트의 리스너를 정의하는 요소, 특정 정이벤트에 대한 처리를 수행
`<GlobalNamingResources>` 요소:
- 톰캣에서 사용하는 전역 네임스페이스 리소스를 정의하는 요소
`<Service>` 요소:
- 톰캣의 서비스를 정의하는 요소
- 톰캣 서버는 하나 이상의 서비스를 가질 수 있습니다.
- `<Connector>`, `<Engine>`을 포함하고 있습니다.
<Service name="Catalina">
<!-- 서비스 구성 요소들 -->
</Service>
`<Connector>` 요소:
- 톰캣 서버로 들어오는 요청을 처리하는 커넥터 정의하는 요소
- `port`: 서버가 수신할 포트
- `protocol`: 사용할 프로토콜
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
`<Engine>` 요소:
- 톰켓의 엔진을 정의하는 요소
- 엔진은 웹 어플리케이션을 처리하는 핵심 역할을 합니다.
- `<Realm>`, `<Host>`를 포함하고 있습니다.
<Engine name="Catalina" defaultHost="localhost">
<!-- 엔진 구성 요소들 -->
</Engine>
`<Realm>` 요소:
- 톰캣에서 사용자의 인증 정보와 권한 정보, 인증서 관리 등을 다루 요소
- `<Engine>` 요소 내에 포함되어 있는 경우 전체 톰캣 엔진에 대한 인증 설정을 정의합니다.
- `<Host>` 요소 내에 포함되어 있는 경우 호스트 수준의 인증 설정을 정의합니다.
<Realm className="org.apache.catalina.realm.JDBCRealm"
driverName="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost/mydb"
userTable="users" userNameCol="username" userCredCol="password"
userRoleTable="user_roles" roleNameCol="role" />
- SSL과 조합하여 사용할 수도 있습니다.
<Realm className="org.apache.catalina.realm.JDBCRealm"
driverName="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost/mydatabase"
connectionName="myuser"
connectionPassword="mypassword"
userTable="users"
userNameCol="username"
userCredCol="password"
userRoleTable="user_roles"
roleNameCol="role_name"
digest="SHA-256"
sslEnabled="true"
sslProtocol="TLS"
sslKeystoreFile="/path/to/keystore"
sslKeystorePass="keystore_password" />
<!-- digest: 사용자 비밀번호 해싱 위한 알고리즘 -->
<!-- sslEnabled: SSL 사용할지 여부 -->
<!-- sslProtocol: SSL 프로토콜 지정 -->
<!-- sslKeystoreFile: SSL에 사용할 키스토어 파일 경로 -->
<!-- sslKeystorePass: SSL에 사용할 키스토어 파일 암호 -->
`<Host>` 요소:
- 엔진에 속하는 가상 호스트를 정의하는 요소
- 호스트는 특정 도메인 이름이나 IP 주소에 대한 웹 어플리케이션을 처리합니다.
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
<!-- 호스트 구성 요소 -->
<Alias>www.example.com</Alias>
<Context docBase="myapp" path="/myapp" />
<Valve className="org.apache.catalina.valves.AccessLogValve"
directory="logs" prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
<Logger className="org.apache.catalina.logger.FileLogger" prefix="localhost_log."
suffix=".txt" timestamp="true" />
<Realm className="org.apache.catalina.realm.MemoryRealm" />
<Resources>
<PostResources className="org.apache.catalina.webresources.DirResourceSet" base="/path/to/resources" webAppMount="/" />
</Resources>
</Host>
`<Alias>` 요소:
- 가상 호스트에 대한 별칭을 정의합니다.
`<Context>` 요소:
- 특정 웹 어플리케이션의 배치 설정을 정의하는 요소
- 어플리케이션 경로, WAR 파일 경로, 클래스 로더 설정 등의 내용을 포함합니다.
`<Valve>` 요소:
- 톰캣의 파이프라인에 특정한 동작을 추가하는요소
- 요청/응답에 대한 로깅, 인증, 필터링 등을 수행합니다.
`<Logger>` 요소:
- 호스트에 대한 로깅 설정을 정의합니다.
`<Resources>` 요소:
- 호스트에 대한 리소스 설정을 정의합니다.
- 특정 경로에 대한 접근 권한, 디렉터리 리소스, JNDI 리소스 등을 설정할 수 있습니다.
tomcat-users.xml: 사용자 인증 정보 관리
`tomcat-users.xml`은 톰캣 서버의 사용자 인증 정보를 관리하는데 사용되는 파일입니다.
- 사용자 계정 관리:
`tomcat-users.xml` 파일은 사용자 계정 정보(아이디, 비밀번호, 역할 등)를 갖고 있습니다. 톰캣 서버는 이 파일을 참조하여 사용자를 식별하고 인증에 사용될 사용자 정보를 제공합니다. - 역할 관리 및 접근 제어:
사용자 역할을 정의하는데 사용됩니다. 톰캣 캣서버는 사용자 인증 후에 사용자의 역할을 확인하여 접근을 제어합니다.
<?xml version="1.0" encoding="UTF-8"?>
<tomcat-users xmlns="http://tomcat.apache.org/xml"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://tomcat.apache.org/xml tomcat-users.xsd"
version="1.0">
<!-- 관리자 역할(role) 정의 -->
<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<role rolename="admin-gui"/>
<!-- 관리자 계정 설정 -->
<user username="admin" password="adminPW" roles="manager-gui, manager-script, admin-gui"/>
<!-- 개발자 역할(role) 정의 -->
<role rolename="developer"/>
<!-- 개발자 계정 설정 -->
<user username="user1" password="user1PW" roles="developer"/>
<user username="user2" password="user2PW" roles="developer"/>
</tomcat-users>
관리자 역할 종류:
- `manager-gui`: 이 역할은 Tomcat Manager의 HTML GUI에 액세스할 수 있는 권한을 부여합니다. manager-gui 역할을 가진 사용자는 웹 브라우저를 통해 Tomcat Manager에 접속하여 웹 애플리케이션의 배포, 시작, 중지, 다시 로드 등의 작업을 수행할 수 있습니다.
- `manager-script`: 이 역할은 Tomcat Manager의 HTTP API에 액세스할 수 있는 권한을 부여합니다. manager-script 역할을 가진 사용자는 HTTP 요청을 통해 Tomcat Manager의 기능을 사용할 수 있습니다. 이 역할은 자동화된 배포나 관리 작업을 수행하는 데 유용합니다.
- `manager-jmx`: 이 역할은 Tomcat Manager의 JMX(Java Management Extensions) 프록시에 액세스할 수 있는 권한을 부여합니다. manager-jmx 역할을 가진 사용자는 JMX를 사용하여 Tomcat 서버의 모니터링 및 관리 작업을 수행할 수 있습니다.
- `manager-status`: 이 역할은 Tomcat Manager의 상태 페이지에만 액세스할 수 있는 권한을 부여합니다. manager-status 역할을 가진 사용자는 Tomcat 서버의 상태를 확인할 수 있지만, 웹 애플리케이션의 배포나 관리 작업은 수행할 수 없습니다.
- `manager-j2ee`: 이 역할은 J2EE 관련 기능에 액세스할 수 있는 권한을 부여합니다. manager-j2ee 역할을 가진 사용자는 J2EE 컨텍스트의 배포 및 관리 작업을 수행할 수 있습니다. 이 역할은 J2EE 애플리케이션의 관리에 필요한 권한을 제공합니다.
- `manager-script-j2ee`: 이 역할은 J2EE 관련 기능에 대한 HTTP API 액세스 권한을 부여합니다. manager-script-j2ee 역할을 가진 사용자는 J2EE 관리 작업을 자동화하기 위해 HTTP 요청을 통해 API를 사용할 수 있습니다.
- `admin-gui`: 이 역할은 Tomcat Manager의 모든 기능에 대한 완전한 액세스 권한을 부여합니다. admin-gui 역할을 가진 사용자는 웹 애플리케이션의 배포, 시작, 중지, 다시 로드 등의 작업을 수행할 뿐만 아니라 모든 설정 및 관리 작업을 수행할 수 있습니다. 이 역할은 Tomcat Manager의 관리자로서 모든 권한을 가진 사용자에게 할당됩니다.
'Web' 카테고리의 다른 글
웹 서버 vs 웹 어플리케이션 서버 vs CGI 프로그램: 차이 쉽게 이해하기 (0) | 2023.08.31 |
---|---|
Nginx: 웹 서버와 리버스 프록시의 개념과 용도, 사용법 설명 (0) | 2023.06.28 |
확장성을 위한 Tomcat 클러스터링 구성과 설정 방법 (0) | 2023.06.28 |
Tomcat 성능 향상: 스레드 풀과 커넥터 설정 사용하기 (0) | 2023.06.28 |
실시간 데이터 전송 방법 Server-Sent Events(SSE)와 웹소켓 차이 (0) | 2023.06.26 |