아파치,톰캣 설치시 참고사항
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
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" />
문서정보
- 이 문서는 구루비에서 작성하였습니다.
- 이 문서를 다른 블로그나 홈페이지에 게재하실 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^
- 출처 : http://wiki.gurubee.net/pages/viewpage.action?pageId=3902327&
- 구루비 지식창고의 모든 문서는 크리에이티브 커먼즈의 저작자표시-비영리-동일조건변경허락(BY-NC-SA) 라이선스에 따라 자유롭게 사용할 수 있습니다.