본문 바로가기

Linux

리눅스 서버 설치기 - 3. Apache 설치 및 Tomcat 연동

들어가기 전에, 본 글은 저의 삽질이 잔뜩 기록되어 있는 글입니다.

 

이 AWS를 이용한 리눅스 서버 설치기는 에러와 삽질과정까지 전부 기록한 총 3편으로 구성되어 있는 글입니다.

삽질/에러난 과정 필요없고 성공루트만 빠르게 보고 싶으신 분들은 아래 링크로 들어가시면 됩니다.

rimkongs.tistory.com/241

 

Spring 프로젝트를 AWS에 웹 배포하기 (JAVA, Tomcat 설치부터 사이트 띄우기까지)

1. openJDK-8 설치 sudo apt-get install openjdk-8-jre openjdk-8-jdk 설치 경로 확인 java 파일구조 1. java-8-openjdk-amd64/bin/java  2. java-8-openjdk-amd64/bin/javac 3. java-8-openjdk-amd64/jre/bi..

rimkongs.tistory.com

 


 

 

WAS와 Web Server의 차이 

Apache와 Tomcat을 연동하기 위해서는 mod_jk 라는 모듈이 필요하다. (Apache에서 제공하는 Module 이다)

즉, 리눅스에 설치되는 프로그램은 Apache Server, Tomcat Server이다.

 

1. Apache

- 정적 서버, HTML과 같은 페이지를 요청시마다 해당하는 URL의 '정적'인 페이지를 보여준다.

- 즉 사용자가 달라도, 그들의 요청에 똑같은 응답인 웹 페이지가 전달된다.

2. Tomcat ('깃털'과 고양이, '아파치'톰캣이라서)

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

- 사용자가 다르면, 그들의 요청에 따라 다른 응답을 보여준다 

 

Apache와 Tomcat을 연동해서 사용하는 이유?

1. 80 포트의 사용권한
  - 리눅스에서 ~1024 포트까지는 root 계정만 사용이 가능하므로, tomcat을 80 포트로 운영하기에는 문제가 있다.

 2. 정적 데이터 처리
  - 톰캣의 성능이 아무리 좋아졌다고 해도, image/css 등과 같은 정적 데이터는 httpd에서 처리하는게 더 믿음직 하다.
    또한 압축등과 같은 정적 데이터를 처리하는 다양한 옵션등이 존재한다.(물론 압축 전송 옵션은 톰캣7에도 있다)

 3. 로드 밸런싱
  - 동일 서버내에서 한 서비스를 여러 tomcat에서 서비스하고자 할때 사용한다. apache를 연동하는 가장 큰 목적이다.


아파치 설치

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

apt-get 으로 설치된 파일 위치 찾는 법
$ dpkg -L openjdk-8-jre

 

어파치 설치 명령어

- 이미 깔려있다고 떴다.

$ apt-get install apache2

나는 아파치를 깐 기억이 없는데.. 경로를 찾아보니 다음과 같이 나왔다.

$ dpkg -L apache2
/.
/etc
/etc/apache2
/etc/apache2/apache2.conf
/etc/apache2/conf-available
/etc/apache2/conf-available/charset.conf
......

 

[참고] etc폴더란

Linux의 etc폴더는 시스템 설정파일들이 들어있다.

사용자 관리를 위한 암호관련파일, 네트워크 정보를 담고 있는 파일 등 시스템 전반적인 관리 파일이 들어 있다.

참고블로그- https://aroundck.tistory.com/2614

 

mod_jk 설치

# apt-get install libapache2-mod-jk

Reading package lists... Done
Building dependency tree
Reading state information... Done
Suggested packages:
  libapache-mod-jk-doc
The following NEW packages will be installed:
  libapache2-mod-jk
0 upgraded, 1 newly installed, 0 to remove and 11 not upgraded.
Need to get 164 kB of archives.
After this operation, 459 kB of additional disk space will be used.
Get:1 http://ap-northeast-2.ec2.archive.ubuntu.com/ubuntu bionic/universe amd64 libapache2-mod-jk amd64 1:1.2.43-1 [164 kB]
Fetched 164 kB in 1s (305 kB/s)
Selecting previously unselected package libapache2-mod-jk.
(Reading database ... 129690 files and directories currently installed.)
Preparing to unpack .../libapache2-mod-jk_1%3a1.2.43-1_amd64.deb ...
Unpacking libapache2-mod-jk (1:1.2.43-1) ...
Setting up libapache2-mod-jk (1:1.2.43-1) ...
apache2_invoke: Enable module jk

 

mod_jk 설정

# vi /etc/libapache2-mod-jk

 

workers.properties 엔터

 

해당 파일을 들어가보면 나오는 소스에 대한 설명을 하자면,

 

// 톰캣이 설치되어 있는 경로

workers.tomcat_home=/usr/local/tomcat8

# workers.tomcat_home should point to the location where you
# installed tomcat. This is where you have your conf, webapps and lib
# directories. -- 해석: 톰캣 설치한 경로를 가리키고 있어야 한다.

 

// JAVA가 설치되어 있는 경로
workers.java_home=/usr/local/java

 

// 사용할 worker의 이름을 셋팅한다.

// 아파치에 톰캣을 하나 이상 연결할 때는 woker.list=prj1,prj2 이런식으로 설정하면 된다.

// 그냥 기본으로 설정으로 셋팅

worker.list=ajp13_worker

 

// 각각의 worker list별로 설정.

// 여기서 포트는 톰캣에 설정되어 있는 ajp port를 적어준다.

worker.ajp13_worker.port=8009

worker.ajp13_worker.host=localhost

worker.ajp13_worker.type=ajp13

worker.ajp13_worker.lbfactor=1

 

위에서 바꿔준 부분은 tomcat과 java 설치 경로만 바꿔주고 나머지는 default셋팅 그대로 두었다.

각자 상황에 맞게 설정하자.

 

 

[참고] 여기서 worker 라는 개념이 등장하는데 톰캣을 하나 이상 연결 할 수 있는 것 같다.

* 연동시키는 톰캣 서비스 추가시 worker.list에 worker 이름을 추가하고 밑으로 계속 작성하면 된다.

출처 - https://fruitdev.tistory.com/25

 

 

[참고] Vim의 netrw 툴

Vim에서는 윈도우 탐색기와 같이 디렉터리 탐색기 플러그인 툴을 기본적으로 제공하는데 netrw 라는 툴이다.
이 기능은 창을 분할하여 탐색하고 동시에 편집도 가능하게 해주는 강력한 Vim의 툴로써 그 사용법을 알아두면 매우 이로울 것이다.

 

Tomcat 설정

vi /usr/share/tomcat8/conf/server.xml 

윈도우 환경이나 Centos 환경 내에서 tomcat 서버 설정은 [자신의 tomcat directory]/config/server.xml에서 설정

 

80번 포트를 유지하기 위해서 apache-tomcat을 ajp 포트로 연결하려 한다. - 이 부분 주석 해제시키기

 

<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">

<Context path="/" reloadable="true" /> ...... // 이것만 추가해줬음

</Host>

위는 Document Root 설정을 위해 필요하다.

 

톰캣과 커넥터를 연결하기 위한 설정이다.
http://localhost/path 경로로 접근시에 apache에서 tomcat으로 docBase에 설정된 경로로 연결을 해준다.
docBase설정을 하지 않을경우 기본적으로 톰캣 설치 경로의 webapps의 ROOT폴더를 바라본다.


참고블로그 - http://wiki.gurubee.net/pages/viewpage.action?pageId=1508019

[참고] 톰캣 Document Root 설정 방법

 

1. 톰캣의 기본 Document Root

server.xml에 보면 <Host> 태그의 appBase 속성이 있고, <Host> 태그 내에 <Context> 태그 속성에 docBase 가 있다.
이 둘 태그를 사용한 server.xml 에서 웹 어플리케이션의 Document Root를 설정하는 방법에 대해서 알아보자

-톰캣의 기본 Document Root는 webapps/ROOT 이다. (톰캣 기본 설치 경로인 webapps의 ROOT 폴더를 바라본다)

-server.xml의 <Host> 태그는 아래와 같이 설정되어 있고, <Context> 태그가 생략되어 있다.

 <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
...
</Host>

- <Context> 태그가 생략되어 있으면 기본적인 루트는 ROOT 디렉토리 밑이 된다

 

2. <Context> 태그의 사용

- <Context> 태그를 사용해 appBase 하위 디렉토리를 Document Root로 지정 할 수 있다.

- webapps/web 을 Document Root 로 지정한 예제

- docBase는 톰캣에 올릴 프로젝트 경로, path는 도메인/path명이 된다.

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

3. 원하는 디렉토리를 Document Root로 사용하는 경우

- 위의 appBase를 기본값으로 나두고 docBase를 절대경로로 지정하여도 된다

<Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">            
   <Context path="" docBase="/home/user/oramaster/public_html" reloadable="true"/>     
...
</Host>

<Context> 를 사용하지 않으면 ROOT를 자동으로 Document Root로 사용 한 다는 것을 기억하자.

 

 

 

-> 나중에 웹 배포할 때 opensource.war를 webapps 아래에 위치시켰다면

docBase="opensource" 이렇게 맞춰주면 되는 걸까????


그래서 현재 내 상태는 Document Root가 webapps/ROOT로 설정되어 있는 상태 이다

즉, 톰캣의 ROOT 디렉토리에 아파치 ROOT 가 향해져있는 상태!

Apache 설정

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

 

ServerAdmin webmaster@localhost  // 자신의 이메일
DocumentRoot /usr/local/tomcat8/webapps/ROOT  - 아파치 ROOT 폴더를 톰캣의 ROOT로 바꿔주는 과정
ServerName monchertongtong.com // 설정된 도메인 - aws DNS 써줌
ServerAlias http://www.haniumopensource.com - 내가 설정하고 싶은 도메인 써줌 (사용자 정의)
JkMount /* ajp13_worker JkMount / ajp13_worker - <VirtualHost> 태그 안에 JkMount도 추가해주었다.

 

aws DNS 로 접속하니 8080포트 없이도 웹페이지가 켜졌다.

그런데 ServerAlias로 설정된 페이지로는 접근이 안된다. 왜 일까 ????

 


[참고] 아파치 vhost(가상호스트)란?

자세내용 참고 - https://server-talk.tistory.com/3

Web Server에는 기본적으로 존재하는 Host가 있으며, 이를 Main Host라고 합니다.

하나의 Web Server에는 Main Host 외에 별도의 디렉토리르 가진 여러개의 Host를 설정하여,

 virtualhost를 설정을 통해 1개의 서버에서 여러개의 웹사이트를 운영할수 있습니다.


아파치, 톰캣 재시작

service apache2 restart 
cd /usr/local/tomcat8/bin 
./shutdown.sh 
./startup.sh

 


틈새 에러 

 

 

갑자기,, 하 404 뜸. 그런데 이 한글에러는 또 뭐지 (?) 원래 404떠도 영어로 떴는데..

 

삽질 1. ~~~/tomcat8/bin/setclasspath.sh 에 아래 동그라미 부분을 추가해주라는 글을 봐서 해줬지만 무소용..

참고로 setclasspath.sh 에 다음과 같이 넣으면 

Tomcat 구동 시 원하는 jdk로 시작하고 싶을 때 넣어주면 해당 jdk를 이용하여 구동 됨.

 

 

 

원인 찾음.

하여간 JAVA_HOME을 찾지 못한다는 거니깐 /etc/profile을 들어가 보았다.

 

 

PATH 부분을 export 안해서 생긴 문제였다.

export해줬더니 이제 startup은 되는데..

뭐지? 화면은 그대로 404 에러 뜸..

 

 

...아니 New Session 켜서 다시하니깐 이제 전부 이 문구 뜸

Neither the JAVA_HOME nor the JRE_HOME environment variable is defined

 

- "원인은 catalina나 기동할 때 JAVA_HOME 이나 JRE_HOME 가 시스템 PATH에 인식되지 않아 발생하는 에러

해결 방법으로 tomcat 스크립트에 export JAVA_HOME 추가"

 

아래 블로그 글을 보고 (http://www.fun25.co.kr/blog/sudo-environment-variables-sudoers)

 

 

이렇게 2개 더 추가했으나 아무 변화 없음. 링크로 된 tomcat8 , java라고 써줘서그런가? ..........

 

 

 

 

...? 위에서 다시 지웠던 ~~~/tomcat8/bin/setclasspath.sh 부분을 다시 추가해주고

source /etc/profile 해주니 가동은 됨..

그런데 똑같이 404 origin 어쩌고 ..

찾아보니깐 경로를 못찾아서 그렇다는데, server.xml로 가보았다.

 

원래 나는 github을 이용해 웹배포를 하려고 했는데,

github내의 웹 폴더 구조를 리눅스의 ROOT 폴더 이하의 구조과 어떻게 동일하게 맞춰야하는지 헷갈렸다

=> 그래서 경로문제도 해결이 안됨 (404에러의 원인)

 

 

삽질 2. 내가 이전에 자바를 다시 설치해서 충돌난걸까?

 

이전에 설치한 java는 java-1.8.0-openjdk-amd64

내가 설치한 java는 java-8-openjdk-amd64

둘의 차이는 - ? 같은거라고 한다. ㅎㅎ;;;;

$ java -version
openjdk version "1.8.0_232"
OpenJDK Runtime Environment (build 1.8.0_232-8u232-b09-0ubuntu1~18.04.1-b09)
OpenJDK 64-Bit Server VM (build 25.232-b09, mixed mode)

$ which java
/usr/local/java-8-openjdk-amd64/bin/java

명령어를 입력해보면 java는 아직 이전에 설치했던 1.8.0 버전을 가르키고 있었다.

 

의문 - /etc/alternatives/java 가 java-8-openjdk-amd64 를 가리키고 있어서 해당 경로로 가보니깐

$ ls -l /usr/bin/java
lrwxrwxrwx 1 root root 22 Dec 12 08:21 /usr/bin/java -> /etc/alternatives/java
$ cd /usr/bin/java
-bash: cd: /usr/bin/java: No such file or directory
$ ls -l /etc/alternatives/java
lrwxrwxrwx 1 root root 46 Dec 12 08:21 /etc/alternatives/java -> /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java

해당 경로에는 java-8-openjdk-amd64가 없고, 예전에 설치한 java-1.8.0-openjdk-amd64 가 있다.

/usr/lib/jvm$ ls -al
-rw-r--r--  1 root root 2712 Oct 16 20:38 .java-1.8.0-openjdk-amd64.jinfo
lrwxrwxrwx  1 root root   20 Jul 18 18:52 java-1.8.0-openjdk-amd64 -> java-8-openjdk-amd64

즉, /etc/alternatives/java 가 없는 파일을 가리키고 있다.

 

그리고 애초에 JAVA_HOME은 /usr/local/java-8-openjdk-amd64 가 되어야 하는데

(/etc/alternatives/java가 가리키는게 JAVA_HOME인 것 같다 아마?)  

위의 결과대로라면 JAVA_HOME은 /usr/lib/jvm/java-8-openjdk-amd64 이 되어버린 것이다. (즉, 없는 것을 가리키고 있음)

 

그럼 /usr/bin/java란게 영향을 주는 것인지

/etc/alternatives/java가 무엇인지를 알아야겠다. (자동으로 PATH가 저기로 설정된다던가...그러면 확실히 문제가 있는거니깐.)

 

 

-> [참고] apt 로 설치한 JDK는 /usr/bin/java 에서 심볼릭 링크로 연결된다.

이 심블릭 링크는 /etc/alternatives/java 를 중간에 거쳐서 실제 설치한 디렉토리로 연결된다. 

 

-- 내가 이전에 jdk를 설치한 방식이 apt-get이다.

 

sudo update-alternatives 명령어로 현재 설치된 버전들과 우선 순위를 확인할 수 있다.

$ sudo update-alternatives --display java
update-alternatives: warning: alternative /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java (part of link group java) doesn't exist; removing from list of alternatives

-> 역시 /usr/lib/jvm/java-8-openjdk-amd64 가 존재하지 않는다고 나온다.

 

...

[고민해야 할 부분]

apt-get으로 java 설치 시 어떠한 과정을 통해 

java-8-openjdk-amd64, java-1.8.0-openjdk-amd64 이런게 생기는 것 같은데. 

구조 한 번 보고 넘어가야 할 것 같다

...

 

[문제 해결]

환경변수 저장하기

$sudo nano /etc/environment
$source /etc/environment // 변경사항 저장

 

원래 vi /etc/profile에만 환경설정을 해줬는데 이때는 root계정으로 접속 시 echo $JAVA_HOME의 결과가 안 나왔다. (ubuntu계정은 나옴)

그런데 위와 같이 바꾸고 나니 root계정에서도 이제 echo가 동작한다. 

왜 그런지는 일단 나중에 찾아봐야겠다 - 할게 많으니..

# echo $JAVA_HOME
/usr/local/java

 

=> tomcat ./startup.sh도 된다 ..!


 

이제 FileZilla를 이용해 .war 파일을 웹배포하려 한다.

 

FileZilla를 이용한 웹 배포

(웹 배포를 하기 위한, Spring + MySQL 세팅을 보려면 여기 클릭)

 

1. 권한 부여

 

"/usr/local/tomcat8/webapps 라는 폴더에

777 라는 옵션으로

chmod 라는 명령어를 최고 관리자(sudo)가 수행한다"

 

chmod - 권한을 셋팅하는 명령어

777 - 모든 유저에게 읽기/쓰기/실행을 가능하게 하는 옵션

# chmod -R 777 /usr/local/tomcat8/webapps

 

webapps 폴더의 소유자를 tomcat8로 설정한다

# chown -R tomcat8:tomcat8 /usr/local/tomcat8/webapps

 

2. FileZila를 이용해 webapps폴더 아래에 war 파일을 옮겨준다

 

3. 경로설정

심볼릭 링크를 이용해 ROOT가 내 프로젝트 명 (OpenSource) 을 가리키게 하였다.

$ ln -s OpenSource ROOT

(혹시 ROOT 폴더가 다른 용도로 활용되고 있었다면, 기존 ROOT 폴더의 이름을 변경하거나 백업 후 삭제한다.)

 

 ROOT-> OpenSource 를 가리키게 지정했기 때문에, server.xml 은 건드릴 부분이 없다. 초기상태 그대로 두면 된다.

(Document Root가 webapps/ROOT인 상태)

 

server.xml

초기 상태 그대로 Context 태그가 존재하지 않는다.

 

[참고] 위처럼 심볼릭 링크를 이용하지 않고, 경로설정을 하고싶다면?

server.xml 설정

<Context> 태그를 사용해 appBase 하위 디렉토리를 Document Root로 지정한다.

즉, 여기서는 webapps/OpenSource를 Documen Root로 지정하게되면 http://내IP:8080/ 

내 프로젝트에 바로 접근이 가능함.

 

실상, webapps/ROOT -> webapps/OpenSource로 변경해준 것이라고 보면 됨

* <Context> 를 사용하지 않으면 ROOT를 자동으로 Document Root로 사용하기 때문

 

 

 

4. URIEncoding 설정하기

context.xml 연 김에 UTF-8도 설정해주기

설정해주지 않으면, get방식으로 전달된 데이터의 경우 한글 깨짐이 발생함

 

 

 

5. 톰캣 재시작

# cd usr/local/tomcat8/bin
# ./startup.sh