레이블이 TOMCAT인 게시물을 표시합니다. 모든 게시물 표시
레이블이 TOMCAT인 게시물을 표시합니다. 모든 게시물 표시

12/19/2013

How to block spamming IP coming to your environment in Tomcat?

There is a case that ton of requests are rushing into your Tomcat webapps, mostly because your service becomes rock star, the bug of your new implementation cause user's "refresh", or maybe something else.

For non-heavy requests which hits cached data most of the time would be fine for those cases, but other types of requests like new login account creation, real-time status query like server status, place order, etc are highly related to database call, and mostly will not be cached. Those calls can exhaust your Tomcat webapps JDBC connection pool too fast and make the service unrecoverable.
Implementing throttling in app would be definitely helpful in this case, but even the solution might need some time to coding. There are other ways you can filter spamming IP in OS level using iptables things or Apache mod_xxx plugin, etc, but probably the easiest and fastest way to block those spamming(well, at least to you) IP would be adding following "Valve" configuration into Tomcat's server.xml.
      </Host>
<Valve className="org.apache.catalina.valves.RemoteAddrValve" deny="xx.x.xx.xxx" />
  
</Engine>
This set up need to be located under <Engine> section, and at the same level with "Host". ( chanse xx.x.xx.xxx to the IP which you want to block).
You can either use "deny" or "allow" for Valve configuration, but "deny" would be what you ant to use at this moment.
For more information about Valve configuration in Tomcat, check http://tomcat.apache.org/tomcat-7.0-doc/config/valve.html

4/07/2010

Tomcat에서 SSL을 사용하는 당신에게 어느날 찾아오는 ssl_error_rx_record_too_long 오류

분명히 당신은 tomcat 5.5 또는 6.0에 SSL을 설치해서, 그것도 사설인증서까지 잘 만들어서 쓰고 있었다.

그러던 어느날, 여느때와 같이 출근해서 톰캣을 올리고 웹브라우저로 접속을 하는 순간 “ssl_error_rx_record_too_long” 라는 오류가 화면아 나타나는 것을 확인하게 된다.

 

당신이 만약 IE 계열을 쓴다면 그냥 화면이 pending되는 현상을 한참 목격했을 것이고, 파이어폭스 유저라면 단방에 ssl_error_rx_record_too_long 오류를 토해내는 화면을 확인했을 것이다.

 

자, 그래서 원인을 찾아보려고 구글에다가 ssl_error_rx_record_too_long 라는 단어를 밀어넣어 본다.

 

99.99% 파이어폭스 플러그인과 관련된 기사다.

 

서너시간을, 아니 어쩌면 톰켓을 다 지우고 JDK까지 지우고 새로 설치했는데도 증상이 없어지지 않아서 하루이틀을 허비했을지도 모른다.

 

그러다 문득 깨닫는다. 얼마전에 톰캣 띄울때마다 뜨는 APR 라이브러리 관련 오류를 없애기 위해서 윈도우(어쩌면 Unix/Linux)용 tcnative-1.dll ( 또는 so ) 를 다운받아서 c:\windows\system32 따위의 디렉토리에 복사해 넣은 적이 있다는 것을. 게다가 윈도우용 tcnative-1.dll은 SSL도 함께 들어가 있다.

 

자 여기서 문제는 그냥 tomcat을 설치했을때를 기준으로 하는 SSL세팅과, 이놈의 tcnative-1의 SSL을 이용하는 경우의 configuration이 다르다는 것이다.

 

Tomcat 6.0 문서를 기준으로 (http://tomcat.apache.org/tomcat-6.0-doc/ssl-howto.html), JSSE를 이용한 tomcat의 server.xml SSL설정은 다음과 같다.

 

<-- Define a SSL Coyote HTTP/1.1 Connector on port 8443 -->
<!--
<Connector 
           port="8443" maxThreads="200"
           scheme="https" secure="true" SSLEnabled="true"
           keystoreFile="${user.home}/.keystore" keystorePass="changeit"
           clientAuth="false" sslProtocol="TLS"/>
-->

 

APR 을 쓴다면

 

<-- Define a SSL Coyote HTTP/1.1 Connector on port 8443 -->
<!--
<Connector 
           port="8443" maxThreads="200"
           scheme="https" secure="true" SSLEnabled="true"
           SSLCertificateFile="/usr/local/ssl/server.crt" 
           SSLCertificateKeyFile="/usr/local/ssl/server.pem"
           clientAuth="optional" SSLProtocol="TLSv1"/>
-->

 

이렇다.

 

삽질하다 정리차원에서 적는거라 언젠가 다시 한번 테스트해서 올려야겠지만, 일단 가장 먼저 해야 할 일은 tomcat을 내리고 그놈의 tcnative-1.dll 을 삭제한 다음 톰캣을 다시 띄우는 것.

 

원래대로 돌아간 당신의 웹 어플리케이션을 확인할 수 있을 것이다.(아니면 말고 –_-;;)

 

이 글이 당신의 야근/주말 삽질을 종료시켜주는데 기여하길 바라며 이만.

 

-P.S-

내 경우를 이야기하자면 분명 tcnative-1.dll을 windows\system32에도 넣어봤고 tomcat/bin에도 넣어봤으나 tomcat을 띄울때마다 APR이 없다는 메세지가 계속 나왔다. 그리고 한 일주일 다른 프로젝트를 하다가 ( with WindowXP 32bit version + Eclipse 갈릴레오  + WTP ) 다시 해당 프로젝트를 열었을때 문제가 발생했다.

5/14/2009

Eclipse에서 WTP로 서버 스타트업시 45초 후 종료되어 버리는 현상

Spring을 쓰거나 기타 등등 다른 것들을 이용해서 이클립스 WTP환경하에서 자바기반 웹어플리케이션을 만들 때, 생성하는 빈이 너무 많거나 해서 서버가 올라가는 시간이 너무 길면 서버 스타트업이 중지되면서 에러가 발생합니다.

기본적으로는 이 타임아웃이 45초로 되어 있는데, 스타트업 시간을 줄이면 좋겠지만 부득이하게 이보다 시간이 더 걸릴때는 타임아웃 시간을 늘려야겠죠.

그런데 이걸 어디서 바꾸어야 하는지 모르는 경우가 많습니다. eclipse 에서 생성한 서버의 server.xml 이나 web.xml, context.xml 뭐 이딴거 다 까봐도 스타트업 타임아웃 설정에 대한 건 없죠. 이클립스에서 서버를 스타트 시켜 주기 때문에 서버의 스타트업 타임아웃은 이클립스 쪽에서 뭔가 바꾸어 주어야 합니다.

방법은 의외로 간단한데, 이클립스의 server 에디터 창에서 해당 서버를 더블클릭하여 Overview 및 Modules 롤 보이게 한 다음 Overview쪽 항목들을 자세히 보면 “Timeouts” 이라는 게 보입니다. 이걸 열어보면 Start(in seconds) 라는 항목이 보이는데 요걸 수정해 주면 됩니다.


비스타 캡쳐도구로 그렸더니 엉망진창이지만 –_-; 이미 이클립스나 WTP에 익숙하신 분들이라면 쉽게 아실 수 있을겁니다.

image


요즘 바빠서 포스팅이 너무 뜸한지라 이런거라도 올려봅니다. –_-;;;;;;;;;

5/06/2009

멀쩡하게 잘 돌아가던 Spring기반 어플에서 "SEVER: Error listenerStart"오류 발생할 때

Spring + Tomcat으로 잘 돌리던 어플에서 어느날 갑자기 start를 해보니


“SEVERE: Error listenerStart”…

“SEVERE: Context [/xxxxx] startup failed due to previous errors”,


와 같은 오류가 뜰 때가 있다.

Context[ ]

같은 내용이 뜨면 web.xml 설정을 잘못 해줬거나 TOMCAT_HOME/config/Catalina/localhost/???.xml 의 설정이 잘못된 것이겠지만

위와 같이 나온다면 거의 십중팔구 WEB-INF 밑의 web.xml 내용 중


<context-param>
    <param-name>webAppRootKey</param-name>
    <param-value>xxxxxx.root</param-value>
</context-param>

<context-param>
    <param-name>log4jConfigLocation</param-name>
    <param-value>/WEB-INF/classes/config/log4j.properties</param-value>
</context-param>

<context-param>
    <param-name>log4jRefreshInterval</param-name>
    <param-value>1000</param-value>
</context-param>


쪽 설정의 오류다.

아마도 로컬의 eclipse + wtp에서는 잘 되는데 통합 빌드 서버로 옮긴 다음에 문제가 발생할 가능성이 큰데 그 이유는 많은 경우 local 과 server 간의 log4j 설정등의 차이로 인해

ant build 시 **/log4j.properties 같은 것들을 exclude 시켜버려 web.xml 에서 설정된 log4jConfigLocation 의 위치에 log4j.properties 파일이 없기 때문이다.


실제로 이렇게 되면 화면에 뭐 별다른 오류도 안뜨고 사람 환장할 지경이 되는데… 설정부터 꼼꼼하게 다시 체크해 보시길.

1시간 삽질기 끝 –_-;

6/11/2008

Tomcat 5.0 -> Tomcat 5.5 이후 forward 된 jsp 에서 request.getRequestURL() 의 값이 이상해진 경우

forward 된 jsp 페이지에서 최초의 브라우저 또는 클라이언트 프로그램으로 부터 호출될 때 사용되었던 URL을 구하기 위해 request.getRequestURL() 이나 request.getRequestURI() 를 사용했던 페이지들 중 tomcat 을 5.0에서 5.5 로 업그레이드 한 이후에 출력값이 달라지는 문제가 발생함을 경험하신 분들이 계실겁니다.

이는 Tomcat 5.5.7 버전부터 getRequestURL() 의 구현이 바뀌었기 때문인데(bug fix), 더이상 최초의 URL 을 넘겨주지 않고 forward 된 jsp 페이지의 URL을 넘겨주도록 되었습니다.

해결책부터 적는다면 5.5.7 이후부터는 getRequestURL() 대신에

request.getAttribute("javax.servlet.forward.request_uri");


를 사용하면 됩니다.

좀 더 자세한 내용은 wiki 에 작성해 둔 http://www.potatosoft.com/wiki/wiki.php/TOMCAT5#s-9  을 참고하시기 바랍니다.

1/29/2008

Eclipse 를 도입해서 사용중

지금의 회사에 입사한 이후로 거의 5년정도를 UNIX 머신상에서 vi 코딩하다가 최근에 개발환경을 바꾸면서(팀이 바뀌었다) Eclipse + CVS + 등등으로 세팅해서 쓰고 있다.
중간중간에 개인 프로젝트나 집에서 놀때는 물론 이런저런 IDE (라고해봐야 몇개 안되지만) 를 갖고 놀긴 했지만...

Eclipse 를 사용하는 이유는 CVS 를 개발환경에 적용했다는 점이 가장 큰 부분이다. (매번 콘솔에서 명령어 일일이 입력하긴 귀찮으니까) 개발서버쪽에 계정 따로 만들어서 소스코드 checkout 한다음에 코딩해도 되긴 하지만 '팀  표준 개발환경' 을 설정하고 쓰는게 좋겠다라는 내부 분위기에 따라 일단 나도 개인PC 에 tomcat 을 설정하고 CVS 에서 소스코드를 다운받아 개발 및 테스트 한 후, 소스코드만을 CVS로 업로드하고 있다.
이후 개발서버에서는 CVS의 데이터를 매일 오후 12시30분과 자정 두번에 걸쳐 checkout 한 후 build 및 deploy 를 하고 있다.

Eclipse 를 쓴다고는 하나 현재 프로젝트에서는 개발팀원들끼리 맡은 부분이 거의 확실히 나누어져 있는 상태이고  팀 자체로 만든 공통 라이브러리를 쓰는 부분이 없기에 package explorer 같은건 있으나마나이고, 오히려 코딩속도에 있어서는 vi 보다 훨씬 떨어지고 있는 입장이다.

아직 Eclipse 를 충분히 익히지 않아서 그런 부분도 있지만 블록설정후 파일간 복사라든지, 블록별 버퍼 저장, 삭제라든지 기타 다른 부분에 있어서 vi 에 비해서 속도를 내어주지 못한다.
마우스를 쓰기 위해서 손가락이 키보드 위를 떠난다는 점 또한 단점이라면 단점이다.
가장 큰 단점은 회사에서 준 조그만 17인치 LCD 모니터와 개인적으로 집에서 들고온 19인치 와이드 LCD 에서 너무나도 열악한 세로 사이즈의 한계가 그나마 PuTTy 로 vi 를 쓸때는 어느정도 쓸만했으나 Eclipse 를 쓰면서 가뜩이나 좁은 세로길이가 더 작아져 버렸다는 것이지 ( Pivot 모니터 구입을 고려중이다 -_-;; )

그럼에도 불구하고 Eclipse 를 이용하고 개인 PC 에 개발환경을 구축해 개발 및 test 를 하게 된 이유는 이전 SKTelink MMS G/W 개발시 프로젝트 막판에 한참 바쁠때  누군가가 패키지에 신규 기능을 코딩하게 되면 해당 사용자가 그 코딩을 '버그없이' 완전하게 완성할동안 계속 컴파일 에러가 나버려서 다른 사람들이 작업을 할 수 없게 된다는 단점을 극복해보기 위함이었다. ( jsp 로만 개발하면 되지 않냐는 소린 하지말고... -_-; )

이런저런 이클립스와 tomcat 등 개발환경을 설정하면서 써본 결과 우선 서블릿 컴파일과 기타 등등을 위해서는 확실히 이클립스쪽에서 WTP 패키지를 받는 것이 편리하다.

다만 WTP 의 경우 실행 또는 서블릿 빌드시에 내부적으로 webapp 및 web.xml 등의 설정을 가져가고 webapp 나 docBase 등의 설정, 기타 등등이 무척이나 번거로운 관계로  Tomcat 은 별도로 설치해서 개발서버와 동일하게 설정한 다음(docBase 정도만 달라진다)  Tomcat 플러그인을 설치해서 쓰면 편리하다.
Tomcat plugin 의 경우 docBase 를 설정할 수 있게 해주는데 이 부분을 CVS 에서 checkout 한 WebContent 로 설정해주면 된다.

요즘 포스팅을 모두 medium쪽으로 하고 있습니다

안녕하세요? 어쩌다보니 그냥 한번 써보기로 한 medium.com 에다가 죄다 최근 포스팅을 하고 있습니다. 현재 도메인인 potatosoft.com 은 제가 대학때인가 사회 취업한지 얼마 안됐을때부터 유지해 온 도메인이고, 블로그 시스템은 그...