[삽질 가득 서버 설치기] [Apache + Tomcat] 3 - Apache Server 설치 및 Tomcat 연동(mod_jk)

반응형

개요

소제목 : 아파치, 톰캣, 우분투, Apache & Tomcat on Ubuntu with AWS

시작하기 전에

  • 커맨드는 $ 표시로 구분하였다.
  • 중요한 내용이 아닌 경우 [참고] 라는 이름으로 별도의 타이틀링을 하였다. 삽질 과정의 주저리로서 무시해도 괜찮은 내용이다.삽질 과정을 모두 기록한 글이기 때문에, 중간 중간 과도하게 상세한 설명이 들어가있다.
  • JDK 설치를 위해서 반드시 진행해야 하는 부분은 [👨🏼‍💻 중요] 표시로 구분하였다. 이 표시만 따라가면 우분투 리눅스에 JDK 를 설치할 수 있다.

참고 블로그

다음 글을 참고했다.

리눅스 우분투 아파치 톰캣 연동하기

이전 과정 요약

  1. 자바 다운로드 및 설치
    1. 다운로드
    2. 압축 풀기 및 Unpack(Unarchaive)
    3. 파일 이동
    4. 링크파일 생성
    5. 자바 환경변수 설정 /etc/profile
      1. 환경변수 수정 (vim)
      2. 환경변수 적용 (source)
      3. 환경변수 확인 (env, echo)
  2. 톰캣 다운로드 및 설치
    1. 다운로드
    2. 압축풀기
    3. 파일 이동
    4. 링크파일 생성
    5. 톰캣 설정파일 설정 및 실행
      1. 환경변수 수정 (vim)
      2. 환경변수 적용 (source)
      3. 환경변수 확인 (env, echo)
      4. .sh 파일 실행
    6. 브라우저로 인터넷 접속 확인

들어가기 전에, WAS vs WS

들어가기 전에 WAS 와 Web Server 의 차이를 알고 가자.
Apache와 Tomcat 을 연동하기 위해서는 mod_jk 라는 모듈이 필요하다. (Apache 에서 제공하는 Module이다.)
우리가 리눅스에 설치할 서버 프로그램은 Apache Server, Tomcat Server 두 개이다.
(즉, Apache Tomcat 과 Aapche2 라는 서버는 서로 다른 서버이다. 이름때문에 햇갈리지 말자.)

 

[👨🏼‍💻 중요]

동적 처리가 필요한 페이지(jsp)는 tomcat 이 처리하게 하고, 정적 페이지(html) 은 apache 가 처리하게 하는 것이 목표다.

요즘엔 WAS 만 쓴다.

[👨🏼‍💻 중요]

🚨 (2020년 필자가 돌아와서 적는 글) 과거에는 동적페이지정적페이지와 분리하여 처리하게 하는 것이 리소스 관리 측면에서 유리했다고 한다. 곧, 예전에는 정적페이지를 처리하는 속도가 tomcatapache 서버에 비해 느렸다고 한다. 하지만 요즘에는, 정적페이지를 처리하기 위해 별도의 HTTP 서버를 가동하는 추세는 아닌것 같다. tomcat 과 같은 WAS 의 성능이 날로 좋아지면서 WAS 만으로 정적페이지와 동적페이지를 동시에 처리하게 하는 경우가 대부분인것 같다.

WS Apache

깃털-아파치-웹서버-로고
Apache HTTP Server

  • 정적 서버, HTML 과 같은 페이지를 요청시마다 해당하는 URL 의 '정적'인 페이지를 보여준다.
  • 즉 사용자가 달라도, 그들의 요청에 똑같은 응답인 웹 페이지가 전달된다.

WAS Tomcat

고양이-아파치-톰캣-로고
Apache Tomcat Web Application Server

  • JSP, Servlet 페이지를 띄워주는 역할을 한다. 사용자의 요청에 적절히 응답하여 그에 따라 '동적'인 페이지를 보여준다.
  • 사용자가 다르면, 그들의 요청에 따라 다른 응답을 보여준다.

 

반응형

 

Apache 설치

패키지 매니저(apt-get)를 활용하여 apache2를 설치한다.

[👨🏼‍💻 중요]

$ apt-get install apache2

[참고] 패키지 매니저를 활용시 OS의 변화

패키지 매니저를 사용하여 프로그램을 설치하게 되면 운영 시스템 상엔 어떠한 변화가 있을까? 또는 환경변수 상의 변화가 있을까? 기타 아직 모르는 리눅스의 백그라운드 시스템에 변화가 있을까?

apt-get은 일종의 앱스토어 같은 곳으로, 내 시스템에 맞는 파일들을 알아서 다운로드 해주는 것 같다.

[참고] 패키지 매니저 Console 요약

apt-get 커맨드를 입력하고 나면 설치과정이 쏜살같이 지나가버린다. 그 설치과정을 요약해보면 다음과 같다.

  1. Get (1 반복 10가지 파일)
  2. Fetched
  3. Preconfiguring packages
  4. Selecting previously unselected package
  5. Preparing to unpack
  6. Unpacking (Get 에서 받은 10가지 파일에 대해 4~6 반복 진행)
  7. Processing triggers for (libc-bin / man-db / ufw / systemd / ureadahead 에 대해 반복)
  8. Setting up (libapr 부터 apache2 까지 9개 파일에 대해 반복)
  9. Enabling module (npn_event, authz_core 외 20여가지 항목에 대해 반복)
  10. setting up (ssl-cert)
  11. Processing triggers for (libc-bin / systemd / ureadahead / ufw, 4가지에 대해 반복)

무슨 말인지는 잘 모르겠지만, 훗날 힌트가 될까 해서 정리해보았다.

패키지매니저(apt-get)와 환경변수

보통 블로그들을 참고해보면("apt-get jdk 설치"라는 검색어로 구글링), apt-get 으로 패키지를 설치하고 나면 java, javac 와 같은 명령어는 운영체제에 등록되어 패키지매니저를 활용한 설치만으로도 사용할 수 있는 것을 확인할 수 있는데, 패키지매니저가 PATH 환경변수에 해당 프로그램들의 경로를 추가하기 때문인 것같다.
반면, java 구동을 위해서 JAVA_HOME 환경변수 및 CLASSPATH 환경변수는 패키지매니저가 설정하지 않는 모양이다. 즉, 별도의 환경변수는 사용자가 직접 경로를 알아내어 추가해주어야 하는 것 같다.

아파치 서버 동작 확인

[👨🏼‍💻 중요]

우분투-아파치-서버-기본-화면-스크린샷
Apache 서버에 브라우저로 접근한 모습

mod_jk 설치

mod_jk 는 WS 와 WAS 를 서로 연결해주는 모듈이다.

[👨🏼‍💻 중요]

$ apt-get install libapache2-mod-jk

apt-get-으로-mod_jk-설치한-모습
apt-get 을 활용하여 mod_jk 를 설치를 진행한 모습

mod_jk 커넥터 설정

WS 및 WAS 가 서로 연동되어 동작하도록 실행환경을 구성하는 환경설정이다.

mod_jkworkers.properties 파일을 다음과 같이 수정하자.

[👨🏼‍💻 중요]

$ vi /etc/libapache2-mod-jk/workers.properties

[👨🏼‍💻 중요]

workers.properties

workers.tomcat_home=/usr/local/tomcat8 #기본은 /usr/share/tomcat8 이었다.
workers.java_home=/usr/local/java #기본은 /usr/lib/jvm/default-java

worker.list=ajp13_worker #기본 설정과 동일하다.
worker.ajp13_worker.port=8009 #기본 설정과 동일하다.
worker.ajp13_worker.host=localhost #기본 설정과 동일하다.
worker.ajp13_worker.type=ajp13 # 기본 설정과 동일하다.
worker.ajp13_worker.lbfactor=1# 기본 설정과 동일하다.

# 이하의 주석은 지워주도록 하자

[참고] mod_jk worker

worker 라는 개념이 등장하는데 톰캣과 같은 서버를 하나 이상 연결 할 수 있는 것 같다. 이에 대한 심화적인 내용은 따로 찾아보는 것으로 하자. 지금 톰캣은 1마리면 될 것 같으니까.

주석을 잘 읽자. 세상에 이렇게나 꼼꼼하고 친절하다.

# workers.tomcat_home should point to the location where you
# installed tomcat. This is where you have your conf, webapps and lib
# directories.
# workers.java_home should point to your Java installation. Normally
# you should have a bin and lib directories beneath it.

workers.tomcat_home 에는 당신의 tomcat 을 설치한 위치를 지정해야 합니다. 이곳은 conf, webapps 와 lib 디렉토리를 갖고 있는 곳입니다.
workers.java_home 에는 당신의 java가 설치된 위치를 지정해야합니다. 일반적으로 이 디렉토리는 하위에 bin 과 lib 디렉토리를 가지고 있어야 할 것입니다.

tomcat 설정

[👨🏼‍💻 중요]

$ vi /usr/local/tomcat8/conf/server.xml

[👨🏼‍💻 중요]

<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

위 내용이 주석처리 되어 있다면 주석 해제한다.(이전번 실패때는 주석되어있더니 이번엔 아니었다.)

[👨🏼‍💻 중요]

<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
    <Context path="/" reloadable="true" /> 
      ......생략...... 
</Host>

위 코드를 해석해보자. http://localhost/path경로로 요청한 결과에 대해 apache에서 tomcat 으로 docBase에 설정된 경로로 연결을 해준다. docBase 설정을 하지 않는다면 기본적으로 tomcat 설치경로의 webapps 의 ROOT 폴더를 바라보게 된다고 한다.

위 코드는 DocumentRoot 설정을 위해 필요하다. 아파치와 톰캣의 ROOT 폴더를 공유하고자 할때 변경해줄 수 있다.
그러나 블로그를 따라 톰캣의 ROOT 디렉토리에 아파치 ROOT 가 향하게 하자.

Apache 설정

[👨🏼‍💻 중요]

$ vi /etc/apache2/sites-enabled/000-default.conf

아래와 같이 내용을 수정하고, (#이하의 주석은 지워주도록 한다.)

[👨🏼‍💻 중요]

ServerAdmin webmaster@localhost #내 메일로 바꿔주자.
DocumentRoot /usr/local/tomcat8/webapps/ROOT #아파치의 ROOT 폴더를 톰캣의 ROOT 로 바꿔주자 (기존 아파치는 /var/www/html )
ServerName example.com // 설정된 도메인 #주석 해제하여서버 네임을 지정할 수 있는 것 같다. (AWS DNS 넣나?)
ServerAlias http://www.monchertongtong.com # 주석되어 있는 부분이 되어있지 않은걸 보니 임의로 넣어야 하는 부분?

맨 밑에 JkMount 관련부분을 추가해준다.

[👨🏼‍💻 중요]

JkMount /* ajp13_worker
JkMount / ajp13_worker

위와 같이 설정하면 http://ip/PATH 경로로 시작하는 요청은 모두 커넷터 설정에서 지정한 WORKER_LIST(mod_jk 설정)로 연결이 된다.

[참고] 잡담

원리가 뭘까? 블로그에서는 http://ip/PATH(http://ip/PATH) 경로로 시작하는 주소는 모두 커넥터 설정에서 지정한 Worker_list 로 연결된다고 하는데 느낌만 짐작할 뿐, 쉽게 알아차리기가 어렵다.

Apache, Tomcat 재시작

Apache 서버 재시작

[👨🏼‍💻 중요]

$ service apache2 restart

Tomcat 서버 재시작

[👨🏼‍💻 중요]

$ cd /usr/local/tomcat8/bin
$ ./shutdown.sh

[참고] Apache 서버 재시작 삽질

그럴 것 같았다... 역시나 실패다. 잘못한 부분을 찾아보자.

리눅스-스크린샷-아파치-실행중-오류
apache 서버의 재실행 과정에서 문제가 발생했다.

역시 'Code Never Lies" 다. control process exited 로서 에러를 확인해보라고 했고, 확인했더니 30째줄이 잘못됐다고 한다. 000-default.conf 의 (어? 이거 어디서 많이 보던 오류 스타일이다. JAVA 다. 새삼스럽지만 Tomcat 은 JAVA 로 돌고 있는거다.)

필자는 JkMount라고 써야 할 부분에 JkMound라고 오타를 적었었다. 30번째 줄이 다행히 두 번째 JkMount 였다. 그렇다면 29째줄인 JkMount 는 잘 되었었다는 거겠지.

[참고] 환경변수의 scope

./shudown.sh 명령어를 사용하면서 신기한 사실을 발견하였다. 이 동작을 실수로 sudo ./shutdown.sh라고 sudo 로 명령을 진행했었는데 JAVA_HOME 또는 JAVA_JRE 환경변수가 설정되어 있어야 한다고 했다. 분명, 해당 환경변수를 추가해줬었는데 말이다. 이유는 sudo 로 실행하게 되면, root 계정 환경에서 동작하게 되고 환경변수가 다르게 작동하는것이기 때문일것이다. (즉 root 계정에는 JAVA_HOME 환경변수가 없다는 거다.)

[참고] tomcat 이 꺼져있는 경우

tomcat 이 shutdown 된 상태에서 apache 는 동작하고 있는 것일 테다. 그렇다면, 사이트에 접속이 될까?
대답은 No, 아래와 같이 Service Unavailable 이라는 메시지가 뜬다.

tomcat-꺼진-웹서버-service_unavailable-오류-스크린샷
Tomcat 이 꺼져있는 상태에서 브라우저로 서버에 접근한 모습

[참고] tomcat 재시작 소요시간

./startup.sh 명령어를 실행하고 나서 브라우저로 확인하는데 잘 되지 않았다.

크윽 ... 잘 될 리가 없지... 아예 응답이 없다. ㅠㅠ

톰캣은 시작 되었다는 메시지를 보았다.
아파치도 재시작하려다보니까, 갑자기 된다. 역시 좀 기다려야 했었던 것이다.

[참고] apt-get 의 tomcat

이전 과정에서 tomcat 을 수동으로 설치했었다. apt-get 으로 설치한 tomcat 은 동작이 잘 안되었는데 무슨 이유인지 아직 찾지 못하였다. 아마 경로설정이 잘못되어있었을거라고 추측은 해보지만, 다시 도전해볼 필요가 있다.

Apache, Tomcat 연동 동작 확인

[👨🏼‍💻 중요]

이 상태(톰캣 재시작 전)에서도 :8080 포트 없이 접속한 ip (아마도 80포트) 가 톰캣으로 확인된다.모습을 볼 수 있다.

정상-작동하는-웹서버-고양이-그림
8080 포트가 아닌데도 tomcat 으로 접속되고 있다. mod_jk 가 80 포트를 톰캣으로 연결한 것

반응형

Designed by JB FACTORY