본문 바로가기
리눅스/Ubuntu

apache + tomcat 설치

by 베어그릴스 2022. 11. 4.
반응형

이번 시간에는 아파치 서버와 tomcat을 설치해볼까 한다.

 

apache란?

아파치 소프트웨어 재단에서 관리하는 HTTP 웹 서버이다. 구축이 쉽고, 무료 버전으로 사용할 수 있어서 많이들 사용한다.

 

tomcat이란?

톰캣은 웹 어플리케이션 서버 (WAS)이며, 자바 서블릿을 실행시키고, JSP코드가 포함되어 있는 웹 페이지를 만들어 준다.

* 서블릿 컨테이너 : 클라이언트의 요청을 받아 요청을 처리하고, 다시 클라이언트에게 응답해주는 역할

톰캣은 웹 서버에서 넘어온 동적인 페이지를 읽어 들여 프로그램을 실행하고, 그 결과를 다시 html로 재구성하여 아파치에게 되돌려준다. 아파치가 없이 톰캣 스스로 독립적으로도 사용될 수도 있지만, 아파치와 같은 다른 웹 서버랑도 함께 사용될 수 있다.

 

apache와 tomcat을 연동하는 이유 : 톰캣의 웹 서버 기능은 아파치 웹 서버보다 느린 기능을 보였고, 웹의 모든 정적/동적 데이터를 모두 WAS 서버인 톰캣이 처리한다면, 결과적으로 사용자의 요청의 응답이 느려진다.

때문에 정적 데이터는 웹서버인 Apache에서, 동적 데이터는 WAS인 톰캣에서 처리함으로써 서버의 전체적인 부하를 분산하고 속도를 빠르게 하기 위해서 사용한다.

apache 와 tomcat을 연동하는 이유는 톰캣의 웹 서버기능은 아파치 웹 서버보다 느린 기능을 보였고, 웹의 모든 정적/동적 데이터를 모두 WAS 서버인 톰캣이 처리한다면, 결과적으로 사용자의 요청의 응답이 느려진다.

 

웹 서버를 납품하거나 서비스해야 한다면 위 두가지는 기본이라고 봐도 무방하다.

 

그런대 세월이 변하고 기술이 발달함에 있어서 톰캣 9 버전 이상부터는 톰캣 단독으로 실행해도 딱히 느리다는 느낌은 받은 적은 없다.

 

[아파치 톰캣 연동]

1. apache 설정파일인 httpd.conf에 tomcat 연동을 위한 설정을 추가하고, 톰캣에서 처리할 요청을 지정한다.

2. 사용자는 아파치 웹 서버에 접속한다 (port:80)

3. apache 웹 서버는 사용자의 요청이 들어왔을 때, 이 요청이 톰캣에서 처리되도록 지정된 요청인지 확인한다.

4. 톰캣에서 처리해야 하는 경우, 아파치 웹 서버는 톰캣의 AJP 포트(8080port)에 접속해 요청을 톰캣에게 전달한다.

5. 톰캣은 아파치 웹 서버로부터 요청을 받아 처리 후, 처리 결과를 다시 아파치 웹 서버에게 돌려준다.

6. 아파치 웹 서버는 톰캣으로 전달받은 처리 결과를 클라이언트에게 전달한다.

 

[아파치 톰캣 설치및 연결 순서]

1. 톰캣 설치및 셋팅

2. Apache Install

3. Apache Modul Set

4. Apache security

5. Apache conf 설정

6. Apache Virtualhost

7. Apache Grammar check

8. Apache Start Server

8. Apache Change Ownner

9. Tomcat Remove Folder

 

[구성도] 3티어

같은 우분투 서버에 아파치 + 톰켓 설치 + 다른 DB 서버 연동

톰켓아파치연동

[톰켓 설치]

[톰켓 설치]
1. 톰캣을 다운로드한다.
2022-11-04 기준 9.0.68 버전
https://tomcat.apache.org/download-90.cgi

 

Apache Tomcat® - Apache Tomcat 9 Software Downloads

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

tomcat.apache.org

 

우분투에 설치할 것이므로 아래를 다운로드한다.
tar.gz (pgp, sha512)

apache tomcat

다운로드한 파일 ftp 툴을 이용해 업로드

 

업로드한 apache-tomcat-9.0.68 압축을 해제한다

[tomcat@localhost ~]$ tar -xvzf apache-tomcat-9.0.68.tar.gz 
[tomcat@localhost ~]$ ls -al

 

폴더명을 변경한다 변경하지 않아도 된다.(취향)

[tomcat@localhost ~]$ mv apache-tomcat-9.0.68 tomcat-9.0.68

 

정상적으로 압축을 해제하였다면 실행시켜 본다.

tomcat start
[tomcat@localhost ~]$ ./tomcat-9.0.68/bin/startup.sh

 

해당 우분투 웹서버의 아이피를 획득한다.

 

ifconfig

ifconfig

ifconfig

처음 설치 시 기본 톰캣 포트는 8080이다.
인터넷 브라우저를 연 후 아래 본인의 아이피 입력 아이피:8080

192.168.0.7:8080

 

톰켓 설치 후 정상 실행 시 아래와 같이 나오면 설치 성공

간단하게 껐다 켤 수 있도록 배치 쉘을 작성한다.

[배치 Shell 작성]

 

[톰캣 시작]

vi start_tomcat.sh

#!/bin/sh
./tomcat-9.0.68/bin/startup.sh

[톰켓 중지]

vi stop_tomcat.sh

#!/bin/sh

PIDS=`ps -eaf|grep startup.Bootstrap | grep -v grep | grep tomcat | awk '{print $2}'`
## process still running..

for p in ${PIDS}
do
    if [ ! -z ${p} ] && [ ${p} -gt 0 ];then
        echo "kill -9 ${p}"
        kill -9 ${p};
    else
        echo "no tomcat process"
    fi
done

 

[소스 압축해제]

여기선 톰켓 단독인 경우 아파치 + 톰켓 인경우 둘로 나누어 놨다.

지금은 아파치+톰켓이니까 was / html 분리 압축해제를 넣도록 하자.

vi extract_files.sh

#톰켓 단독
#!/bin/sh

ZIP_FILES=`ls -al|grep WebContent.zip | grep -v grep | awk '{print $9}'`

# -z the length of STRING is zero
if [ -z "$ZIP_FILES" ]; then
   echo "there is nothing WebContent.zip file"
   exit 1
fi

for ZIP_FILE in ${ZIP_FILES}
do
    if [ ! -z ${ZIP_FILE} ];then
        echo "unzip -o ${ZIP_FILE}"

        unzip -o ${ZIP_FILE};

        # chang mode all file
        chmod -R 755 WebContent

        # move was files
        rm -rf ./ROOT/*
        mv ./WebContent/* ./ROOT

        # delete workdir
        rm -rf WebContent
    else
        echo "no tomcat process"
    fi
done
vi extract_files.sh

#WAS / HTML 분리 압축해제
#!/bin/sh

ZIP_FILES=`ls -al|grep WebContent.zip | grep -v grep | awk '{print $9}'`

# -z the length of STRING is zero
if [ -z "$ZIP_FILES" ]; then
   echo "there is nothing WebContent.zip file"
   exit 1
fi

for ZIP_FILE in ${ZIP_FILES}
do
    if [ ! -z ${ZIP_FILE} ];then
        echo "unzip -o ${ZIP_FILE}"

        unzip -o ${ZIP_FILE} -d WebContent;

        # chang mode all file
        chmod -R 755 WebContent

        _BASE_DIR="WebContent"

        if [ -d "WebContent/WebContent" ]; then
            _BASE_DIR="WebContent/WebContent"
        fi

        echo ${_BASE_DIR}]

        # move was files

        rm -rf ./ROOT/*
        mv ${_BASE_DIR}/META-INF ./ROOT
        mv ${_BASE_DIR}/WEB-INF ./ROOT

        # move html files
        rm -rf ./html/*
        mv ${_BASE_DIR}/* ./html

        # delete workdir
        rm -rf WebContent
    else
        echo "no zip file process"
    fi
done

[디플로이]

아래 deploy.sh을 실행하면 위에서 작성한 쉘 스크립트를 차례대로 실행할 것이다.

 

1. 톰캣 중지

2. 압축해제

3. 톰캣 시작

4. 옵션(업로드한 압축파일을 삭제할지)

vi deploy.sh

#!/bin/sh

# kill tomcat
./stop_tomcat.sh

# extract file
./extract_files.sh

# start tomcat
./start_tomcat.sh

# Dlete ZIP
#rm WebContent.zip

 

[아파치 설치 및 세팅]

1. [Apache Install]

sudo apt install apache2 -y

아파치설치

인터넷 브라우저 : 192.168.0.7(기본 80)

 

아파치의 디폴트 페이지가 정상적으로 나온다면 아파치 기본 설치 성공

 

설정하는 동안 서비스 종료

sudo systemctl stop apache2


2. [Apache Modul Set]
설치확인

ll /etc/apache2/

모듈 활성화

sudo a2enmod access_compat
sudo a2enmod allowmethods
sudo a2enmod asis
sudo a2enmod auth_basic
sudo a2enmod authn_core
sudo a2enmod authn_file
sudo a2enmod authz_core
sudo a2enmod authz_groupfile
sudo a2enmod authz_host
sudo a2enmod authz_user
sudo a2enmod autoindex
sudo a2enmod dir
sudo a2enmod env
sudo a2enmod headers
sudo a2enmod include
sudo a2enmod isapi
sudo a2enmod log_config
sudo a2enmod log_debug
sudo a2enmod mime
sudo a2enmod negotiation
sudo a2enmod lbmethod_bybusyness
sudo a2enmod lbmethod_byrequests
sudo a2enmod lbmethod_bytraffic
sudo a2enmod lbmethod_heartbeat
sudo a2enmod proxy
sudo a2enmod proxy_ajp
sudo a2enmod proxy_balancer
sudo a2enmod proxy_connect
sudo a2enmod proxy_express
sudo a2enmod proxy_fcgi
sudo a2enmod proxy_fdpass
sudo a2enmod proxy_ftp
sudo a2enmod proxy_http
sudo a2enmod proxy_http2
sudo a2enmod proxy_scgi
sudo a2enmod proxy_wstunnel
sudo a2enmod session
sudo a2enmod session_cookie
sudo a2enmod session_crypto
sudo a2enmod session_dbd
sudo a2enmod setenvif
sudo a2enmod slotmem_shm
sudo a2enmod socache_shmcb
sudo a2enmod ssl
sudo a2enmod vhost_alias


proxy 환경에서 Client IP 얻기

sudo a2enmod remoteip


맨 밑줄에 추가

sudo vi -b /etc/apache2/apache2.conf
.
.
SetEnvIf X-Forwarded-For "^(d{1,3}+.d{1,3}+.d{1,3}+.d{1,3}+).*" XFF1STIP=$1


3. [Apache security]

sudo vi -b /etc/apache2/conf-available/security.conf


ServerTokens Prod
ServerSignature Off
TraceEnable Off

... 맨 밑줄 추가
Header set X-Content-Type-Options: "nosniff"
Header set X-Frame-Options: "sameorigin"
Header set Content-Security-Policy:  "script-src * 'self' 'unsafe-inline' 'unsafe-eval' "
Header set X-XSS-Protection: "1;mode=block"
Header set Strict-Transport-Security: "max-age=31536000; includeSubDomains; preload;"
Header set Cache-Control: "no-store, no-cache, must-revalidate"
Header set Cache-Control: "post-check=0, pre-check=0"
Header set Pragma: "no-cache"

아파치 conf 수정

sudo vi -b /etc/apache2/apache2.conf

<Directory />
    Options IncludesNOEXEC
    AllowOverride None
    Require all denied
</Directory>

<Directory /var/www/>
    AllowOverride None
    Require all granted
</Directory>


4. [Apache Virtualhost]
 * 000-default.conf 수정 

sudo vi -b /etc/apache2/sites-available/000-default.conf

 

인증서는 아직 없으므로 기본으로 한다.

 

아래는 각 was에서 호출될 task 맵핑을 해주면 된다. 이클립스에서 구동 시 web.xml의 내용과 같다고 보면 된다.

<VirtualHost *:80>
    #ServerName naver.co.kr
  
    DocumentRoot /var/www/html

       ##http --> https 리다이렉트
       #RewriteEngine On
       #RewriteCond %{HTTPS} !=on
       #RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R,L]

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

    <Proxy *>
        Order deny,allow
        Allow from all
    </Proxy>
     
    ## doTask 설정
    ProxyPass /doTask http://localhost:8080/doTask
    ProxyPassReverse /doTask http://localhost:8080/doTask
    <Location /doTask>
        Order allow,deny
        Allow from all
    </Location>
    
    ## upload 설정
    ProxyPass /upload http://localhost:8080/upload
    ProxyPassReverse /upload http://localhost:8080/upload
    <Location /upload>
        Order allow,deny
        Allow from all
    </Location>

    ## download 설정
    ProxyPass /download http://localhost:8080/download
    ProxyPassReverse /download http://localhost:8080/download
    <Location /download>
        Order allow,deny
        Allow from all
    </Location>
    
    ## login 설정
    ProxyPass /login http://localhost:8080/login
    ProxyPassReverse /login http://localhost:8080/login
    <Location /login>
        Order allow,deny
        Allow from all
    </Location>
    
    ## timestamp 설정
    ProxyPass /timestamp http://localhost:8080/timestamp
    ProxyPassReverse /timestamp http://localhost:8080/timestamp
    <Location /timpstamp>
        Order allow,deny
        Allow from all
    </Location>

    ## doMngTask 설정
    ProxyPass /doMngTask http://localhost:8080/doMngTask
    ProxyPassReverse /doMngTask http://localhost:8080/doMngTask
    <Location /doMngTask>
        Order allow,deny
        Allow from all
    </Location>

    # Put this in the main section of your configuration (or desired virtual host, if using ASSLEnginepache virtual hosts)
    ProxyRequests Off
    ProxyPreserveHost On
</VirtualHost>


5. [Apache Grammar check]
설정 파일의 문법을 검사한다.

apachectl -t

아래와 같이 Syntax OK가 나와야 한다. 메시지가 추가된 이유는 Servername을 설정 안 해줘서 그렇다.

(실행시키는데 문제없으므로 넘어간다. 추후 도메인이 나오면 입력)

 

메시지를 구글 번역기로 돌려보면 이렇게 나온다.

apache2: 127.0.1.1을 사용하여 서버의 정규화된 도메인 이름을 안정적으로 결정할 수 없습니다. 이 메시지를 표시하지 않으려면 'ServerName' 지시문을 전역적으로 설정하십시오.


6. [Apache Start Server]

/*------------------------------------------------------------------------------
 * 아파치 시작 한번 시작하면 다시 재부팅할 일 거의 없다. restart 재시작
 *----------------------------------------------------------------------------*/

sudo systemctl start apache2

/*------------------------------------------------------------------------------
 * 서비스 활성화 (부팅 시 자동 구동)
 *----------------------------------------------------------------------------*/

sudo systemctl enable apache2

7. [Tomcat Configuration]

setenv.sh 파일 생성 메모리 튜닝 및, 서버 구동 속도 증가, ip4 주소 설정

vi -b tomcat-9.0.68/bin/setenv.sh

export JAVA_OPTS="$JAVA_OPTS -server"
export JAVA_OPTS="$JAVA_OPTS -Xms512m"
export JAVA_OPTS="$JAVA_OPTS -Xmx512m"
export JAVA_OPTS="$JAVA_OPTS -Djava.security.egd=file:/dev/./urandom"
export JAVA_OPTS="$JAVA_OPTS -Djava.net.preferIPv4Stack=true"
export JAVA_OPTS="$JAVA_OPTS -Dfile.encoding=UTF-8"

 

server.xml Connector 수정 new io 기능 사용하게 변경

vi -b tomcat-9.0.68/conf/server.xml

<?xml version="1.0" encoding="UTF-8"?>
<Server port="8005" shutdown="SHUTDOWN">
	<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
	<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
	<Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
	<Service name="Catalina">
		<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
		<Engine name="Catalina" defaultHost="localhost">
			<Host name="localhost"  appBase="webapps" unpackWARs="true" autoDeploy="true">
				<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t &quot;%r&quot; %s %b" />
			</Host>
		</Engine>
	</Service>
</Server>


8. [Apache Change Ownner]


아파치 html 폴더 권한 변경

chown으로 디렉터리의 소유권을 변경하면 디렉토리는 소유권이 변경되지만 디렉토리 속의 파일은 그대로 유지됩니다. -R(recursice) 옵션을 사용하면 파일의 소유권도 함께 변경합니다.

 

아파치 서버는 root 권한이기에 tomcat 계정이 html 정적인 파일들을 삭제, 수정, 등록할 수 있도록 폴더의 소유권도 함께 변경해준다.

 

[/var/www/html 소유권 변경]

sudo chown -R tomcat:tomcat /var/www/html

 

[/home/tomcat/ 에 심볼릭 링크 설정]

ln -s /var/www/html /home/tomcat/html


[ /home/tomcat 에 톰캣 Was 심볼릭 링크 생성]]
/*------------------------------------------------------------------------------
 * /home/tomcat 에 톰캣 Was 심볼릭링크생성
 *----------------------------------------------------------------------------*/

ln -s tomcat-9.0.68/webapps/ROOT /home/tomcat/ROOT

 

9. [Tomcat Remove Folder]

 

불필요한 톰켓 안의 폴더나 파일들을 모두 삭제한다.

rm -rf tomcat-9.0.68/webapps/docs
rm -rf tomcat-9.0.68/webapps/host-manager
rm -rf tomcat-9.0.68/webapps/examples
rm -rf tomcat-9.0.68/webapps/manager

ROOT 안에도 깔끔히 삭제

폴더가 깔끔히 정리되었다면 이제 was와 html의 소스를 각각 분리해서 넣어보자

 

[아파치 웹서버 HTML]

아래와 같이 정적인 파일들을 넣는다.

 

ROOT -> WAS

WEB-INF 밑에 프로퍼티와 클래스 파일 등이 위치하면 된다.

 

파일들을 업로드하였다면 이제 실행시켜보도록 하자.

1. 아파치 서버 실행

2. 톰캣 중지 / 톰켓 시장

sudo systemctl start apache2

./stop_tomcat.sh
./start_tomcat.sh

 

80 : 아파치

8080 : 톰켓 Was

8005 : was shutdown port

443 : https

 

Port 확인

netstat -tnlp

모든 포트가 정상적으로 열렸다.

 

혹시 웹 사이트를 구동하는데 필요한 포트가 안 열렸다면 다시 켜보자

 

마지막으로 정상적으로 포트가 떴는지 확인해 본다.

 

443 포트는 아파치 모듈 a2enmod ssl를 설치해서 생긴 것 같다.

 

인증서를 설치해야 한다면 아래와 같이 설정해주면 된다.

sudo vi -b /etc/apache2/sites-available/default-ssl.conf

<IfModule mod_ssl.c>
    <VirtualHost _default_:443>
        ServerAdmin webmaster@localhost

        DocumentRoot /var/www/html
        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

        SSLEngine off
        #SSLEngine on
        
        SSLProtocol all -SSLv2
        SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5:!SEED:!IDEA
        #SSLCertificateFile  /home/tomcat/Sainmarket.salesdata.co.kr.pfx.crt
        #SSLCertificateKeyFile /home/tomcat/Sainmarket.salesdata.co.kr.pfx.key
	 SSLCertificateFile	/etc/ssl/certs/ssl-cert-snakeoil.pem
	 SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
        BrowserMatch "MSIE [2-5]" \
                 nokeepalive ssl-unclean-shutdown \
                 downgrade-1.0 force-response-1.0

        ProxyRequests Off
        ProxyPreserveHost On

        <Proxy *>
            Order deny,allow
            Allow from all
        </Proxy>

        ## doTask 설정
        ProxyPass /doTask http://localhost:8080/doTask
        ProxyPassReverse /doTask http://localhost:8080/doTask
        <Location /doTask>
            Order allow,deny
            Allow from all
        </Location>
        
        ## upload 설정
        ProxyPass /upload http://localhost:8080/upload
        ProxyPassReverse /upload http://localhost:8080/upload
        <Location /upload>
            Order allow,deny
            Allow from all
        </Location>
        
        ## download 설정
        ProxyPass /download http://localhost:8080/download
        ProxyPassReverse /download http://localhost:8080/download
        <Location /download>
            Order allow,deny
            Allow from all
        </Location>
        
        ## login 설정
        ProxyPass /login http://localhost:8080/login
        ProxyPassReverse /login http://localhost:8080/login
        <Location /login>
            Order allow,deny
            Allow from all
        </Location>
        
        ## timestamp 설정
        ProxyPass /timestamp http://localhost:8080/timestamp
        ProxyPassReverse /timestamp http://localhost:8080/timestamp
        <Location /timpstamp>
            Order allow,deny
            Allow from all
        </Location>
        
        ## doMngTask 설정
        ProxyPass /doMngTask http://localhost:8080/doMngTask
        ProxyPassReverse /doMngTask http://localhost:8080/doMngTask
        <Location /doMngTask>
            Order allow,deny
            Allow from all
        </Location>
    </VirtualHost>
</IfModule>

브라우저를 실행한 후 주소창에 아이피 입력

 

정적인 화면은 아파치 서버로 연동된 것이다. 톰캣을 stop 해도 아래 화면은 계속 보일 것이다. 아파치 서버가 실행 중이기 때문에

 

톰켓 서버가 제대로 작동을 안 하거나 중지돼있으면 크롬의 console.log에 503 에러가 뜰 것이다.

아래와 같이

[톰켓 서버 중지]

확인

[톰켓 서버 시작]

톰켓서버 실행 후 톰켓 was도 테스트

 

로긴도 정상적으로 성공 

 

여기까지가 아파치 + 톰캣 연동이다. DB 서버는 다른 서버에 이미 있었으니 3 티어라고 봐도 무방하겠다.

 

그럼 끝

 

오늘도 보람찬 생존 ^.^ 

반응형

'리눅스 > Ubuntu' 카테고리의 다른 글

루트 권한 없이 80 포트 실행하기  (0) 2024.02.29
형태소 분석기 설치 및 적용  (0) 2023.07.05
우분투 서버 22.04 설치  (0) 2022.11.03
서버모니터링  (0) 2022.08.12
Crontab  (0) 2022.07.27

댓글