'server.xml'에 해당하는 글 5건

반응형

 

Tomcat 에서 여러 인스턴스를 관리하는 방법이 있다. CATALINA_HOME 디렉토리에서 필요한 부분만 복제하고 약간의 설정을 수정하여 인스턴스들을 구성할 수 있다. server.xml 파일 하나에 여러 호스트 정보를 등록하여 관리할 수도 있지만 이 경우 Tomcat 을 재구동하면 모든 서비스들이 재구동되는 단점이 있으므로 그다지 추천하지는 않는다.

 

[CATALINA_HOME]

  • Tomcat Engine 디렉토리 : bin, lib
  • Tomcat Instance 디렉토리 : conf(설정), logs(로그), webapps(소스), work(jsp구동), temp(임시)

 

위 내용들 중  Instance 디렉토리를 아래의 절차를 거쳐 별도로 구성해 주면 된다.(Tomcat 설치 생략)

 

  1. 필요한 만큼의 Tomcat Instance 디렉토리를 생성한다.
  2. CATALINA_HOME 으로부터 필요 디렉토리를 복제한다.(conf, webapps)
  3. server.xml 에서 port 등 환경을 변경한다.
  4. 인스턴스 실행/중지 스크립트를 만들고 실행한다.
  5. 방화벽에서 해당 port 를 추가한다.

 

테스트 환경 : CentOS 7 / Tomcat 8.5
테스트 목표 : 서버 ip 에 특정 포트들에 연결되는 여러 인스턴스 구동

 

 

1. Instance 디렉토리 생성

 

# mkdir -p /app/tomcat
# chown -R tomcat:tomcat /app/tomcat
# su - tomcat
$ cd /app/tomcat
$ mkdir -p instance1/logs

 

 

2. CATALINA_HOME 에서 디렉토리 복제

 

$ cp -a /etc/tomcat8/conf instance1
$ cp -a /etc/tomcat8/webapps instance1

 

 

3. server.xml 설정 변경

 

$ vi instance1/conf/server.xml

$ vi instance1/conf/server.xml

<Server port="8005" shutdown="SHUTDOWN">

  <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />

 

여기에 shutdown port 와 http 서비스 port / https port 를 바꿔준다. 인스턴스가 3개 라면 8005/8105/8205, 8080/8180/8280, 8443/8444/8445 처럼 포트가 겹치지 않고 기억하기 쉽도록 구성하면 된다.

 

 

4. 구동 스크립트 생성

 

$ vi instance1/startup.sh

#!/bin/sh
export CATALINA_HOME=/etc/tomcat8
export CATALINA_BASE=/app/tomcat/instance1
$CATALINA_HOME/bin/startup.sh

 

$ vi instance1/startup.sh

#!/bin/sh
export CATALINA_HOME=/etc/tomcat8
export CATALINA_BASE=/app/tomcat/instance1
$CATALINA_HOME/bin/shutdown.sh

 

$ chmod u+x startup.sh
$ chmod u+x shutdown.sh

 

이렇게 설정하면 Tomcat 설치 디렉토리에서는 구동 스크립트만 빌려 각각의 인스턴스를 구동할 수 있게 된다. 구성된 instance1 디렉토리를 필요한 만큼 복제한다.

 

$ cp -a instance1 instance2
$ cp -a instance1 instance3

 

복제 후에는 이미 진행했던 3,4 번 단계의 각 인스턴스 설정(server.xml, startup.sh, shutdown.sh)을 변경해 준다.

 

 

5. 방화벽 해당 port 추가

 

# firewall-cmd --permanent --zone=public --add-port=8080/tcp
# firewall-cmd --permanent --zone=public --add-port=8180/tcp
# firewall-cmd --permanent --zone=public --add-port=8280/tcp
# firewall-cmd --permanent --zone=public --add-port=8443-8445/tcp
# firewall-cmd --reload

 

 

6. 각 인스턴스 구동 후 확인

 

$ /app/tomcat/instance1/startup.sh
$ /app/tomcat/instance2/startup.sh
$ /app/tomcat/instance3/startup.sh

 

http://serverIP:instance1port
http://serverIP:instance2port
http://serverIP:instance3port

반응형

WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

트랙백  0 , 댓글  0개가 달렸습니다.
secret
반응형

tomcat 로그 catalina.out 에서 무수히 발견된 로그들.


30-Sep-2019 09:49:42.578 SEVERE [http-nio-8080-exec-32] org.apache.coyote.http11.Http11Processor.service Error processing request

        java.lang.NullPointerException


org.apache.coyote.http11.Http11Processor 는 http 요청을 처리한다. 위 로그는 server.xml 에 정의된 defaulthostname 이 null 이기 때문에 발생한 예외이다. server.xml 에는 아래와 같은 설정이 기본적으로 되어 있다.


<Engine name="Catalina" defaultHost="localhost">

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


Hostname 을 localhost 그대로 사용할 경우엔 예외가 발생하지 않는다. Hostname 을 변경하고 서버가 직접 요청 받는 경우도 발생하지 않는다. Hostname 을 변경하도나서 로드밸런스 등으로 전달되는 경우 특히 발생하는 것 같다. 예외 발생 빈도는 심하지 않고 시점은 불규칙해서 알 수 없다.


저 예외를 없애려면 Catalina 안에 <Host name="localhost"></Host> 를 한줄 추가하면 해결된다.



반응형

WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

트랙백  0 , 댓글  0개가 달렸습니다.
secret
반응형

* catalina.out 로그


29-Sep-2019 15:12:51.096 INFO [http-nio-8080-exec-29] org.apache.coyote.http11.Http11Processor.service Error parsing HTTP request header

 Note: further occurrences of HTTP header parsing errors will be logged at DEBUG level.

        java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986

                at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:483)

                at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:684)

                at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)

                at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:808)

                at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1498)

                at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)

                at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)

                at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)

                at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)

                at java.lang.Thread.run(Thread.java:748)


Tomcat 8.0.39 버전부터 Query String 에 RFC 7230과 RFC 3986 문서에서 정의되지 않은 문자열을 포함할 경우(^`\|{}[] 같은 특수문자) 발생하는 400 오류(Bad Request) 이다. server.xml 에서 요청받는 Connector 태그에 relaxedQueryChars 속성을 추가하고 허용할 문자열을 정의하여 해결한다.


<Connector port="8080" protocol="HTTP/1.1" ... relaxedQueryChars="^`\|{}[]" />

<Connector port="8443" protocol="HTTP/1.1" ... relaxedQueryChars="^`\|{}[]" />



반응형

WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

트랙백  0 , 댓글  0개가 달렸습니다.
secret

GET 한글 깨짐

Daily/Prog 2017. 5. 18. 00:31
반응형

Java 게시판 검색에서 한글 깨짐 (UTF-8 / GET 방식)


- jsp 파일 상단 charset : UTF-8 확인

- 관련 DB / Table collation : UTF-8 확인


아무문제가 없는데 GET FORM 에서 한글이 깨진다...

당황하지 않고, 소스를 다운받아 로컬에서 실행시켜보니 헉! 겁나 잘됨.

소스는 아무 문제가 없다. 서버 문제인 걸로...


Tomcat 서버 server.xml 파일의 커넥터에 URIEncoding 설정하여 해결


 <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" URIEncoding="UTF-8"/>
cs


쿵 하면 짝 나왔어야 되는데, 쩝.

앞으로도 Tomcat 서버에서 QueryString 한글 깨짐하면 딱 요고 확인하는 걸로.



반응형

WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

트랙백  0 , 댓글  0개가 달렸습니다.
secret

ERR_SSL_OBSOLETE_CIPHER

Daily/Prog 2016. 9. 21. 22:30
반응형



https://www.oops4u.com/main 접속


# 사이트에 보안 연결할 수 없음

# https://www.oops4u.com 에서 지원되지 않는 프로토콜을 사용합니다.

# ERR_SSL_OBSOLETE_CIPHER


ERR_SSL_OBSOLETE_CIPHER... SSL 구식암호라... 

어제 크롬을 최신버전으로 업데이트 하고나서 발생한 오류.

지원되지 않는 프로토콜을 사용합니다... 라니...

단순히 https 일 뿐이고, IE / FF / 구크롬에서는 잘 되는 페이지인데 최신크롬에서만 안된다니!

server.xml 의 Connector 설정에는 TLS 프로토콜을 사용하도록 설정되어 있다.


현재 크롬 버전 : 53.0.2785.116 m


ERR_SSL_OBSOLETE_CIPHER 에 대해서 검색을 해봤다.

딱히 도움되는 내용은 없다 ㅡㅡㅋ 

cipher 로 검색했더니 톰캣에서는 ciphers 리스트 기본값에 보안이 취약한 cipher 가 포함되어 있어서 직접 설정하는 것을 권장(?)했다.

https://www.openssl.org/docs/manmaster/apps/ciphers.html 에서 필요한 프로토콜의 suite 를 긁으면 된다.

server.xml 파일에 아래처럼 cipher 값들을 넣어줬더니 해결되었다.



<Connector port="443" protocol="org.apache.coyote.http11.Http11NioProtocol"

...

ciphers="TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,

TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,

TLS_DHE_RSA_WITH_AES_256_GCM_SHA384,

TLS_DHE_RSA_WITH_AES_128_GCM_SHA256,

TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,

TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,

TLS_DHE_RSA_WITH_AES_256_CBC_SHA256,

TLS_DHE_RSA_WITH_AES_256_CBC_SHA,

TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,

TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,

TLS_DHE_RSA_WITH_AES_128_CBC_SHA256,

TLS_DHE_RSA_WITH_AES_128_CBC_SHA,

TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA,

TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA,

TLS_RSA_WITH_AES_256_GCM_SHA384,

TLS_RSA_WITH_AES_256_CBC_SHA256,

TLS_RSA_WITH_AES_256_CBC_SHA,

TLS_RSA_WITH_AES_128_GCM_SHA256,

TLS_RSA_WITH_AES_128_CBC_SHA256,

TLS_RSA_WITH_AES_128_CBC_SHA,

TLS_RSA_WITH_3DES_EDE_CBC_SHA"

...

/>


L4, ELB 에 붙은 실서버들은 멀쩡한데, 왜 똑같은 Tomcat8 설정에 유독 이 개발서버 한대만 이런일이 발생했는지 모르겠지만

어쨌든 크롬에서는 이번 업데이트에 https 보안에 대해 조금더 신경을 쓴 것 뿐이고,

나처럼 cipher 설정이란 것을 모르고 있는 기업들에서는 열라 땀 삐질한 것 뿐이고,

크롬 오랫동안 참 좋게 봤는데, 이런 건방진 수준의 업데이트 할 줄이야...


반응형

WRITTEN BY
손가락귀신
정신 못차리면, 벌 받는다.

트랙백  0 , 댓글  2개가 달렸습니다.
  1. 정말 정말 정말 정말 감사합니다.!!!!ㅠㅠㅠ
secret