apache ab

07.Web 2012.10.09 09:27

apache ab는 벤치마크 툴로서 서버 및 웹 어플리케이션의 성능 측정에 사용된다.

가장 많이 쓰여지는 옵션은 -t, -c, -n 정도 인 것 같다.


심심해서 http://www.naver.com 으로 테스트를 해봤다.


$ ab -t 10 -c 10 http://www.naver.com/

This is ApacheBench, Version 2.0.40-dev <$Revision: 1.146 $> apache-2.0

Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/

Copyright 2006 The Apache Software Foundation, http://www.apache.org/


Benchmarking www.naver.com (be patient)

Finished 410 requests



Server Software:        nginx

Server Hostname:        www.naver.com

Server Port:            80


Document Path:          /

Document Length:        109954 bytes


Concurrency Level:      10

Time taken for tests:   10.5510 seconds

Complete requests:      410

Failed requests:        408

   (Connect: 0, Length: 408, Exceptions: 0)

Write errors:           0

Total transferred:      44177669 bytes

HTML transferred:       44040476 bytes

Requests per second:    40.98 [#/sec] (mean)

Time per request:       244.037 [ms] (mean)

Time per request:       24.404 [ms] (mean, across all concurrent requests)

Transfer rate:          4311.82 [Kbytes/sec] received


Connection Times (ms)

              min  mean[+/-sd] median   max

Connect:       12   30 208.9     16    3014

Processing:   115  202 295.1    144    3664

Waiting:       15   27 148.3     20    3021

Total:        131  233 364.9    160    3685


Percentage of the requests served within a certain time (ms)

  50%    160

  66%    167

  75%    174

  80%    180

  90%    441

  95%    491

  98%    544

  99%   3161

 100%   3685 (longest request)


역시 예상했던 것 처럼 nginx를 사용중이다.

실제 업무에서 사용해보진 못했지만 httpd 수준으로 알아둬야겠다.

신고
Posted by Stewie

run Tomcat as a Daemon

07.Web 2012.07.03 16:01


tomcat을 시작 후 shutdown.sh 종료하는 경우는 stop관련 log가 출력이 된다. (catalina.log)

만약 kill (kill -9 말고)로 ps를 죽이게 된다면 어떻게 될까?


답은, 역시 stop관련 log가 출력이 된다.


이유가 뭘까 싶어 좀 찾아봤다. 해답은,


Runtime.getRuntime().addShutdownHook(shutdownHook);


이 코드였다.shutdown hook을 추가하게 되면 tomcat jvm의 종료가 되는 시점에 shutdownHook의 객체(Thread 타입)가 실행되기 때문에 필요한 종료동작 및 logging 후 안전히 프로세스를 종료하게 된다.



여기서 한가지 의문이 더 들었다.


tomcat의 경우 apache commons daemon lib가 동봉되어 있어 daemon형태로 돌리기 위해서는

jsvc를 통해 구동을 하면 된다고 알고 있는데 자체적으로 shutdown hook 메커니즘이 있는데도

별도로 이렇게 하는 이유는 뭘까? 

(물론 kill -9은 jsvc든 shutdownhook이던 전부 operational signal을 catch할 수 없다.)


daemon이란 

-유닉스와 같은 멀티태스킹 운영체제에서 데몬(daemon, 발음: 데이먼/'de?m?n/ 또는 디먼 /'dim?n/[1])은 

사용자가 직접적으로 제어하지 않고, 백그라운드에서 돌면서 여러 작업을 하는 프로그램을 말한다.


tomcat의 경우 기본 port(8080)이 아닌 다른 포트, 예를들어 privilege port(under 1024, 예) HTTP 80)를

사용하기 위해서는 root 권한이 필요한데 이런 경우 jsvc를 통해 root가 아닌 user로

대신 daemon으로 등록할 수 있다.



그렇다면, 기본 포트를 사용할 것이고, httpd와 연동을 할 계획이라면 어떻게 해야하나?


요건 다음번에.......


<출처>

http://stackoverflow.com/questions/11147853/value-of-adding-commons-daemon-to-an-app

http://christopherhunt-software.blogspot.kr/2009/07/replacing-jsvc-for-java-daemons.html

http://fnords.wordpress.com/2010/04/22/tomcat-improvements-coming-up-in-10-04/

신고
Posted by Stewie

JKMount /* ajp13

으로 모든 request에 대해서 mod_jk 설정을 하였을 때

특정 request에 대해서만 DocumentRoot로 돌리고 싶을 때가 있다. (ELB의 healthcheck 등)


다음 option이 도움이 된다.

SetEnvIf Request_URI "/*.html" no-jk

신고
Posted by Stewie

<상황>
test.war을  $TOMCAT_HOME/webapps/에 카피하면 보통

http://localhost:8080/test로 접속을 해야한다.

하지만 http://localhost:8080/ 으로 접속하고 싶다.

1. $TOMCAT_HOME/webapps 안에 test.war말고 다 삭제
2. $TOMCAT_HOME/conf/server.xml 수정

 

    
    ............
    


이렇게 하면 webapps에 ROOT 및 test 두개의 디렉토리가 생겨 둘다 접속이 가능하다.
test.war를 다른곳으로 뺀 뒤 docBase를 변경하면 ROOT만 생긴다.
 
신고
Posted by Stewie

Tomcat

Tomcat은 servlet engine의 한 형태로 오픈 소스 이다. renderging page 및 core적인 성격의
servlet engine의 역할을 수행하던 초기 버전에 비해 현재 여러가지 부가 기능 들이 추가되면서
그 형태가 약간 비대해 졌다. 하지만 최근 웹 프로그래밍의 추세를 보면 client-side의 scripting에 
보다 많은 비중이 실리고, back-end의 servlet은 그 역할이 순수히 controller 기능을 수행하는
형태로 변화하고 있었다.

Jetty

servlet engine의 본연의 기능만에 집중한 형태인 Jetty는 tomcat보다 빠르고 tomcat이 지원하는
간단한 부가적인 기능 몇개를 지원한다. 하지만 documentation이 굉장히 형편없고 현재 jetty 서버의 
ownership에 대한 문제가 있으며 embeded 형태로 servlet engine을 구동하기엔 약간은 많은 lib와
xml 설정 파일들이 필요하다

Winstone

Hudson에서 사용하는 servlet engine으로 Jetty의 documentation 등의 단점은 어느 정도 커버해준다.
embeded 형태로 사용하기위해 필요한 것은 jar 파일 하나며 단 소스 몇 라인이면 충분하다.
필요한 설정값은 map형태에 key-value 쌍으로 담기만 하면 된다. 물론 websocket 지원이라 던지
licence 등의 미흡한 점은 있지만 간단한 WAR파일을 WAS로 구동시키기에는 더 쉽고 더 편리한
servlet engine이다.

maven pom.xml

<dependency>
<groupId>net.sourceforge.winstone</groupId>
<artifactId>winstone</artifactId>
<version>0.9.10</version>
</dependency>

sample source to start

Map config = new HashMap();
config.put(“webroot”, “webapps/my-killer-app/”);
Launcher.initLogger(config);
Launcher winstone = new Launcher(config);

command line 실행

java -jar winstone.jar --webroot [your-exploded-war-base-directory-or-war-file-location] 

다음의 기능들이 있다.

-HTTPS support
-JAAS support
-Apache/JK support
-Cluster support
-Hot-redeploy of servlet classes
-JNDI support
신고
Posted by Stewie

<AWS EC2 AMI>
ami-e99faa9d : RightImage_CentOS_5.4_i386_v5.6.8.1_EBS


1. JDK 설치
설치되어있는 구버전의 JDK를 지우고

# rpm -qa | grep java
# rpm -qa | grep jdk
# rpm -e --nodeps 패키지명 
->로 모두 삭제한다. 

http://download.oracle.com/otn-pub/java/jdk/6u26-b03/jdk-6u26-linux-i586.bin 파일 Download & Install

/etc/profile 에 $JAVA_HOME 추가


2. Apache2 설치
http://mirror.khlug.org/apache//httpd/httpd-2.2.19.tar.gz

압축을 해제한 폴더에서 ./configure 를 실행 (옵션에 따라 많은 차이가 있다.)
http://blog.naver.com/PostView.nhn?blogId=kunks3&logNo=105790630&redirect=Dlog&widgetTypeCall=true

예) ./configure --prefix=PREFIX --enable-rewrite --enable-so --enable-mods-shared=most 

make & make install

service에 등록하려면 $APACHE2_HOME/bin의 apachectl을 /etc/rc.d/init.d/로 복사 후

chkconfig --add apachectl 명령어를 실행하면 되는데 이번에 설치한 ami에서는 에러를 발생한다.

apachectl를 vi 에디터로 편집하여 

# chkconfig: 2345 90 90
# description: init file for apachectl server daemon
# processname: /usr/local/apache2/bin/apachectl
# config: /usr/local/apache2/conf/httpd.conf
# pidfile: /usr/local/apache2/logs/httpd.pid

을 넣어주고 다시 실행하면 된다.
service apachectl start 씨리즈 명령어 완성


3. mod_jk 설정 

http://apache.tt.co.kr//tomcat/tomcat-connectors/jk/tomcat-connectors-1.2.32-src.tar.gz 

./configure --with-apxs=/usr/local/apache2/bin/apxs
apxs 옵션은 @APACHE2_HOME/bin/apxs으로 설정(추후 다른 옵션 공부 필요)

make 후 install 보다는 native/apache-2.0 에 있는 mod_jk.so 파일을 $APACHE2_HOME/modules 에 복사하는 방법을 이용

 # conf/httpd.conf 파일 수정
LoadModule jk_module modules/mod_jk.so 추가

<IfModule mod_jk.c>
#workers파일 위치
JkWorkersFile conf/workers.properties
#로그 위치
JkLogFile "logs/mod_jk.log"
#로그 레벨
JkLogLevel info
#로그 문자열 포멧
JkLogStampFormat "[%a %b %d %H:%M:%S %Y]"
JkRequestLogFormat "[%w %V %T]"
#url 매핑 
JkMount /* loadbalancer
</IfModule>
 
 # conf/workers.properties 파일 신규 생성

worker.list=loadbalancer

worker.tomcat1.type=ajp13
worker.tomcat1.host=192.168.0.1
worker.tomcat1.port=8009
worker.tomcat1.lbfactor=1

worker.tomcat2.type=ajp13
worker.tomcat2.host=192.168.0.2
worker.tomcat2.port=8009
worker.tomcat2.lbfactor=1

worker.loadbalancer.type=lb
worker.loadbalancer.balanced_workers=tomcat1,tomcat2

ajp13은 mod_jk에서 사용하는 프로토콜이다.


P.S 추가

mod_jk를 사용하지 않고 mod_proxy 및 mod_proxy_balancer를 이용하여 구성할 수 도 있다.
apache2 설치 옵션에서 --enable-proxy를 설정하면 mod_proxy 패키지가 설치되고

<VirtualHost *:80>
    ServerAdmin       admin@mydomain.co.kr
    ServerName        ad.ospserver.net
    ErrorLog          /usr/local/apache2/logs/ad.ospserver.net-error_log
    CustomLog         /usr/local/apache2/logs/ad.ospserver.net-access_log common

    <Proxy balancer://wpCluster>
      BalancerMember http://IP1:8080/docs
      BalancerMember http://IP2:8080/docs
    </Proxy>
    <Proxy balancer://apiCluster>
      BalancerMember http://IP3:8080/examples
      BalancerMember http://IP4:8080/examples
    </Proxy>
    ProxyPass /docs balancer://wpCluster
    ProxyPassReverse /docs balancer://wpCluster
    
    ProxyPass /examples balancer://apiCluster
    ProxyPassReverse /examples balancer://apiCluster
</VirtualHost>

와 같이 httpd.conf에 가상호스트 설정을 할 수 있다.
그렇담 과연 mod_jk와 mod_proxy의 차이점은 무엇인가?

<참조>
http://docs.codehaus.org/display/JETTY/Configuring+AJP13+Using+mod_jk
http://masamune.tistory.com/162 
 
신고

'07.Web' 카테고리의 다른 글

Tomcat 에서 ROOT context으로 webapps 실행하기  (0) 2012.02.20
Tomcat, Jetty and Winstone  (0) 2011.08.17
CentOS 5.4 + Apache 2.2 + Tomcat 6.0 + mod_jk 정리  (0) 2011.07.14
Apache ? Tomcat?  (0) 2011.06.03
java -jar hudson.jar  (0) 2011.05.28
REST CXF  (0) 2011.05.13
Posted by Stewie

Apache ? Tomcat?

07.Web 2011.06.03 09:44

예전에 신입사원 교육때부터 늘 헷갈렸던 것이 WAS와 Web Server의 차이, Apache와 Tomcat의 차이 뭐 그런 것이었다.
오늘 마침 httpd 라는 녀석을 찾아보면서 다시한번 정리하기로 했다.

Apache -> apache 재단을 가르키기도 하지만 보통 httpd web server를 지칭한다. 스태틱 파일들을 처리하는 역할을 하지만 다수의 Tomcat등의 WAS 를 클러스터 구성하여 로드 밸런싱을 지원하기도 한다.(L4 수준의 성능을 기대하긴 어렵다)

Tomcat -> 보통 WAS라 불리우며 servlet container의 일종이다. J2EE 스펙중 servlet container의 기능만 구현한 걸로 알고 있다. (전부 구현한 것들은 Weblogic 이나 JBoss 등)

찾아보면서 흥미로웠던 부분은
보통 Tomcat 앞에 httpd를 두어 스태틱 파일 처리 성능을 꾀하는 오류를 범하기 쉽다는 건데.

실질적으로 Tomcat은 httpd가 low-level I/O 작업을 위해 사용하는 것과 동일한 네이티브 라이브러리(APR, Apache Portable Runtime)를 지원 하기 때문에 눈에 보이는 성능 차이는 없다. 만약 Tomcat에서 정적 컨텐트 처리 능력을 향상시키고 싶다면 Coyote APR/native를 추천한다는 글을 보았다.

즉, 결론은

단순 스태틱 파일들 처리의 성능을 위한 tomcat 앞 httpd 설정은 무의미 하고 로드밸런싱 등의 httpd 모듈 기능이 필요하거나  하나의 서버에 PHP, JAVA 어플리케이션을 동시에 사용하는 경우 등에 한해서 httpd를 쓰면 되겠다.

참조
http://httpd.apache.org/
http://maxnim.wordpress.com/2011/01/05/%EC%A7%84%EC%8B%A4-%ED%98%B9%EC%9D%80-%EA%B1%B0%EC%A7%93-tomcat%EA%B3%BC-apache-httpd%EB%A5%BC-%EC%97%B0%EB%8F%99%ED%95%98%EB%8A%94%EA%B2%8C-%ED%95%AD%EC%83%81-%EC%84%B1%EB%8A%A5%EC%9D%84-%ED%96%A5/
http://toby.epril.com/?p=1125   
신고

'07.Web' 카테고리의 다른 글

Tomcat, Jetty and Winstone  (0) 2011.08.17
CentOS 5.4 + Apache 2.2 + Tomcat 6.0 + mod_jk 정리  (0) 2011.07.14
Apache ? Tomcat?  (0) 2011.06.03
java -jar hudson.jar  (0) 2011.05.28
REST CXF  (0) 2011.05.13
팝업창 Cookie를 이용한 일정 기간 내에 열지 않기  (0) 2009.12.07
Posted by Stewie

java -jar hudson.jar

07.Web 2011.05.28 10:52
hudson 자체에 winstone WAS를 포함하고 있기 때문에 

굳이 tomcat 같은 servlet container에서 올릴필요 없다

그럴수가... 
신고

'07.Web' 카테고리의 다른 글

CentOS 5.4 + Apache 2.2 + Tomcat 6.0 + mod_jk 정리  (0) 2011.07.14
Apache ? Tomcat?  (0) 2011.06.03
java -jar hudson.jar  (0) 2011.05.28
REST CXF  (0) 2011.05.13
팝업창 Cookie를 이용한 일정 기간 내에 열지 않기  (0) 2009.12.07
WAS(Web Application Server) 와 Web Server  (0) 2009.11.30
Posted by Stewie

REST CXF

07.Web 2011.05.13 18:02
Apache CXF vs. Apache AXIS2

REST
부서적인 레이어나 세션과닐를 추가하지 않고 HTTP를 통해 data를 전송하는 framework

HTTP 프로토콜의  

GET, PUT, POST, DELETE 메서드 지원 (CRUD)


Spring 3.0 + Cxf (JAX-WS) 예제 적용
참조 : http://oldprogrammer.tistory.com/

STS + Apache Tomcat 7.0 | cxf 2.4.0 

web.xml

        <display-name>testWebPjt</display-name>


<context-param>

<param-name>contextConfigLocation</param-name>

<param-value>WEB-INF/beans.xml</param-value>

</context-param>


<listener>

<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

</listener>


<servlet>

<servlet-name>CXFServlet</servlet-name>

<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>

<load-on-startup>1</load-on-startup>

</servlet>


<servlet-mapping>

<servlet-name>CXFServlet</servlet-name>

<url-pattern>/*</url-pattern>

</servlet-mapping>


 

bean.xml

<!-- CXF 관련 설정 -->

<import resource="classpath:META-INF/cxf/cxf.xml" />

<import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />

<import resource="classpath:META-INF/cxf/cxf-extension-http-binding.xml" />

<import resource="classpath:META-INF/cxf/cxf-servlet.xml" />


<!-- The service bean -->

<bean id="personService" class="demo.rest.spring.PeopleServiceImpl" />


<jaxws:endpoint id="getPerson" implementor="#personService"

implementorClass="demo.rest.spring.PeopleServiceImpl" address="/persons"

bindingUri="http://apache.org/cxf/binding/http">

<jaxws:serviceFactory>

<ref bean="wsfactory" />

</jaxws:serviceFactory>

</jaxws:endpoint>


<bean id="wsfactory" class="org.apache.cxf.jaxws.support.JaxWsServiceFactoryBean"

scope="prototype">

<property name="wrapped" value="true" />

</bean>



PeopleService.java

package demo.rest.spring;


import javax.jws.WebParam;

import javax.jws.WebService;

import javax.ws.rs.GET;


import org.codehaus.jra.HttpResource;


@WebService(targetNamespace = "http://spring.rest.demo")

public interface PeopleService {


@GET

@HttpResource(location = "/{uid}/{lastName}")

Person getPerson(@WebParam(name = "uid") String id, @WebParam(name = "lastName") String name);

}



PeopleServiceImpl.java

package demo.rest.spring;

import javax.jws.WebService;


@WebService(endpointInterface = "demo.rest.spring.PeopleService")

public class PeopleServiceImpl implements PeopleService {



public Person getPerson(String id, String name) {


Person person = new Person();

person.setId(id);

person.setName(name);


return person;


}


}


 
현재 이렇게 돌리면 문제점이 있다.

REST로 url에 parameter를 담아 보내도 결국 나오는 에러는

정보: Invoking GET on /abcd/dfed
2011. 5. 13 오후 5:06:05 org.apache.cxf.phase.PhaseInterceptorChain doDefaultLogging
경고: Interceptor for {http://spring.rest.demo/}PeopleServiceImplService has thrown exception, unwinding now
org.apache.cxf.interceptor.Fault: Invalid URL/Verb combination. Verb: GET Path: /abcd/dfed 

과 같다.

도데체 뭐가 문제인가 -_-;;;; 
신고

'07.Web' 카테고리의 다른 글

Apache ? Tomcat?  (0) 2011.06.03
java -jar hudson.jar  (0) 2011.05.28
REST CXF  (0) 2011.05.13
팝업창 Cookie를 이용한 일정 기간 내에 열지 않기  (0) 2009.12.07
WAS(Web Application Server) 와 Web Server  (0) 2009.11.30
JSTL param 객체 활용하기  (0) 2009.10.19
Posted by Stewie
<!--  팝업 띄우기 소스  -->

window.onload = openMsgBox; 
function popUpClose(num){
if (num != 'today'){
document.getElementById("pop_notice").style.display = 'none';
}else{
setCookie("mainPopUp", "no" , 1);
}
}
function setCookie( name, value, expiredays ){
var todayDate = new Date();
todayDate.setDate( todayDate.getDate() + expiredays );
document.cookie = name + '=' + escape( value ) + '; path=/; expires=' + todayDate.toGMTString() + ';'
}
function getCookie( name ){
var nameOfCookie = name + '=';
var x = 0;
while ( x <= document.cookie.length )
{
var y = (x+nameOfCookie.length);
if ( document.cookie.substring( x, y ) == nameOfCookie ) {
if ( (endOfCookie=document.cookie.indexOf( ';', y )) == -1 )
endOfCookie = document.cookie.length;
return unescape( document.cookie.substring( y, endOfCookie ) );
}
x = document.cookie.indexOf( ' ', x ) + 1;
if ( x == 0 ) break;
}
return ''; 
}
function openMsgBox(){
var eventCookie=getCookie('mainPopUp');
if (eventCookie != "no"){
document.getElementById("pop_notice").style.display = '';
}
}
신고

'07.Web' 카테고리의 다른 글

Apache ? Tomcat?  (0) 2011.06.03
java -jar hudson.jar  (0) 2011.05.28
REST CXF  (0) 2011.05.13
팝업창 Cookie를 이용한 일정 기간 내에 열지 않기  (0) 2009.12.07
WAS(Web Application Server) 와 Web Server  (0) 2009.11.30
JSTL param 객체 활용하기  (0) 2009.10.19
Posted by Stewie


티스토리 툴바