본문 바로가기

목록이 없습니다.

[Apache2 + Tomcat] 준비중(점검중) 페이지 설정

Server

    Apache

     

    Apache 모듈 중 Rewrite를 통해서 준비중 페이지로 넘겨줄 URI들을 매칭하여 넘겨주면 된다. Apache만 사용했더라면 간단하게 끝났을 것 같던 작업인데 내 경우에는 Apache로 웹서버 역할을 하고 뒤에 WAS는 Tomcat으로 구성하고 있었다.

     

    서버 환경
    Ubuntu 18.04.6 LTS
    apache 2.4.18-2ubuntu3.17
    apache-tomcat-9.0.52

    서버 구조
    Client(브라우저) -> Apache (SSL) -> Tomcat

    참고 자료
    Apache SSL 설정 방법
    Apache Tomcat 연동 방법
    Apache Tomcat 연동 시 에러

     

    Tomcat이랑 연동되어 있어서 단순하게 Rewrite 로 처리하려면 지저분하게 뒤에 포트를 붙이는 방법밖에는 떠오르지 않았다..

     

    초기 설정파일 내용 (삽질주의)

    # HTTP access
    <VirtualHost *:80>
            ServerName 서버도메인
            #JkMount /* tomcat1
    
            CustomLog ${APACHE_LOG_DIR}/access.log combined
            ErrorLog ${APACHE_LOG_DIR}/error.log
    
            RewriteEngine off
            RewriteCond "%{HTTPS}" "!on"
            RewriteRule ^.+ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
    </VirtualHost>
    
    # HTTPS access
    <VirtualHost *:443>
            ServerName 서버도메인
            JkMount /* tomcat1
    
            SSLEngine on
            SSLProxyEngine on
            SSLCertificateKeyFile Key파일위치
            SSLCertificateFile 인증서파일위치
            SSLCACertificateFile CA파일위치
    
            CustomLog ${APACHE_LOG_DIR}/ssl_access.log combined
            ErrorLog ${APACHE_LOG_DIR}/ssl_error.log
    
            RewriteEngine on
            RewriteRule ^.+ https://서버도메인:19090/ [R,L]
    </VirtualHost>
    
    <VirtualHost *:19090>
            ServerName 서버도메인
            DocumentRoot /var/www/html/uc
    </VirtualHost>

     

    Apache 웹서버에 준비중입니다 페이지 리소스를 올리고 해당 경로를 DocumentRoot로 셋팅해야되겠다는 생각부터 해서 그런지 저런 방법밖에 떠오르지 않았다...

     

    자료 조사를 열심히 하다가.. 갓글님의 도움을 받아 조금 더 나은 방법을 떠올리게 되었다.

     

    조금 더 나은 방법

    우선 Apache 웹 서버에 올려두었던 준비중입니다 페이지의 리소스(html, css, image)를 Tomcat에 올라가는 소스로 넣고 경로를 잡아준 후에 (내 경우에는 Spring Framework를 사용하기 때문에 Controller로 잡아주었음) Apache에서 Rewrite를 통해 해당 Controller URI로 넘겨주는 방법이다.

     

    소스는 넣어서 Tomcat에 반영이 되어있다는 가정 하에 Apache 설정만 보면 아래와 같다.

    # HTTP access
    <VirtualHost *:80>
            ServerName 서버도메인
            #JkMount /* tomcat1
    
            CustomLog ${APACHE_LOG_DIR}/access.log combined
            ErrorLog ${APACHE_LOG_DIR}/error.log
    
            RewriteEngine off
            RewriteCond "%{HTTPS}" "!on"
            RewriteRule ^.+ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]
    </VirtualHost>
    
    # HTTPS access
    <VirtualHost *:443>
            ServerName 서버도메인
            JkMount /* tomcat1
    
            SSLEngine on
            SSLProxyEngine on
            SSLCertificateKeyFile Key파일위치
            SSLCertificateFile 인증서파일위치
            SSLCACertificateFile CA파일위치
    
            CustomLog ${APACHE_LOG_DIR}/ssl_access.log combined
            ErrorLog ${APACHE_LOG_DIR}/ssl_error.log
    
            RewriteEngine on
            RewriteCond "%{REQUEST_URI}" "(/|hs)$" #페이지 요청인 경우만
            RewriteCond "%{REQUEST_URI}" "!^/common/ready.hs$" # 준비중 입니다. 페이지 제외
            RewriteCond "%{REMOTE_ADDR}" "!^회사아이피$" # 테스트를 위해서 회사 IP 제외 (ex- 1\.2\.3\.4)
            RewriteRule ^.+ https://서버도메인/common/ready.hs [R,L]
    </VirtualHost>

     

    이런 방식으로 Apache 웹 서버에서 Rewrite 모듈을 통해 준비중입니다 페이지를 띄웠다.

    CI/CD 통해서 사용자 입장에서는 모르도록 반영하는게 가장 좋지만 상황상 그럴 수 없는 경우 이렇게 점검 페이지를 띄워주는것만으로도 서비스 운영 관점에서 좋은 것 같다.

     

     

    쉘 스크립트

    서버 관리자 입장에서 좀 더 편하게 Rewrite를 껐다 켰다 하기 위해 쉘 스크립트를 하나 만들어서 누가 관리하던 on/off를 좀 더 편하게 할 수 있게 제공하려고 한다.

    rewrite_mode_on.sh

    #!/bin/sh
    
    echo "modify 000-default.conf [RewriteEngine ON]"
    sed -i "s/RewriteEngine off/RewriteEngine on/g" /etc/apache2/sites-available/000-default.conf # 각자 설정파일 위치를 잡아줘야함.
    
    echo "restart service apache2 to apply configure"
    service apache2 restart
    
    echo "complete!"

     

    rewrite_mode_off.sh

    #!/bin/sh
    
    echo "modify 000-default.conf [RewriteEngine OFF]"
    sed -i "s/RewriteEngine on/RewriteEngine off/g" /etc/apache2/sites-available/000-default.conf # 각자 설정파일 위치를 잡아줘야함.
    
    echo "restart service apache2 to apply configure"
    service apache2 restart
    
    echo "complete!"

     

    rewrite_mode_on.sh 스크립트를 실행하면 러닝중인 서버의 어느 페이지를 접근하더라도 준비중 또는 점검중 페이지가 사용자에게 제공될 것이다.

     

     

    삽질

    • 기존 서버에 iptables로 포트가 라우팅 되어 있어서 해당 iptables 정책을 제거해야하는데, 삭제 명령어를 등록 시 어떤 내용으로 했는지 알아야만 하는 명령어만 알고 있어서 --line-numbers로 나오는 순번을 통해 삭제하는 방법을 찾아서 삭제해줌..  (정리한 내용 : https://steady-snail.tistory.com/314)
    • Apache 서버를 자주 운용해오던게 아니어서 이번에 설정하면서 Rewrite처럼 간단한것도 엄청 해메어서 시간을 많이 잡아먹음..
    • Apache 서버에 리소스를 올려두고 깔끔하게(도메인 주소 뒤에 포트없이) 처리하려고 머리 굴리다가 빠개질뻔.

     

    참고

    Apache 서버 에러 (Forbidden You don't have permission to access this resource.)

    https://mytory.net/archives/3143