긁어온 내용. 출처는 > http://www.gurubee.net/pages/viewpage.action?pageId=26739591&
1. Apache HTTP 서버의 이해
1.1 개요
- Apache HTTP 서버는 아파치 소프트웨어 재단(ASF:Apache Software Foundation)에서 개발하여 배포하고 있는 무료/오픈소스 웹 서버이다.
- 아파치 HTTP 서버는 전세계 웹 서버 시장 점유율의 50% 이상을 차지하고 있으며 , 리눅스, 유닉스, BSD, 윈도우즈 등 다양한 플랫폼에서 사용이 가능하다.
- 아파치 HTTP 서버는 빠르고 효율적이며, 이식성이 좋고 안정적이며, 기능이 다양하고 확장성이 좋다.
1.2 Apache HTTP 서버 왜 필요한가?
- 보안기능 (SSL, Proxy, ACL, Directory 접근제한등..)
- 성능적인 측면(리소스 분산처리, Cache(Expires), HTTP 표준설정(ETag등), MPM(Multi-Processing Module), KeepAlive등..)
- 가상호스트 기능(하나의 서버에 여러 도메인 운영, 서버호스팅등..)
- 운영적인 측면 (ErrorDocument, Access Log등..)
- 부가적인 기능 (여러가지 유용한 Apache Module등..)
1.3 설치
- 최신 버전을 다운( http://httpd.apache.org/download.cgi ) 받아 설치를 진행한다.
- 설치디렉토리는 가능한 C:\dev\Apache2.2 로 맞춘다.
- 실습관련 설치는 가능한 C:\dev로 맞추자
- 설치가 모두 완료 되었으면 http://localhost/ 로 접속하여 정상적으로 설치된 것을 확인한다.
- 리눅스에서 설치 참고 : http://httpd.apache.org/docs/2.0/install.html
2. Apache HTTP 서버의 주요 설정
2.1 가상호스트 (VirtualHost)
- VirtualHost(가상호스트)란 하나의 웹 서버에서 여러 개의 도메인 주소를 운영 및 관리 할 수 있는 기능이다.
- Apache HTTP Server에서는 이름기반 가상호스트와 IP 기반 가상호스트 기능을 제공한다.
이름기반 가상호스트(Name-based VirtualHost) 설정
- 하나의 IP 주소에 여러 개의 호스 도메인 주소 사용이 가능하다.
- httpd-vhost.conf의 VirtualHost를 설정하여 이름기반의 가상 호스트를 사용 할 수 있다.
- httpd.conf 파일에서 httpd-vhosts.conf 파일의 주석을 해제해야 한다.
Name-based VirtualHost 예제
Listen 80 NameVirtualHost *:80 <VirtualHost *:80> ServerName www.oracleclub.com ServerAlias oracleclub.com DocumentRoot C:\workspace\project\oracleclub </VirtualHost> <VirtualHost *:80> ServerName wiki.oracleclub.com DocumentRoot C:\workspace\project\wiki </VirtualHost>
가상호스트 설정 실습
- $APACHE_HOME/conf/extra/httpd-vhost.conf 파일을 열어 NameVirtualHost와 VirtualHost를 아래와 같이 설정한다.
- ServerName은 test.apache.org로 입력하고, DocumentRoot는 아파치 $APACHE_HOME/htdocs로 설정한다.
httpd-vhost.conf
NameVirtualHost *:80 <VirtualHost *:80> ServerName test.apache.org DocumentRoot C:\dev\Apache2.2\htdocs # Apache htdocs 디렉토리 </VirtualHost>
- 아래와 같이 C:\Windows\System32\drivers\etc\hosts 파일에 호스트 설정을 추가 한다.
- hosts.zip 파일을 받아 바로가기를 만들어 사용하면 편하다.
C:WindowsSystem32driversetchosts
# 127.0.0.1 localhost 127.0.0.1 test.apache.org
- Apache restart 후 http://test.apache.org URL이 정상적으로 접속이 되는지 테스트 해보자.
2.2 Files, Directory, Location 섹션
Files (파일시스템 관점)
- 특정 파일에 대한 접근제한을 설정한다.
- 아래는 위치에 상관없이 private.html 파일에 대한 접근을 제한하는 예이다.
<Files private.html> Order allow,deny Deny from all </Files>
- 아래는 "/home/user/webapps" 경로아래에 있는 private.html 파일에 대한 접근을 제한하는 예이다.
<Directory /home/user/webapps> <Files private.html> Order allow,deny Deny from all </Files> </Directory>
Directory (파일시스템 관점)
- 운영체제 입장에서 디스크를 보는 관점이다. 운영체제 디렉토리에 대한 접근제한을 설정한다.
- 아래 예제를 보면서 Allow,Deny에 대해 이해를 해보자
- Order 절 순서대로 Allow와 Deny를 실행한다
- 아래 예는 Allow를 먼저 수행하고, Deny를 수행한다.
- 즉 모두 허용하고, 127.0.0, 192.168.123 두 개의 아이피 대역에 대해서 접근 제한을 설정한다 .
# 특정 IP 대역의 IP 차단 <Directory /usr/local/apache/htdocs> Order Allow,Deny Deny from 127.0.0 192.168.123 Allow from all </Directory>
- 위 예제를 이해하였다면, 아래 예제는 쉽게 이해할 수 있을 것이다.
- Deny를 먼저 수행하고 Allow를 수행한다.
- 127.0.0, 192.168.123 두 개의 아이피 대역만 접근이 가능할 것이다.
# 특정 IP 대역의 IP 허용 <Directory /usr/local/apache/htdocs> Order Deny,Allow Allow from 127.0.0 192.168.123 Deny from all </Directory>
- 아래는 Allow, Deny 설정을 잘못한 예제이다.
- 어떻게 되겠는가?
- 먼저 Allow를 하고, Deny from all을 하기 때문에 모두 차단하겠다라는 의미를 가진다.
<Directory /usr/local/apache/htdocs> Order Allow,Deny Deny from all Allow from 192.168.123.1 </Directory>
Location (웹 경로 관점)
- 웹서버가 제공하는 경로를 클라이언트가 보는 사이트의 관점이다
- 아래는 /private 경로에 대해서 접근을 제한하는 예이다.
- www.oracleclub.com/private 문자열로 시작하는 요청이 해당된다.
<Location /private> Order Allow,Deny Deny from all </Location>
- www.oracleclub.com/private 문자열로 시작하는 요청이 해당된다.
FilesMatch, DirectoryMatch, LocationMatch
- 정규표현식을 사용할 수 있다.
- 아래는 이미지 파일에 대한 접근을 제한하는 예이다.
<FilesMatch \.(?i:gif|jpe?g|png)$> Order allow,deny Deny from all </FilesMatch>
- 아래는 WEB-INF, META-INF 디렉토리에 접근을 금지하는 예이다.
<DirectoryMatch "(^|/)META-INF($|/)"> Order deny,allow deny from all </DirectoryMatch> <DirectoryMatch "(^|/)WEB-INF($|/)"> Order deny,allow deny from all </DirectoryMatch>
Directory 설정 실습
- 위의 Directory Allow, Deny 설정 예제를 직접 실습해 보자
- 아래와 같이 특정 IP의 접근을 막는 Directory 옵션을 추가해 보자 (아래는 로컬 IP 주소의 접근을 막는 예제이다.)
- Apache restart 후 http://test.apache.org 접속시 "Forbidden" 에러 메시지가 나오는지 확인 해 보자httpd-vhost.conf
<VirtualHost *:80> ServerName test.apache.org DocumentRoot C:\dev\Apache2.2\htdocs <Directory C:\dev\Apache2.2\htdocs> Order Allow,Deny Deny from 192.168 127.0.0 Allow from all </Directory> </VirtualHost>
2.3 ErrorDocument
ErrorDocument란
- Apache HTTP Server에서는 ErrorDocument 지시자를 사용해 특정 에러발생시 특정 페이지로 redirect 할 수 있다.
- ErrorDocumen를 활용하여 다양한 HTTP Status Code에 대해서 설정을 해놓으면 사용자에게 좀 더 편리하고 친절하게 메시지를 보여 줄 수 있다.
- httpd.conf 파일에서 ErrorDocument 지시자를 설정하면 된다.
- 아래와 같이 세가지 방법으로 설정 할 수 있다.ErrorDocument 설정 예제
# 1. plain text 설정 방법 # 500 메세지를 "The server made a boo boo." 로 변경해 준다. ErrorDocument 500 "The server made a boo boo." # 2. local redirects 방법 # 404 발생시 missing.html의 내용을 보여준다. ErrorDocument 404 /missing.html # 3. external redirects 설정 방법 # 404 발생시 외부 페이지로 redirect 한다. ErrorDocument 404 http://www.example.com/subscription_info.html
ErrorDocument 설정 실습
- Directory 에서 실습한 접근권한 설정예제에서 403 접근 권한 오류가 발생 했을 때 Apache HTTP Server의 기본 메시지인 "Forbidden" 에러 메시지 대신 특정 HTML 이 나오게 실습 해보자
- AccessDeny.html 파일을 "$APACHE_HOME/htdocs" 디렉토리에 저장한다.
- 아래와 같이 ErrorDocument를 설정 한다.httpd-vhost.conf
<VirtualHost *:80> ServerName test.apache.org DocumentRoot C:\dev\Apache2.2\htdocs ErrorDocument 403 /AccessDeny.html <Directory C:\dev\Apache2.2\htdocs> Order Allow,Deny Deny from 192.168.123 127.0.0 Allow from all </Directory> </VirtualHost>
IE ErrorDocument 설정 기준
- error page 의 사이즈가 아래 기준보다 작으면 IE 메세지를 보여준다.(브라우저가 알아서 에러 페이지가 성의 없다고 판단함)
Code | Description | File Size |
---|---|---|
400 | Bad Request | 512 bytes |
403 | Forbidden | 256 bytes |
404 | Not Found | 512 bytes |
500 | Internal Server Error | 512 bytes |
참고자료
Apache HTTP 서버와 Tomcat서버의 연동
1. Apache와 Tomcat을 연동하는 이유
- Tomcat 서버는 본연의 임무인 서블릿 컨테이너의 역할만 하고, Apache HTTP Server는 웹서버의 역할을 하도록 각각의 기능을 분리하기 위해 연동을 할 수 있다.
- Apache HTTP Server에서 제공하는 편리한 기능을 사용하기 위해서 연동을 할수 있다.
- 대규모 사용자가 사용하는 시스템을 구축할 때 웹 서버인 아파치와 연동을 하면 부하 분산의 효과를 가질 수 있다. mod_jk의 Load Balancing과 FailOver 기능을 사용하여 안정적으로 운영 할 수 있다.
2. Apache와 Tomcat 연동하기
- 아래 내용은 윈도우 OS를 기준으로 설명하였다.
2.1 mod_jk 다운로드 및 설정
- http://www.apache.org/dist/tomcat/tomcat-connectors/jk/binaries/windows/ 에서 버전에 맞는 파일을 다운 받아 $APACHE_HOME/modules 디렉토리에 복사한다.
- Apache HTTP 서버 2.2.x 버전을 설치하였다면 tomcat-connectors-1.2.37-windows-i386-httpd-2.2.x.zip 파일을 다운 받는다
- httpd.conf 파일의 LoadModule 부분에 mod_jk Module을 추가한다.
httpd.conf
# jk_module 추가 LoadModule jk_module modules/mod_jk.so
2.2 workers.properties 파일 설정
- apache와 tomcat를 연동하기위해서는 workers.properties 파일을 설정해야 한다.
- $APACHE_HOME/conf/workers.properties 파일을 아래 예제와 같이 생성한다.
- workers.properties 파일은 일반적으로 httpd.conf 파일과 같은 디렉토리에 위치하게 설정한다.
workers.properties
worker.list=sample # 톰캣 server.xml 파일 AJP/1.3 Connector의 Port를 입력한다. worker.sample.port=8009 # 톰탯 server 호스트 worker.sample.host=localhost # 아파치 + 톰캣 통신 프로토콜 worker.sample.type=ajp13
- ※참고 Tomcat Worker
- 톰캣 워커는(Tomcat worker) 웹서버로부터의 서블릿 요청을 톰캣 프로세스(Worker)에게 전달하여 요청을 처리하는 톰캣 인스턴스이다.
- 대부분 하나의 worker를 사용하나, load 밸런싱이나 site 파티셔닝을 위해 여러개의 worker를 사용 할 수 있다.
- 워커 타입에는 ajp12, ajp13, jni, lb 등이 있다.
2.3 workers.properties 경로 지정
- httpd.conf 파일에 workers.properties 파일 경로를 지정한다.
httpd.conf
# workers.properties 파일 추가 JkWorkersFile conf/workers.properties
2.4 VirtualHost 설정 변경
- $APACHE_HOME/conf/vhosts/extra/httpd-vhost.conf 파일의 VirtualHost의 DocumentRoot를 Tomcat 디렉토리로 변경하자
- JkMount 설정을 추가하자
httpd-vhost.conf 파일 설정
NameVirtualHost *:80 <VirtualHost *:80> ServerName test.apache.org DocumentRoot C:\dev\apache-tomcat-6.0.32webapps\ROOT # URL중 jsp로 오는 Request만 Tomcat에서 처리 함 # sample은 workers.properties에서 등록한 worker이름 JkMount /*.jsp sample # servlet 예제 실행을 위해서 추가 JkMount /examples/* sample </VirtualHost>
2.5 Tomcat의 server.xml 수정
- <Context> 태그의 docBase 디렉토리를 Apache HTTP Server 설정과 동일하게 Tomcat 서버의 webapps/ROOT 디렉토리를 절대경로로 지정하자.
원하는 디렉토리를 Document Root로 사용
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"> <Context path="" docBase="C:\dev\apache-tomcat-6.0.32\webapps\ROOT" reloadable="true"/> .. </Host>
3. Apache HTTP Server와 Tomcat의 연동 테스트
- Apache와 Tomcat을 모두 restart 한 후 http://test.apache.org/ 로 접속해 보자
- 정상적으로 Tomcat 페이지가 실행되었다면 Servlet 예제가 실행되는지 테스트 해보자 http://test.apache.org/examples/servlets/