Apache [WS] 와 Tomcat[WAS]을 mod_jk로 연결하기 / RHEL 사용

Denia·2023년 8월 5일
0

AWS EC2를 사용하여 Apache [WS] 와 Tomcat[WAS]을 구성했습니다.

Apache[WS] 설치

  • EC2 생성
    • 인스턴스 생성
    • 이름
      • ws
    • OS 이미지
      • Red Hat Enterprise Linux 9 (HVM), SSD Volume Type
    • 인스턴스 유형
      • t2.micro
    • 네트워크 설정
      • 보안 그룹 생성
        • SSH 트래픽 허용 - 위치 무관
        • 인터넷에서 HTTP 트래픽 허용
    • 스토리지 구성
      • 30GB
  • EC2 접속 후 환경설정
    • net-tools 설치
      • yum install net-tools
    • 권한이 없다고 뜨면 모든 명령어 앞에 sudo 를 붙여주면 된다
      • 예시 ) sudo yum -y update
    • Apache 설치
      # Apache 설치 , ※Apache 기본 설치 Directory : /etc/httpd
      # 참고 : https://ko.linux-console.net/?p=2178
      yum -y update
      yum install httpd -y
      
      # httpd 실행
      systemctl start httpd
      # 시스템 부팅이 될 때마다 무조건 httpd 켜지게 하기
      systemctl enable httpd
      # httpd 실행 상태 확인
      systemctl status httpd
      
      # netstat을 통해 httpd 가 80포트를 사용중인지 확인!
      netstat -tnlp
    • Apache 에 제대로 접속이 가능한지 테스트 진행
      • httpd 가 기본적으로 읽는 Directory는 /var/www/html

      • /var/www/html 안에 임의로 만든 index.html 을 넣고 테스트 해보자.

        # 테스트 방법
        
        # /var/www/html 로 접근
        cd /var/www/html
        # html을 하나 만들자
        touch index.html
        # index.html 에 들어가서 내가 알아볼 수 있는 내용 수정
        vi index.html
        
        # http://{AWS EC2 WS 서버 IP} 접속 후, index.html에 적은 내용이 보이는지 확인
      • 여기서 데이터를 읽지 못한다면 권한 문제가 있을 수 있다.

        • ls -al 을 통해 권한을 확인하자 r 권한이 있어야 브라우에서 확인이 가능하다.
        • sudo chmod 744 index.html 로 읽기 권한을 부여하자.
    • 아파치 환경설정 파일
      • vi /etc/httpd/conf/httpd.conf

        # ServerName 설정 - 필요한 이름으로
        ServerName example:80
        
        # 사용하는 DocumentRoot에 맞춰서 설정
        <Directory "/home/example">
            AllowOverride None
            # Allow open access:
            Require all granted
        </Directory>
        
        # Apache의 Response Header 에서 Apache 버전 정보 제거하기
        #	- 하지 않으면 버전 유추로 인해서 해킹의 위험성 올라감!!
        # 파일 맨 마지막에 해당 내용 추가
        ServerTokens Prod
        ServerSignature off
    • 해당 파일 혹은 VirtualHostDocumentRoot 설정시 /var/www/html 말고 다른 경로를 사용할 경우 접속시 Forbidden 이 뜰 수 도 있다.

      You don't have permission to access this resource.

 # 직접 끄기
vi /etc/sysconfig/selinux

SELINUX=enforcing → disabled [ 비활성화 ]
  • 잠시 끄기 [재부팅시까지 꺼두기]
# 현재 SELinux의 동작 모드 확인
getenforce

# Enforce 라면 Permissive 모드 로 변경하기
sudo setenforce 0

# 현재 SELinux의 동작 모드 다시 확인 - Permissive 인지 확인
getenforce
  • 내가 지정한 폴더의 보안정책을 새롭게 설정
# 하나의 파일이나 디렉터리를 변경할 경우
chcon -t httpd_sys_content_t /example/test

# chmod와 같이 하위 파일이나 디렉터리를 모두 변경할 경우
chcon -R -h -t httpd_sys_content_t /example/test

# -R : 하위 모든 파일과 디렉터리의 보안사항을 변경한다.
# -h : 심볼릭링크를 따르지 않도록 한다.

Tomcat[WAS] 설치

  • EC2 생성

    • 인스턴스 생성
    • 이름
      • was
    • OS 이미지
      • Red Hat Enterprise Linux 9 (HVM), SSD Volume Type
    • 인스턴스 유형
      • t2.micro
    • 네트워크 설정
      • 보안 그룹 생성
        • SSH 트래픽 허용 - 위치 무관
    • 스토리지 구성
      • 30GB
  • EC2 접속 후 환경설정

    • net-tools 설치
      • yum install net-tools
    • 권한이 없다고 뜨면 모든 명령어 앞에 sudo 를 붙여주면 된다
      • 예시 ) sudo yum -y update
    • JDK 설치 - ★★★ 꼭 꼭 사용하시는 Tomcat의 JDK 버전을 확인하고 진행해주세요!!! ★★★
      # jdk1.8
      yum -y update
      yum list java*jdk-devel
      yum install java-1.8.0-openjdk-devel.x86_64 -y
      # openjdk version "1.8.0_332" 나오는지 확인
      java -version 
    • 환경변수 수정
      vi /etc/profile
      
      # 해당 내용으로 수정
      JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.332.b09-1.el7_9.x86_64
      JRE_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.332.b09-1.el7_9.x86_64/jre
      CATALINA_HOME=/usr/local/tomcat
      CLASSPATH=$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar:$CATALINA_HOME/lib-jsp-api.jar:$CATALINA_HOME/lib/servlet-api.jar 
      PATH=$PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin:/bin:/sbin
      export JAVA_HOME JRE_HOME CATALINA_HOME CLASSPATH PATH
    • profile 적용
      • source /etc/profile
    • Tomcat 설치 [톰캣 버전은 10.0.8 로 다운받아서 진행]
      yum install wget -y
      wget http://archive.apache.org/dist/tomcat/tomcat-10/v10.0.8/bin/apache-tomcat-10.0.8.tar.gz
      
      mv apache-tomcat-10.0.8.tar.gz /usr/local/
      cd  /usr/local/
      tar -xzvf /usr/local/apache-tomcat-10.0.8.tar.gz
      
      #심볼릭 링크 
      ln -s /usr/local/apache-tomcat-10.0.8 /usr/local/tomcat
      
      ln -s /usr/local/tomcat /root/tomcat
      #톰캣 구동 프라퍼티 설정
      vi /usr/local/tomcat/bin/setenv.sh 
      
      # 둘 중 택 1 - Tomcat에서 WAR를 시작할때 setenv.sh 파일을 읽어서 구동을 합니다.
        # dev
        export JAVA_OPTS="$JAVA_OPTS -Dspring.profiles.active=dev -Duser.language=ko -Duser.country=KR"
        
        # prod 
        export JAVA_OPTS="$JAVA_OPTS -Dspring.profiles.active=prod -Duser.language=ko -Duser.country=KR"
      
      chmod +x /usr/local/tomcat/bin/setenv.sh 
      
      #mod_jk는 ajp 프로토콜을 사용합니다.
      #톰캣이 mod_jk 연결을 받을 수 있도록 tomcat 환경설정 수정
      vi /usr/local/tomcat/conf/server.xml 
      
      #아래 부분 찾아서 주석 제거해주고, secretRequired="false"부분 추가 
      <Connector protocol="AJP/1.3"
                 address="0.0.0.0"
                 port="8081"
                 redirectPort="8443" secretRequired="false" />
      
      #톰캣 서버 정보 노출 하지 않기
      #톰캣으로 직접 접속하지 않는 경우 (mod_jk 쓰는 경우) : 해당 부분 주석처리하기.
      #톰캣으로 직접 접속하는 경우 : server="Server" 추가
      <Connector port="8080" protocol="HTTP/1.1" ...
      
      #톰캣 스타트 
      /usr/local/tomcat/bin/startup.sh 
      
      #톰캣 종료 
      /usr/local/tomcat/bin/shutdown.sh 
  • AWS EC2 WAS 서버 인바운드 포트에 내가 mod_jk로 설정한 포트 (8081) 열어주기 - 할당할 IP는 WS IP 주소로 할당

  • 업로드할 WAR 파일의 이름이 "ROOT" 가 아니라면, 직접 파일명을 server.xml에 추가해줘야 한다.

    # Tomcat의 server.xml 파일을 연다
    sudo vi /usr/local/tomcat/conf/server.xml
    
    # Host 태그를 찾는다. <Host name="localhost"  appBase="webapps" unpackWARs="true" autoDeploy="true">
    
    # Host 태그 밑에 해당 내용을 추가한다.
    # 그리고 docBase에는 원하는 파일명을 넣는다. 예시 ) example-SNAPSHOT1.war 파일을 사용할 경우
    <Context path="/" docBase="example-SNAPSHOT1"  reloadable="false" > </Context>
    
    # Tomcat 재시작
    sudo /usr/local/tomcat/bin/shutdown.sh
    sudo /usr/local/tomcat/bin/startup.sh
  • WAR 배포가 잘 되지 않는다면 Tomcat의 버전을 확인해야 합니다. Tomcat이 사용하는 JDK 버전이 11로 올라가면서 JavaEE를 Jakarta로 사용하게 되면서 호환이 잘 안됩니다.

해당 글을 참고해주세요

Tomcat war 배포시 주의사항

WS에 mod_jk 설치 후 세팅

  • WS에 mod_jk 설치
    • 참고
    • 먼저 wget을 다운로드 받는다
      • yum install wget -y
    • 설치 후 압축을 푼다
      • tar xvfz tomcat-connectors-1.2.48-src.tar.gz
    • tomcat-connectors-1.2.48-src / native 폴더에 들어간다
      • cd tomcat-connectors-1.2.48-src/native/
    • 필요한 파일들을 설치
      • apxs(APache eXtenSion)httpd-devel 이 필요합니다.
        • sudo yum install httpd-devel
      • gcc가 필요합니다. 없으면 설치합니다.
        • sudo yum install gcc
    • configure 를 시킨다.
      • ./configure --with-apxs=/usr/bin/apxs
    • redhat-rpm-config 를 설치
      • sudo dnf install redhat-rpm-config
    • 컴파일 합니다.
      • make
    • 파일을 확인합니다.
      • file apache-2.0/mod_jk.so
      • 다음과 같이 나오는 지 확인
        • apache-2.0/mod_jk.so: ~~~
    • Apache 모듈 디렉토리로 복사합니다.
      • sudo cp apache-2.0/mod_jk.so /usr/lib64/httpd/modules/
    • /etc/httpd/conf.d 로 이동
      • sudo cd /etc/httpd/conf.d
    • httpd-jk.conf 파일을 만들어준다.
      • sudo touch httpd-jk.conf
    • httpd-jk.conf 파일에 해당 내용을 넣는다.
      LoadModule jk_module modules/mod_jk.so
      
      <IfModule jk_module>
        JkWorkersFile conf.d/workers.properties
        JkLogFile logs/mod_jk.log
        JkLogLevel info
        #JkShmFile 내용 반드시 넣어줄 것 - Selinux 보안때문에 공유 메모리파일 위치 반드시 명시해야함
        JkShmFile run/mod_jk.shm
        JkMountFile conf.d/uriworkermap.properties
      </IfModule>
    • workers.properties 파일을 만들어준다.
      • sudo touch workers.properties
    • workers.properties 파일에 해당 내용을 넣는다.
      worker.list=exampleWorker # 사용할 worker 이름
      
      worker.secbank.type=ajp13 # AJP 1.3
      worker.secbank.host=192.168.0.2 # 연결할 WAS의 IP로 변경한다.
      worker.secbank.port=8081 # 연결한 port
    • uriworkermap.properties 파일을 만들어준다.
      • sudo touch uriworkermap.properties
    • uriworkermap.properties 파일에 해당 내용을 넣는다.
      # 예시
      # 확장자가 do 및 jsp 인 모든 url패턴에 대해서 tomcat으로 전송
      # (ex http://example.com/test.jsp)
      #  /*.do=exampleWorker
      #  /*.jsp=exampleWorker
      
      #assets 하위 내용을 제외한 모든 요청은 tomcat으로 전송
      /*=exampleWorker 
      !/assets/*=exampleWorker 
    • SELinux를 끄고 진행할 경우 세팅
      # SELinux 를 Permisive로 변경
      setenforce 0
    • SELinux 안 끄고 진행할 경우 세팅
      • 세팅이 조금 복잡합니다.
        • 정책에 mod_jk 폴더를 추가해주셔야 하며, httpd가 통신을 할 수 있도록 설정을 바꿔주셔야 합니다.

mod_jk 연결하기

  • mod_jk 연결하기
    • /etc/httpd/conf.d 에서 mod_jk로 연결할 VirtualHost conf 파일을 연다
      • 예를 들어) example.com.conf 를 연다면
        • <VirtualHost *:80> 안에 해당 내용을 넣어주세요
          • JkMountFile conf.d/uriworkermap.properties # 필터링 할 조건의 파일을 삽입
        • workers.properties 설정도 제대로 되어있는지 재 확인 (IP 주소 및 포트)
    • AWS EC2 WAS 서버 인바운드 포트에 내가 mod_jk로 설정한 포트 (8081) 랑 IP로 열려있는지 확인
    • mod_jk 연결을 마무리 했다면 WS Apache 퍼블릭 IP로 접속 해서 WAS의 Tomcat 데이터를 잘 읽어오는지 확인
      • 혹시 Tomcat 의 데이터를 받아오지 못한다면, Tomcat 의 server.xml 을 확인해야 한다
        • 해당 부분이 제대로 되어있는지 확인, 특히 address 제대로 확인
          <!-- Define an AJP 1.3 Connector on port 8081 -->
          
              <Connector protocol="AJP/1.3"
                         address="0.0.0.0"
                         port="8081"
                         redirectPort="8443" secretRequired="false"/>

mod_jk 실행 테스트

  • mod_jk 실행 테스트
    • Apache 설정 파일을 문법 테스트 해봅니다. (Syntax OK 가 나오는지 확인)
      • apachectl configtest
    • Apache 웹서버를 시작하고 mod_jk 연동을 테스트 합니다.
      • sudo service httpd restart
    • ※ 시작이 제대로 되지 않는다면 ?
      • Error_Log를 확인해봅시다.
      • 다음 로그가 나온다면 ?
        • Initializing shm:/etc/httpd/run/mod_jk.shm.75459 errno=13. Unable to start due to shared memory failure.
        • SELinux 정책 문제입니다.
          • mod_jk.shm 를 사용하기 위해서는 해당 파일이 생성되는 폴더에 httpd_tmap, write 관련 권한이 있어야 합니다
          • 그리고 해당 포트로 통신이 가능하게 SELinux에 해당 포트를 추가해줘야함
            • sudo semanage port -a -p tcp -t http_port_t 8081
        • SELinux가 복잡해서 신경쓰기 싫으시면, SELinux를 재부팅시까지 꺼두는 옵션을 사용하면 됩니다. 다만 비추천입니다.
          • setenforce 0
    • Apache 웹서버로 브라우저에서 접근 후 Tomcat 사이트가 제대로 나온다면 ok 입니다.

※ 짜잘한 팁

※ Apache 관련 명령어

  • 아파치 시작
    • sudo service httpd start
  • 아파치 재시작
    • sudo service httpd restart
  • 아파치 종료
    • sudo service httpd stop
  • 환경설정
    • vi /etc/httpd/conf/httpd.conf

※ Vitual Host 설정

    • 참고 : https://jjeongil.tistory.com/1333
    • 기본적으로 Apache는 /etc/httpd/conf.d/ 디렉토리에서 .conf로 끝나는 모든 구성 파일을 로드하도록 구성됩니다.
      • httpd.conf 의 마지막 줄을 보면 IncludeOptional conf.d/*.conf 내용이 존재함
    1. /etc/httpd/conf.d 폴더로 들어간다.
      • cd /etc/httpd/conf.d
    2. 자기 도메인에 맞게 .conf 파일을 만든다. 예를 들면) example.com.conf 파일을 만든다.
      • sudo touch example.com.conf
    3. example.com.conf 파일에 해당 내용을 넣는다.
      • 코드
        #example.com.conf
        
        <VirtualHost *:80>
        	ServerName example.com # Virtual Host => Host로 들어오는 값이랑 비교할 값
        	ServerAlias dev.example.com www.example.com # => Alias 설정을 해주면 해당 값들도 같이 해당 가상 호스트로 잡힌다.
        	ServerAdmin webmaster@example.com
        	DocumentRoot /home/example/www # 폴더
        </VirtualHost>

※ Tomcat 관련 명령어

  • ※ Tomcat 관련 명령어
    • 톰캣 스타트
      • sudo /usr/local/tomcat/bin/startup.sh
    • 톰캣 종료
      • sudo /usr/local/tomcat/bin/shutdown.sh
    • 환경설정
      • sudo vi /usr/local/tomcat/conf/server.xml
profile
HW -> FW -> Web

0개의 댓글