728x90

기본 사항

  • 포스팅 설명을 위해 Tomcat설치 경로는 아래에 명시된 경로로 가정하고 이하 TOMCAT_HOME으로 명시
    /engn001/tomcat/9.0/servers/ist_8180
    

catalina.sh

  • Catalina.out 파일 생성 설정은 catalina.sh에 있고 경로는 다음과 같음
    TOMCATHOME/bin/catalina.sh
    

관리방법1: Catalina.out 제거

  • 첫번째 관리 방법으로 catalina.sh 파일에서 Catalina.out 생성 부분을 수정하여 Catalina.out 파일 생성을 중지함.
  • 수정 전
    • TOMCAT_HOME/logs에 Catalina.out 생성
        if [ -z "$CATALINA_OUT" ] ; then
       CATALINA_OUT="$CATALINA_BASE"/logs/catalina.out
        fi
      
  • 수정 후
    • catalina.out 생성 경로에 /dev/null 설정하여 생성을 차단
        if [ -z "$CATALINA_OUT" ] ; then
       CATALINA_OUT=/dev/null
        fi
      

관리방법2: Rolling Catalina.out

  • 두번째 방법은 OS의 기능을 활용하여 Catalina.out 파일을 Rolling 할 수 있음.
  • 설정 프로세스는 아래와 같음
    1. tomcat 파일 생성
      • 디렉토리 이동 및 파일 생성
      • [root@ ]# cd /etc/logrotate.d/
        [root@ logrotate.d]# vi tomcat
        
      • tomcat 파일 내부 스크립트 내용
      •  /logs001/tomcat/9.0/ist_8180/server.log { // Catalina.out 로그파일 경로
         copytruncate                              // 기존 파일 백업 및 삭제
         daily                                     // 로그파일을 날짜별로 Rolling
         rotate 30                                 // 최대 30일까지만 생성
         compress                                  // 로그파일 gzip 압축
         missingok                                 // 로그파일 부재시 무시함
         notifempty                                // 로그파일 부재시 신규 생성 하지 않음
         dateext                                   // 순환된 로그파일 날짜 확장자
        }
        
    2. crontab에 tomcat 파일 등록
    • 파일 열기
        [root@ logrotate.d]# vi /etc/crontab
      
    • crontab 작성
    •   SHELL=/bin/bash
        PATH=/sbin:/bin:/usr/sbin:/usr/bin
        MAILTO=root
              
        # For details see man 4 crontabs
              
        # Example of job definition:
        # .---------------- minute (0 - 59)
        # |  .------------- hour (0 - 23)
        # |  |  .---------- day of month (1 - 31)
        # |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
        # |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
        # |  |  |  |  |
        # *  *  *  *  * user-name  command to be executed
          0  0  *  *  *  root run-parts/etc/cron.daily
      
    1. 처리 프로세스
      • Rolling 수행 프로세스는 먼저 /etc/crontab 스케쥴 동작 이 설정된 시간에 맞춰 일어나고 다음으로 /etc/logrotate.conf 실행 > /etc/logrotate.d 참조 및 최종적으로 tomcat 스크립트가 실행 됨
    2. 검증 방법
      • 아래 스크립트를 수동 실행하여 설정이 잘 동작 하는지 확인
         /usr/sbin/logrotate -f/etc/logrotate.conf
    3. 생성 결과 확인
      • 기존 Catalina.out은 압축되고 신규로 Catalina.out 파일 생성 확인
         etc-user etc-user 0 Feb  3 07:34 Catalina.out
         etc-user etc-user 101491 Feb  3 07:03 Catalina.out-20200203.gz
      
    • 더불어 vi /var/log/cron 로그를 확인 하면 아래와 같이 설정된 스케쥴 시점에 cron.daily 실행 로그를 확인 할 수 있음
    •   Feb  4 00:40:01  CROND[5713]: (root) CMD (run-parts /etc/cron.daily)
        Feb  4 00:40:01  run-parts(/etc/cron.daily)[5713]: starting logrotate
        Feb  4 00:40:01  run-parts(/etc/cron.daily)[5723]: finished logrotate
        Feb  4 00:40:01  run-parts(/etc/cron.daily)[5713]: starting man-db.cron
        Feb  4 00:40:02  run-parts(/etc/cron.daily)[5736]: finished man-db.cron
        Feb  4 00:40:02  run-parts(/etc/cron.daily)[5713]: starting mlocate
        Feb  4 00:40:02  run-parts(/etc/cron.daily)[5747]: finished mlocate
      

Appendix: catalina.YYYY.MM-DD.log 제거

  • Tomcat은 Catalina.out 파일과 더불어 catalina.YYYY.MM-DD.log 형태의 로그가 생성 됨.
  • 해당 로그는 1일 단위로 Rolling되지만 Tomcat에서 생성하는 로그 외에 응용로그(log4j2, logback)은 기록하지 못하므로 활용성이 낮음
  • 아래 경로에 존재하는 logging.properties 파일을 삭제하여 생성을 막음.
    • 경로1: 별도의 인스턴스 구분 없는 경우
    •  
    • TOMCAT_HOME/conf/logging.properties
      
    • 경로2: 별도의 인스턴스를 사용하는 경우(인스턴스 경로가 TOMCAT_HOME/servers/ist_8180/ 인 경우)
    • TOMCAT_HOME/servers/ist_8180/conf/logging.properties
      

참고 자료

logrotate.d 설정 및 cron 로그 확인: https://055055.tistory.com/6

반응형
728x90

    <error-page>
        <error-code>400</error-code>
        <location>/error-40X.jsp</location>
    </error-page>
    <error-page>
        <error-code>401</error-code>
        <location>/error-40X.jsp</location>
    </error-page>
    <error-page>
        <error-code>403</error-code>
        <location>/error-40X.jsp</location>
    </error-page>
    <error-page>
        <error-code>404</error-code>
        <location>/error-40X.jsp</location>
    </error-page>
    <error-page>
        <error-code>500</error-code>
        <location>/error-50X.jsp</location>
    </error-page>
    <error-page>
        <exception-type>java.lang.Throwable</exception-type>
        <location>/error.jsp</location>
    </error-page>

반응형
728x90

[Tomcat] 톰캣 오류 처리하기 만들기 ErrorReportValve Custom Tomcat Valve

프로그램 자료/Java & Spring 2019. 10. 31. 11:31

출처1 : http://jagadesh4java.blogspot.com/2014/09/custom-error-page-in-tomcat.html

출처2 : https://aspiresoftware.in/blog/catalinatomcat-custom-error-report-valve-to-handle-errors-exceptions/

출처3 : https://github.com/theand/til-by-heesang/blob/master/md/java/tomcat_invalid_character_found_in_request.md

출처4 : https://server0.tistory.com/39

 

얼마전에 납품한 솔루션의 웹 보안 리포트를 받았다. 

특정 url에서 페이지 없음 오류가 떠야하는데 톰캣 에러가 예쁘게 뜨더라.

 

대충 이렇게?? 

 

좀 찾다보니까 톰캣 8.5.31(?) 이상, 9.0.8(?) 이상, 8.0.52(?) 버전부터는 RFC 7230, RFC 3986에 의해 특수문자를 받지 않는다고 하더라.

이미 톰캣 설정에 relaxedQueryChars를 사용하고 있어서 당당히 [] 문자를 넣었다. 

 

그런데 다음과 같은 url로 접속하면 여전히 톰캣 오류가 뜨는 증상이 있었다.

http://127.0.0.1:8080/[

 

어떻게 해야하나 고민했었는데 톰캣에서는 Valve라는 것을 자바 클래스로 만들고, 이걸 상속받아서 구현하면 가져다가 쓸 수 있다고 하더라.

 

package com.motolies.config;

 

import java.io.BufferedWriter;

import java.io.IOException;

import java.io.OutputStreamWriter;

import java.util.logging.Logger;

 

import org.apache.catalina.connector.Request;

import org.apache.catalina.connector.Response;

import org.apache.catalina.valves.ErrorReportValve;

 

public class CustomErrorReportValve extends ErrorReportValve {

 

    // Create a simple logger

private static final Logger logger = Logger.getLogger(CustomErrorReportValve.class.getName());



    @Override

    protected void report(Request request, Response response, Throwable t) {

        try {

            BufferedWriter out = new BufferedWriter(new OutputStreamWriter(response.getOutputStream(), "UTF8"));

            out.write("<!DOCTYPE html>");

            out.write("<html xmlns=\"http://www.w3.org/1999/xhtml\" xmlns:th=\"http://www.thymeleaf.org\">");

            out.write("<head>");

            out.write(" <meta charset=\"utf-8\"/>");

            out.write(" <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"/>");

            out.write(" <meta name=\"description\" content=\"\"/>");

            out.write("</head>");

            out.write("<body>   ");

            out.write(" <script type=\"text/javascript\">");

            out.write("     alert(\"비정상적인 접근입니다.\");");

            out.write("     history.back();");

            out.write(" </script>");

            out.write("</body>");

            out.write("</html>");

            out.close();

 

            // Log the error with your favorite logging framework...

     logger.severe("Uncaught throwable was thrown: " + t.getMessage());

 

        } catch (IOException e) {

            e.printStackTrace();

        }

    }

}

 

대충 위와 같은 클래스를 만들고 jar 파일로 만들어야 한다. 

 

jar는 다음과 같이 만들면 된다. 

 

 

해당 파일을 우클릭해서 Export 클릭.

 

Export type에 JAR file 선택.

 

만들어질 위치 선택하고 Finish.

 

그럼 jar파일이 만들어지는데 이것을 다음의 경로에 복사한다.

 

..\tomcat\lib

 

아마 이미 많은 jar파일들이 있을 것이다. 

 

마지막으로 tomcat\conf\server.xml 에서 수정을 좀 해야한다. 

 

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

errorReportValveClass="com.motolies.config.CustomErrorReportValve">

<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>

 

다음과 같이 빨간색 부분을 추가해주고 톰캣을 재시작하면 된다.

 

 

반응형
728x90

출처 : http://kogun82.tistory.com/88


probe  설치


1. psi-probe를 다음의 홈 페이지에서 다운 받는다.(http://code.google.com/p/psi-probe/)


2. 다운 받은 압축 파일을 해제하고 나면 probe.war 파일을 확인 할 수 있다.


3. Tomcat manager에 접속하여 probe.war 파일을 선택하여 업로드하고, deploy를 실행한다.


4. deploy가 완료되면 http://loclahost:8080/probe/ 에 접속하여 확인 할 수 있다. 접속 시 필요한 계정 정보는 Tomcat manager에 계정과 동일하다.





반응형
728x90

출처 : http://stevenjsmin.tistory.com/103


문제점

Linux(혹은 Unix)에서는 1024번 이하의 포트가 보안상의 이유로 root권한을 가지고 있는 로세스만이 포트를 선점할 수 있다.(root reserved ports) root계정이 아닌 일반계정으로 Tomcat을 서비스 할 때정상적으로 Tomcat의 리스너(Listener)가 동작하지 않음을 TOMCAT LOG(logs/catalina.out)를 
통하여 확인 할 수 있다

 

2009. 12. 15 오후 4:14:31 org.apache.coyote.http11.Http11Protocol init
심각: Error initializing endpoint
java.net.BindException: Permission denied<null>:80

 

따라서 일반계정으로 Tomcat 80번 포트(HTTP 기본포트)에서 서비스 하려 한다면, Tomcat HTTP Connector Port 1024이상의 포트번호로 지정해준 뒤80포트로의 모든 인바운딩을 Tomcat HTTP Connector Port로 리다이렉트 해주어야한다아래는 iptables 명령을 이용한 간단한 예제이다.(반드시 root권한으로 수행되어야 한다.)

 

우선 8080포트가 리슨을 하고있는지 확인한다.

# netstat -ntl

The output will look something like

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State
tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN
tcp        0      0 ::ffff:127.0.0.1:8005       :::*                        LISTEN
tcp        0      0 :::8009                     :::*                        LISTEN
tcp        0      0 :::8080                     :::*                        LISTEN
tcp        0      0 :::22                       :::* 

예제

TOMCAT 서버가 구동되는 호스트의 IP : 211.110.33.86 또는 localhost
TOMCAT 서버의 HTTP Connector Port : 8080

iptables -t nat -I PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
iptables -t nat -I OUTPUT -p tcp --dport 80 -j REDIRECT --to-ports 8080 

위의 예제는 현재 서버(211.110.33.86) 8080포트에 대한 모든 인바운딩을 80 포트로 리다이렉트(REDIRECT)하는 명령이다.


또는 다음과 같이 명령을 입력한다.

# iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080

 

Run the folloing command to verify that redirect is working fine

# iptables -t nat -L

The output will look something like

Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
REDIRECT   tcp  --  anywhere             anywhere            tcp dpt:http redir ports 8080

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination

 Run the following command to remove the routing

# iptables -t nat -D PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080

 Remember, when you are modifying your running configuration of iptables, you will still need to save your changes in order for it to persist on reboot. Be sure to test your configuration before saving it with "service iptables save" so that you don't lock yourself out

 

생각해보아야할 문제

root권한으로 TOMCAT과 같은 WAS를 구동하였을때 발생 할 수 있는 문제점은?
WEB SERVER없이 TOMCAT과 같은 WAS만으로 서비스하였을때 발생 할 수 있는 문제점은?
SSL(https)의 경우 443번 포트를 해당 프로토콜의 기본 포트로 사용하는데, SSL도 이와같은 처리를 해주어야할까?

반응형

+ Recent posts