웹어플리케이션서버2021. 11. 5. 14:43

^/(정규식1)(정규식2)$

$1: 정규식1

$2: 정규식2 

정규식 순서에 따라 순차적으로 매칭되는 변수 $숫자

# domain.com 으로 접속 시 newdomain.com 으로 리다이렉토

server {

  server_name   domain.com;

  return 301 http://www.newdomain.com$request_uri;

}

# domain.com/change/view.php?no=1000 으로 접속 시 domain.com/changed/article.php?art_no=1000 으로 변환

server {

  server_name   domain.com;

location ~* ^/change/(.*)$ {
     rewrite ^/change/(.*)$ http://domain.com/changed/$1 permanent; 
     break;
}

 

# domain.com/~~~ 으로 접속 시 newdomain.com/~~~ 으로 변환

server {

  server_name   domain.com;

location ~* ^(.*)$ {
     rewrite ^(.*)$ http://www.newdomain.com$1 permanent;
     break;
}

 

# domain.com/aaa.html 혹은 domain.com/bbb.html 으로 접속 시 domain.com/chage.html 으로 변환

server {

  server_name domain.com;

location ~* ^(.*)$ {

     rewrite ^/aaa.html$ /chage.html permanent;
     rewrite ^/bbb.html$ /chage.html permanent;
     break;

}

 

Posted by 미랭군
웹어플리케이션서버2015. 10. 29. 18:28
한서버에 두개이상의 Tomcat을 띄우면 세션이 꼬이게 된다. 

이를 방지하기 위해서 세션쿠키네임을 변경해줘야하는데..

Tomcat6에서는 catalina.sh에 JAVA_OPTS에 SESSION_PARAMETER_NAMESESSION_COOKIE_NAME를 지정

할 수 있었으나 Tomcat7에서는 이 옵션이 conf/context.xml에 아래와 같이 지정해줘야 한다.

  • org.apache.catalina.SESSION_COOKIE_NAME system property: This has been removed. An equivalent effect can be obtained by configuring the sessionCookieName attribute for the global context.xml (in CATALINA_BASE/conf/context.xml).
  • org.apache.catalina.SESSION_PARAMETER_NAME system property: This has been removed. An equivalent effect can be obtained by configuring the sessionCookieName attribute for the global context.xml (in CATALINA_BASE/conf/context.xml).


예를 들면,

<context sessionCookieName="MY_SESSIONID">와 같이 지정하면 된다.


참고URL:

https://tomcat.apache.org/migration-7.html#Session_cookie_configuration

Posted by 미랭군
웹어플리케이션서버2015. 6. 23. 15:31

웹서버를 띄울 때 root로 띄우게 되면 웹서버가 해킹을 당했을 때 root권한을 쥐고있기 때문에 보안상 취약한 문제가 있다.

 

하지만 웹포트는 80이고, SSL포트는 443인데, 리눅스 시스템에서는 1000번 이하 포트의 경우 ROOT계정에서만 제어할 수 있도록

 

제한하고 있다. 이를 해결하기 위해선 Tomcat을 8080, 8443으로 띄우고 아래와 같이 iptables 명령어를 이용해 프리라우팅하면 된다.

 

80->8080, 443->8443 라우팅설정


1. root 권한 접속
2. iptables 설정


#iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
#iptables -t nat -A PREROUTING -p tcp --dport 443 -j REDIRECT --to-port 8443
#netstat -ntl or iptables -t nat -L
#iptables restart

 

3. server.xml 변경
<Connector
  maxSpareThreads='75'
  port='8080'
  proxyPort='80'
  enableLookups='false'
  maxThreads='150'
  connectionTimeout='20000'
  disableUploadTimeout='true'
  minSpareThreads='5'
  maxHttpHeaderSize='8192'
  redirectPort='443'
  acceptCount='200'
/>

<Connector
  SSLEnabled='true'
  keystoreFile='/path/to/keystore.jks'
  maxSpareThreads='75'
  port='8443'
  proxyPort='443'
  algorithm='SunX509'
  enableLookups='false'
  secure='true'
  maxThreads='150'
  connectionTimeout='20000'
  disableUploadTimeout='true'
  scheme='https'
  minSpareThreads='5'
  maxHttpHeaderSize='8192'
  sslProtocol='SSL'
  acceptCount='200'
  clientAuth='false'
/> 

Posted by 미랭군
웹어플리케이션서버2014. 7. 24. 11:51

시스템 사용량이 많아 Tomcat 서버를 여러 대로 분할하려고 했으나 재정상 L4 스위치를 구비하기 어려운 경우가 발생하여 S/W적으로 이를 대체할 만한 방법을 찾다보니 Nginx라는 것이 이 역할을 한다는 것을 알고 직접 구성해보았다.

설치방법1

http://blog.naver.com/adventurez/193335400

설치방법2

http://opentutorials.org/module/384/4511

위 블로그를 참조하여 nginx를 설치

Test환경

서버가 한대 밖에 없을 경우

사용자 Browser1 -> nginx(80, 443) -> Tomcat1:8080

사용자 Browser1 -> nginx(80, 443) -> Tomcat2:8090


1. tomcat1/conf/sever.xml에 포트 8080으로 변경

2. tomcat2/conf/server.xml에 포트 8090으로 변경 및 각 포트 정보 아래와 같이 앞에 2를 붙임

   - <Server port="28005" shutdown="SHUTDOWN">

   - <Connector URIEncoding="UTF-8" port="28009" protocol="AJP/1.3" redirectPort="28443"/>

3. 같은 서버에 두 개의 Tomcat Instance를 실행할 경우 Session이 꼬이는 문제가 발생하므로 tomcat2/bin/catalina.sh에 아래와 같이 변경 필요

JAVA_OPTS="-Xms512M -Xmx1024M -Djava.awt.headless=true Dorg.apache.catalina.SESSION_COOKIE_NAME=MYSESSIONID -Dorg.apache.catalina.SESSION_PARAMETER_NAME=myjsessionid"


서버가 여러 대일  경우(서버A, 서버B, 서버C)

* 서버A에 nginx를 두고 나머지 서버B, C에 Tomcat설치 구성

* 서버A스펙이 좋을 경우에는 서버A에 nginx, Tomcat1를 두고 서버B, C에 각각 Tomcat2,3설치 구성도 가능


사용자 Browser1 -> nginx(80, 443) -> Tomcat1

사용자 Browser1 -> nginx(80, 443) -> Tomcat2


1. nginx1.6/conf/nginx.conf에 아래와 같이 수정 필요

upstream myapp1 {

ip_hash;

        server tomcat1 ip;

        server tomcat2 ip;

    }

    server {

        listen tomcat1 ip:80;

        location / {

            proxy_pass http://myapp1;

        }

 }

* 세션 클러스터링을 하지 않을 경우 ip_hash의 옵션을 주어 IP기준 최초 접속한 서버로 계속 연결을 포워딩 시켜줘야 함.
* 세션 클러스터링 구성을 할 경우 굳이 주지 않아도 상관 없음.
 server tomcat1 ip weight=5;와 같이 뒤에 weight옵션을 두면 부하를 수동으로 조정가능함(5의 지정할 경우 1로 지정한 서버보다 5배 접속)


나머진 알아서!


Posted by 미랭군
웹어플리케이션서버2013. 6. 24. 07:54

리눅스에 톰캣을 설치 후 웹 어플리케이션을 포팅중에 아래와 같은 에러가 발생했다.




한참을 검색해보니 

JAVA 버전이 맞지 않아서 클래스를 로드 하지 못하는 에러였다.

 

이클립스에서 프로젝트에서 Properties > Java Compiler 에 JDK Compliance를 서버 JAVA 버전과 맞춰준 후 클래스 파일을 다시 업로드 해서 기동하면 해결된다.



앞으로는 운용서버와 JDK 버젼을 마이너 버젼까지 맞추는 습관을 들여야겠다.

Posted by 미랭군
웹어플리케이션서버2013. 5. 10. 20:15

Tomcat Web Application Manager 사용 중 다음과 같은 오류가 발생했습니다.


심각: A web application registered the JBDC driver [core.log.jdbc.driver.InfomixDriver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.

2013. 5. 10 오후 6:51:30 org.apache.catalina.loader.WebappClassLoader clearReferencesJdbc


원인

등록된 JDBC Driver가 미등록 상태로 변경하던 중 실패가 되서 memory leak이 발생함.

강제적으로 미등록 상태로 만들어야 한다고 함.

 

해결

웹 어플리케이션 WEB-INF/lib에 jdbc 라이브러리를 tomcat의 lib 밑으로 옮겨서 관리함.

Posted by 미랭군
웹어플리케이션서버2012. 10. 14. 12:15

1. PKCS12 포맷의 키저장소(keystore) 파일 생성

1.1 openssl 을 이용하여 키파일 과 인증서 파일을 생성한다.
- 참조 :
http://dimdim.tistory.com/entry/openssl-%EC%9D%B8%EC%A6%9D%EC%84%9C-%EC%83%9D%EC%84%B1

1.2 아래와 같이 openssl 명령어로 생성한 키파일 과 인증서 파일을 이용하여 PKCS12 포맷의 키저장소 파일을 생성한다.
- "-in" 옵션은 인증서 파일
- "-inkey" 옵션은 인증서 생성에 사용된 키파일
- "-out" 옵션은 키저장소 파일
- "-name" 옵션 값은 원하는 이름으로 하면 됨

$ openssl pkcs12 -export -in crt.pem -inkey key.pem -out .keystore -name tomcat

Enter Export Password: #패스워드 입력 (Tomcat설정에 사용됨으로 기억해야 함.)
Verifying - Enter Export Password: #패스워드확인


2. Tomcat 설정
- HTTPS 프로토콜을 제공하기 위한 Connector설정을 server.xml 파일에 추가한다.

<Service name="Catalina">

. . .

<Connector
port="8443" maxThreads="100"
scheme="https" secure="true" SSLEnabled="true"
keystoreFile="keystore 파일 경로" keystorePass="keystore 패스워드" keystoreType="pkcs12"
clientAuth="false" sslProtocol="TLS"/>
. . .

</Service>


3. Tomcat 재기동


4. 참고 자료
- JKS 표맷의 키저장소를 사용한 HTTPS 설정 참고자료
- Tomcat HTTPS 설정 참고자료 : http://tomcat.apache.org/tomcat-6.0-doc/ssl-howto.html

Posted by 미랭군

톰캣은 catalina.<날짜>와 catalina.out 두개의 파일을 로깅하고 있어 퍼포먼스에 조금 신경이 쓰이는 부분이 있습니다.

톰캣의 conf 디렉토리 안에있는 logging.properties 안의 내용을 다음과 같이 수정하여 봅시다.

handlers = 1catalina.org.apache.juli.FileHandler

1catalina.org.apache.juli.FileHandler.level = INFO
1catalina.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
1catalina.org.apache.juli.FileHandler.prefix = catalina.


위의 내용을 제외한 나머지는 모두 주석처리 해버리면 catalina.<날짜> 형태의 로그 외에는 모두 기록하지 않습니다.

개발환경이 아닌 단순 서비스 환경에서는 이렇게 로그를 최소화 하는것이 좋겠네요.

1catalina.org.apache.juli.FileHandler.level 의 값을 조정하여 로그 레벨을 정의할수도 있습니다.

 

기존 log생성 막기

먼저 catalina.out이 생성되는 것을 막기 위해

#  touch "$CATALINA_OUT"

처럼 주석처리를 해주고, 생성된 catalina.out에 로그를 찍는 것을 막기 위해

#      org.apache.catalina.startup.Bootstrap "$@" start \
#      >> "$CATALINA_OUT" 2>&1 &

위와 같이 if, else에 각각 하나씩 존재하는 부분을 둘 다 주석처리해줘야한다.


cronolog사용

http://cronolog.org 설치하여 세팅

설치하고자 하는 디렉토리로 이동

# cd /home/esb

cronolog tar파일 다운

# wget http://cronolog.org/download/cronolog-1.6.2.tar.gz

압축해제

# tar xzvf cronolog-1.6.2.tar.gz

해제된 디렉토리로 이동

# cd cronolog-1.6.2

환경에 맞게 설치

# ./configure --prefix=/home/esb/cronolog

# make && make install

# ls -al /home/esb/cronolog/sbin

$CATALINA_BASE/bin/catalina.sh를 편집한다.

org.apache.catalina.startup.Bootstrap "$@" start \
>> "$CATALINA_BASE"/logs/catalina.out 2>&1 &

org.apache.catalina.startup.Bootstrap "$@" \
start |/home/esb/cronolog/sbin/cronolog "$CATALINA_BASE"/logs/%Y-%m-%d.catalina.out >> /dev/null 2>&1 &

 

Posted by 미랭군
Web Application을 만들고 세션 관리를 적절하게 해주지 않고 세션 타임아웃을 무한으로 걸어놓고

시간이 조금 지나면 메모리가 풀이 나서 WAS가 죽어버리는 일이 종종 있다.

이런 문제를 미연에 방지하고 현재 세션 수가 얼마나 되는지 확인하기 위해서 세션 체크하는 리스너를 등록해보자.

HttpSessionListener를 상속받아 구현한 클래스를 만든다.

package com.test.java.listener;
 
import javax.servlet.http.HttpSessionEvent;
 import javax.servlet.http.HttpSessionListener;
 
public class SessionCounterListener implements HttpSessionListener {
   
 static private int activeSessions;
 
    public static int getActiveSessions() {
         return activeSessions;
     }
 
    @Override
     public void sessionCreated(HttpSessionEvent arg0) {
         activeSessions++;
         System.out.println("Created!! activeSessions : " + activeSessions);
     }
 
    @Override
     public void sessionDestroyed(HttpSessionEvent arg0) {
         activeSessions--;
         System.out.println("Destoryed!! activeSessions : " + activeSessions);
     }
 }

다음으로 web.xml에 리스너를 등록합니다.

 <listener>
  <listener-class>com.test.java.listener.SessionCounterListener</listener-class>
 </listener>

또한 세션 종료시간을 정합니다.

 <session-config>
        <session-timeout>15</session-timeout>
 </session-config>
Posted by 미랭군
웹어플리케이션서버2011. 5. 16. 13:50


X11이 없는 리눅스 콘솔에서 발생하는 문제이기 때문에 간단히 java 실행시 headless 모드로 구동하면 된다.

웹서버 구동시 catalina.sh 파일에

CATALINA_OPTS="$CATALINA_OPTS -Djava.awt.headless=true"

라는 옵션을 추가한 후 재구동하면 해결 된다.



Posted by 미랭군