우선 nginx와 tomcat을 설치합니다 (아래 링크 참조)
2022.04.17 - [IT/Web server] - [Nginx] AWS Linux nginx 설치하기
2020.02.19 - [IT/Linux] - [Tomcat] CentOS 7에 Tomcat8 설치 및 설정

 

nginx와 tomcat이 설치되었다면 다음부터는 간단합니다

nginx 설정파일을 연다
# vi /etc/nginx/nginx.conf

server 부분에 아래와 같은 "/" 접근 proxy_pass 설정을 한다.

location / {
        proxy_pass http://localhost:8080;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
}

설정이 완료되었다면 nginx 재시작
# service nginx restart

 

브라우저에서 80포트로 접근 시 톰캣에 붙는지 확인해 봅니다.

http://SERVER-IP 또는 http://SERVER-IP/manager/html

접근이 되지 않는다면 80포트 열려있는지 확인해보시거나, nginx 및 tomcat이 실행되고 있는지 확인해보세요

 

* nginx 용량 제한 설정 (필수 X)

manager 또는 젠킨스를 통해서 war 또는 jar를 배포할 때, 허용 용량 보다 큰 파일을 전송할 경우 nginx에서 막을 수 있습니다.
ex) 413 Request Entity Too Large
이럴 경우를 대비해서 미리 허용 용량을 높여줍니다.
nginx 설정파일 열기
# vi /etc/nginx/nginx.conf

http {
...
  client_max_body_size 10M;
...
}

1. 생성된 EC2에 SSH를 이용해서 접근합니다.

2. eginx를 설치 및 실행을 확인합니다.

nginx 설치
# sudo amazon-linux-extras install nginx1

nginx 실행
# sudo systemctl start nginx.service

nginx 프로세스 확인
# ps ef|grep nginx

nginx access log 확인
# tail -f /var/log/nginx/access.log
브라우저에서 http://EC2-public-ip 로 접근해봅니다.
접속되지 않는 다면 80포트가 닫혀 있거나 ec2 접근 ip가 잘못되었을 확률이 높으니 한번 더 확인합니다.

3. 80포트가 열려있지 않다면 EC2의 보안그룹을 수정합니다.

EC2에 설정된 보안그룹 인바운드에 HTTP 유형 80포트를 추가합니다.

 

4. 호스트 재시작 시 nginx 자동 실행 설정

 systemctl enable nginx.service

Context path를 지정하는 방법은 3가지가 있습니다.

1.  context.xml 수정하기

my-project\src\main\webapp\META-INF\context.xml
<?xml version="1.0" encoding="UTF-8"?>
<Context path="/my-context-path"/>

 

2. war 파일명으로 지정하기

source build 후 war를 tomcat 디렉토리 안에 있는 webapp에 넣고 tomcat을 실행하면 war 파일 명으로 context path가 지정됩니다. (단 my-project\src\main\webapp\META-INF\ 경로에 context.xml 파일이 없어야 합니다.)

3. xml 파일 명으로 context path 지정하기

이 방법은 소스가 톰캣 외부에 있을 때 사용하는 방법입니다.

톰캣경로\conf\Catalina\localhost\project-name.xml
<?xml version="1.0" encoding="UTF-8"?>
<Context docBase="D:\springboot\bamdule\target\bamdule"/>

 위와 같이 설정한다면 "project-name" 으로 context path가 지정됩니다.

 

tomcat에 출력되는 로그를 영어로 변경하려면 catalina.bat 파일을 수정해주어야 합니다.

D:\tomcat\apache-tomcat-8.5.57\bin\catalina.bat

tomcat이 설치된 경로로 이동하여 catalina.bat을 다음과 같이 수정합니다.

setlocal
set "JAVA_OPTS=%JAVA_OPTS% -Duser.language=en"

setlocal 문구를 검색한 후 바로 아래에 set "JAVA_OPTS=%JAVA_OPTS% -Duser.language=en" 를 입력합니다.

tomcat은 webapps 아래에 존재하는 war파일들을 실행시킵니다.
하지만 아래와 같이 설정하면 다른 경로에 있는 war파일을 찾아서 실행시킬 수 있습니다.

 

1. ${TOMCAT-HOME}\conf\Catalina\localhost 경로로 이동합니다.
(ex: E:\tomcat\apache-tomcat-8.5.56\conf\Catalina\localhost )

2. [context-path 명].xml 파일을 생성합니다.
(ex: bamdule.xml )

3. xml 파일에 다음과 같이 입력합니다.

<?xml version="1.0" encoding="UTF-8"?>
<Context docBase="source-path\target\source-directory" path="/my-context-path" reloadable="false"/>

1) docBase : target 안에 있는 source를 지정합니다.
(ex: E:\workspace\bamdule\target\bamdule)

2) path : context-path를 지정합니다.

3) reloadable : class가 변경될때마다 자동으로 tomcat reload합니다.

1. JDK 8 설치

2020/04/07 - [IT/JAVA] - [Java] Windows 10 Open-JDK 8 다운로드 및 환경변수 설정

 

2. Tomcat 8.5 다운로드 

https://tomcat.apache.org/download-80.cgi
 

Apache Tomcat® - Apache Tomcat 8 Software Downloads

Welcome to the Apache Tomcat® 8.x software download page. This page provides download links for obtaining the latest versions of Tomcat 8.x software, as well as links to the archives of older releases. Unsure which version you need? Specification versions

tomcat.apache.org

64bit, 32bit 중 하나를 선택해서 다운로드 해주세요.

32-bit Windows zip (pgp, sha512)
64-bit Windows zip (pgp, sha512)

다운로드가 완료되었다면 원하는 경로에 알집을 풀어주세요.

D:\tomcat\apache-tomcat-8.5.57

 

3. Tomcat 설정

1) URIEncoding UTF-8 설정

D:\tomcat\apache-tomcat-8.5.57\conf\server.xml
URIEncoding UTF-8 설정
...
<Connector port="8080" protocol="HTTP/1.1"
                connectionTimeout="20000"
                redirectPort="8443"
                URIEncoding="UTF-8" />
...

 

2) 콘솔창 한글 깨짐 수정

D:\tomcat\apache-tomcat-8.5.57\conf\logging.properties
1catalina.org.apache.juli.AsyncFileHandler.encoding = EUC-KR

2localhost.org.apache.juli.AsyncFileHandler.encoding = EUC-KR

3manager.org.apache.juli.AsyncFileHandler.encoding = EUC-KR

4host-manager.org.apache.juli.AsyncFileHandler.encoding = EUC-KR

java.util.logging.ConsoleHandler.encoding = EUC-KR

 

3) tomcat manager 설정

D:\tomcat\apache-tomcat-8.5.57\conf\tomcat-users.xml
...
  <role rolename="manager"/>
  <role rolename="manager-gui" />
  <role rolename="manager-script" />
  <role rolename="manager-jmx" />
  <role rolename="manager-status" />
  <role rolename="admin"/>
  <user username="tester" password="1234" roles="admin, manager, manager-gui, manager-script, manager-jmx,  manager-status"/>

...

 

4. tomcat 실행

1) cmd 실행 (윈도우키 + r, cmd 입력) 또는 PowerShell 실행

2) D:\tomcat\apache-tomcat-8.5.57\bin 으로 이동

3) startup.bat 입력

 

5. tomcat Test

1) 기본 페이지

http://localhost:8080

 

2) manager 페이지 

http://localhost:8080/manager
사용자 이름과 비밀번호는 tomcat-users.xml에 설정한 값으로 입력하면 됩니다.

 

6. war파일 올리기

D:\tomcat\apache-tomcat-8.5.57\webapps
위 경로에 war파일을 올린 후 톰캣을 재시작하면 됩니다.
Servlet은 웹 요청에 대한 동적인 처리를 수행하는 클래스이다. 
  • 서버 상에서 실행되는 자바 프로그램
  • 개발자가 작성해야하는 부분이다. 
  • HttpServlet 클래스를 상속하고 doPost(), doGet() 등을 재정의하여 요청에 대한 응답을 처리한다. 

 

WAS 동작 과정

 

Servlet의 기본 동작 과정 

  • Web Server는 Http Request를 Web Container에게 위임한다.
  • 클라이언트 URL 요청이 들어오면,  Web Container가 URL 매핑을 통해 Servlet을 실행한다.
  • Servlet이 처음 실행된 것이라면 init() 메소드를 통해 Servlet을 초기화하고 메모리에 로드한다. 
  • Servlet이 메모리에 적재되어있다면 Thread를 생성하고 service() 메소드를 실행해 요청에 대한 처리와 응답을 수행한다.
  • service() 메소드 실행 시, 요청 Method 타입에 따라 doGet(), doPost() 메소드가 호출된다.
  • 요청이 끝나면 Thread는 종료되고 제거된다. 하지만 해당 Servlet 객체는 메모리에 계속 유지된다.

 

 

Servlet LifeCycle

Web Container는 Thread의 생성과 제거를 담당한다.

thead의 생성과 제거의 반복은 큰 오버헤드를 만든다.

이를 위해 Tomcat(WAS)은 Thread Pool을 만들어 오버헤드를 줄인다.

즉, Web Container는 Servlet의 LifeCycle을 당담한다.

클라이언트의 요청이 들어왔을 때, Servlet객체 생성은 Web Container가 알아서 처리한다.

개발자는 서비스 로직을 수행하는 Servlet만 개발하면 된다.

 

init(), service(), destroy() 메소드

  • init() 메소드
    • 한 번만 수행된다
    • 클라이언트가 요청하면 servlet이 생성되고, 메모리에 로드 될 때, init() 메소드가 호출된다.
    • Servlet 객체를 초기화 역할을 수행한다.
  • service(request, response) 메소드
    • request type에 따라서 doGet(), doPost(), doPut(), doDelete() 메소드가 실행된다.
    •  메서드가 return되면 해당 thread는 제거된다.
  • destroy() 메소드
    • 한 번만 수행된다.
    • WAS가 갱신되거나 종료될 때 호출된다.
    • Servlet 객체를 메모리에서 제거하는 역할을 수행한다.

 

HttpServletRequest, HttpServletResponse 객체

  • HttpServlet을 상속한 클래스의 doGet(), doPost() 메소드 등의 파라메터로 넘어온다.

 

  • HttpServletRequest
    • 클라이언트의 요청 정보(헤더 정보, 파라메터, 쿠키, URI, URL 등)를 저장한다.
    • getHeader("헤더이름") 메소드를 통해서 헤더정보를 확인 할 수 있다.
    • getPrameter("파라메터이름") 메소드를 통해 parameter 값을 확인 할 수 있다.
    • getParameterValues("파라메터이름") 메소드를 통해 배열로 저장된 값을 읽을 수 있다.
  • HttpServletResponse
    • HTML 코드 및 데이터를 담아서 반환할 수 있다. 

 

참조 - https://gmlwjd9405.github.io/2018/10/28/servlet.html

 

 

 

WAS란 동적인 콘텐츠를 제공하기 위해 만들어진 서버이다. 

주로 Database와 관련된 처리등 동적으로 다양한 서비스 로직 처리를 수행한다.

WAS의 종류로는 Tomcat, JEUS, WebLogic 등이 있다.

웹 컨테이너(Web Container) 혹은 서블릿 컨테이너(Servlet Container) 라고도 불린다.

웹 컨테이너의 역할을 다음과 같다.

  • 서블릿의 생명주기를 관리하고, URL과 특정 서블릿을 맵핑하며 URL 요청이 올바른 접근 권한을 갖도록 보장한다. 
  • 서블릿, 자바서버 페이지(JSP) 파일, 그리고 서버-사이드 코드가 포함된 다른 타입의 파일들에 대한 요청을 다룬다.
  • 서블릿 객체를 생성하고, 서블릿을 로드와 언로드하며, 요청과 응답 객체를 생성하고 관리하고, 다른 서블릿 관리 작업을 수행한다.

WAS의 구조 및 동작

참조

https://ko.wikipedia.org/wiki/%EC%9B%B9_%EC%95%A0%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98_%EC%84%9C%EB%B2%84

+ Recent posts