by-nc-sa     개발자, DBA가 함께 만들어가는 구루비 지식창고!

아파치,톰캣 설치시 참고사항




아파치,톰캣 설치시 참고사항

1. 보안 관련 설정

1.1 Apache 설정

1.1.1 WEB-INF 디렉토리의 접근 제한
  • <Location> 지시어를 설정하여 WEB-INF 디렉토리의 접근을 제한한다.
httpd.conf
<Location "/WEB-INF/*">
    Order deny,allow
   deny from all
</Location>
1.1.2 Apache Directory Listing 제한
  • httpd.conf파일의 DocumentRoot 디렉토리 내의 모든 파일들이 리스팅 되는 것을 방지하기 위하여 "Options" 지시자에서 "Indexes" 옵션을 제거
  • <Directory> 지시어를 이용해 css, javascript, html 디렉토리만 허용하는 것을 권장 한다.
httpd.conf
<Directory "/home/user/oracleclub/css">
    Options FollowSymLinks
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>
1.1.3 Trace 메소드 설정
  • Trace 메소드를 사용하면 「XST(Cross-Site Tracing)」이라는 공격에 노출 되는 문제가 발생한다.
  • Apache에서는 TraceEnable 지시자로 쉽게 막을 수 있다.
httpd.conf
TraceEnable Off
1.1.4 Apache Version 노출 예방
  • Servertokens 지시어를 prod로 설정 한다.
  • ServerTokens 지시어는 클라이언트에게 보낼 응답 헤더 필드에 OS 타입과 compiled-in 모듈에 대한 정보 포함 여부를 설정
  • 디폴트로 ServerTokens 지시어는 설정 되어 있지 않음. ServerTokens 지시어 설정 않했을 경우 Full설정 처럼 모든 정보 다 보여줌.
  • ServerSignature를 Off로 설정하여 브라우저에서의 아파치 서버 정보를 숨긴다.
httpd.conf
ServerTokens Prod
ServerSignature Off

 * ServerTokens 옵션은 아래와 같다
  ** Prod[uctOnly] : Apache만 보여줌
  ** Min[imal] : Apache 버젼만 보여줌
  ** OS : 아파치 버젼과 운영체제를 보여줌
  ** Full (또는 지시하지 않았을때) : 모두보여줌
1.1.5 기타
  • httpd.conf 파일의 CustomLog 설정 확인을 확인하여 Log 디렉토리를 DocumentRoot 이외의 디렉토리로 설정
  • Apache 설치 후 htdocs 디렉토리 내의 파일을 삭제하였는가?
  • Apache 설치 후 cgi-bin 디렉토리 내의 파일을 삭제하였는가?

1.2 Tomcat 설정

1.2.1 Tomcat Admin 페이지 제거
  • $TOMCAT_HOME/webapps 이하 모든 admin, manager 디렉토리의 삭제
1.2.2 Tomcat Directory Listing 제한
  • $TOMCAT_HOME/conf/web.xml 파일 수정
$TOMCAT_HOME/conf/web.xml
  <servlet>
    <servlet-name>default</servlet-name>
    <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
    <init-param>
      <param-name>debug</param-name>
      <param-value>0</param-value>
    </init-param>
    <init-param>
      <param-name>listings</param-name>
      <param-value>false</param-value>      <---- 이부분의 true를 false로 설정.   
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
1.2.3 기타
  • Tomcat 설치 후 $TOMCAT_HOME/webapps 디렉토리 내의 파일을 삭제하였는가?

2. 성능 관련 설정

2.1 Apache KeepAlive 설정

  • HTTP 프로토콜은 TCP connection을 매번 끊고, 새로 생성하는 구조이다.
    이 구조는 network 측면에서 비용을 소비하기 때문에 HTTP 1.0 이상에서는 KeepAlive 기능을 지원한다
  • KeepAlive 기능은 웹 페이지를 방문하는 사용자의 TCP connection을 끊지 않고 유지할 지 여부(on/off)를 설정하는 기능이다.
  • on 설정을 통해 일정 시간 내 access가 다시 이루어지기만 하면 계속 TCP connection이 연결된 상태를 유지할 수 있다
    그래서, 보통 동적 파일이 없는 서버에서는 KeepAlive on 설정을 통해 서버의 성능향상을 꾀하고 있다.
  • 하지만, 동적 파일이 많은 서버에서는 한 페이지당 여러 번의 connection이 맺어지기 때문에,
    하나의 connection이 긴 livetime을 갖게 되면, 아파치 프로세스가 급격히 증가하게 된다
    결국 max-client 값을 초과하게 되어 서버 성능에 영향을 주기 때문에, 불특정 다수의 사용자가 접속하는
    포털 서비스에서는 일반적으로 KeepAlive 설정을 off로 설정하고 있다.
httpd.conf
  KeepAlive Off

2.2 Apache prefork MPM(Multi-Processing Module) 설정

  • StartServers
    • 아파치 서버가 시작될 때 생성해야 할 자식 프로세스들의 개수를 결정.
  • MinSpareServers
    • 요청을 처리하지 않고 대기하는 자식 프로세스의 최소 프로세스 수를 지정한다.
    • process들이 계속 사용되어 지면서 idle한 process가 이 개수 이하로 내려가면,
      http listener는 새로운 child process를 추가로 띄워 idle한 process가 최소한 이 갯수 이상은 되도록 맞추게 된다.
  • MaxSpareServers
    • 요청을 처리하지 않고 대기하는 자식 프로세스의 최대 프로세스 수를 지정한다.
    • 대기중인 자식 프로세스의 개수가 MaxSpareServers값 보다 크게 되면 프로세스를 terminate시켜 이 값을 넘지 않게 유지시킨다.
  • MaxClients
    • 동시에 몇개의 client request를 처리할 것인지를 나타낸다.
    • 즉 한 순간에 최대 이 갯수만큼의 httpd process가 active상태로 실제 작업을 하게 되며,
      동시에 이 갯수 이상의 request가 들어오는 경우 error_log를 통해 일부 request들은 처리되지 못했음을 확인 할 수 있다.
    • 최대값은 2048이다
    • 톰캣의 server.xml의 maxThreads의 값보다 많게 설정되어야 한다.
  • MaxRequestsPerChild
    • 특정 아파치 프로세스가 처리해야 하는 요청의 최대 개수를 설정한다.
    • 이 값이 너무 작게 되면 아파치가 너무 자주 프로세스를 시작시키고 종료시켜야 하기 때문에 성능 상의 문제를 일으킬 수 있다.
    • 10000개로 설정하는 것을 권장한다.
httpd-mpm.conf
    StartServers          128
    MinSpareServers       32
    MaxSpareServers      64
    MaxClients          2048
    MaxRequestsPerChild   10000
  • WARNING: MaxClients 발생시
    • WARNING

      WARNING: MaxClients of 1024 exceeds ServerLimit value of 256 servers, lowering MaxClients to 256. To increase, please see the ServerLimit directive

    • 해결책 : ServerLimit를 MaxClients 앞에 동일하게 설정한다.
      <IfModule mpm_prefork_module>
          StartServers          128
          MinSpareServers       32
          MaxSpareServers       64
          ServerLimit           2048
          MaxClients            2048
          MaxRequestsPerChild   10000
      </IfModule>
       

2.3 Apache ETag 설정

  • ETag는 HTTP/1.1 에 명시되어있는 response header로서, cache validation으로 사용될 수 있는 값을 나타낸다.
  • 문제는, 아파치의 경우 ETag값을 파일의 i-node, size, last-modifed time (mtime) 을 이용하여 계산을 하는데
    만약 아파치 웹서버들이 Round-Robin 방식으로 클러스터를 구성하면 웹서버들마다 같은 파일이라도 다른 i-node 값을 갖게될 가능성이 매우 크므로,
    caching을 수행하는 측의 cache hit-ratio가 매우 떨어지게 된다.
  • 아래와 같이 last-modified time과 size 속성값만을 사용하여 ETag를 계산하도록 하면, 같은 파일에 대하여 여러 웹서버들마다 동일한 ETag값이 계산되도록 할 수 있다.
  • 또한 L4 스위치나 DNS Round-Robin 등의 방법으로 여러 서버가 하나의 서비스에 대한 요청을 처리하도록 구성해 놓은 경우
    FileETag MTime, Size 설정을 통하여 외부에서 해당 서비스를 위하여 몇 대의 서버를 운영하고 있는지 알 수 없도록 할 수 있다.
httpd-vhosts.conf

<VirtualHost *:80>
 ...
 FileETag MTime Size
 ...
</VirtualHost>

2.4 mod_jk connection_pool_timeout 설정

  • connection_pool_timeout의 값은 Tomcat AJP connector의 connectionTimeout과 동일한 시간으로 설정한다.
  • connection_pool_timeout은 초 단위이나 AJP connector의 connectionTimeout은 ms 단위 이다.
  • connection_pool_timeout은 DB의 connection timeout 값보다 커야 한다.
workers.properties
  worker.service.connection_pool_timeout=9
  • 아래는 톰캣의 server.xml 설정 예이다.
server.xml
 <Connector port="8019" protocol="AJP/1.3" redirectPort="8444" maxThreads="400" connectionTimeout="9000" useBodyEncodingForURI="true" URIEncoding="UTF-8" />

문서정보

Enter labels to add to this page:
Please wait 
Looking for a label? Just start typing.