웹서버관련정보/윈도우

[강좌] 아파치 2.0.x , 2.2.x 설정가이드

박디 2007. 8. 26. 19:40

(이 글은 윈도우용 아파치 서버 2.2.x 버전을 기준으로 작성되었습니다. 1.x 버전의 아파치 서버나
 리눅스용 아파치 서버에는 적용되지 않는 부분이 상당수 있으므로 이 점 참고하시기 바랍니다.)

APM을 설치하고 나서 기본설정만으로 운영할수는 있으나 서버의 전체적인 성능과 보안을 위한
설정을 해주는것이 좋다. 아래의 내용은 아파치 재단 홈페이지(http://apache.org) 에서 배포하는
윈도우용 2.2.4 아파치를 기준으로 수정했고 RWAPM의 설정파일 내용중 대부분을 참고했다.

-참고사항(수정한 부분, 사용자환경에 맞춰서 바꾸도록 한다.)-
 ⊙ 아파치서버가 설치된 디렉토리 : C:\APM\Apache2
 ⊙ PHP가 설치된 디렉토리 : C:\APM\PHP
 ⊙ PHPmyadmin 이 설치된 디렉토리 : C:\APM\phpmyadmin
 ⊙ '#'은 주석을 의미하며 아래 설정파일 내용은 그대로 복사해서 사용가능하다.

-------------------------------------------------------------------

#서버가 설치된 경로
#가능하면 Apache나 APM은 루트디렉토리에 설치하는것이 좋다. 설정도 편해지고 긴경로가
#정확하지 않으면 기타 모듈들이 제대로 읽히지 않을수도 있다.

ServerRoot "C:\APM/Apache2"

#PID(Process ID) : 아파치 프로세스의 고유ID가 저장되는 파일을 저장하는 경로를 정해준다.

#Timeout : 클라이언트 접속시 받기, 보내기의 타임아웃 시간을 지정한다. 시간이 너무 짧을경우
#클라이언트가 서버의 내용을 제대로 읽지 못하고 튕겨질수 있다.

#KeepAlive : 서버의 전반적인 성능에 영향을 주는 지시문이다. 클라이언트가 한번의 접속으로
#지속적인 요청을 수행할수 있게할지 못하게할지 설정해주는 부분이다. 서버의 사양이 좋지 않다면
#부하가 심할수있으나 접속자가 적고 저사양의 서버라면 Off로 해두는것이 좋다.

#MaxKeepAliveRequests : KeepAlive와 연관된 부분으로 지속된 접속시간동안 처리할수 있는
#최대 요청갯수를 의미한다. 높은값을 주는것이 좋다.

#KeepAliveTimeout : 클라이언트가 접속상태에서 해당 클라이언트의 요청이 타임아웃되는 시간

PidFile logs/httpd.pid
Timeout 300
KeepAlive On
MaxKeepAliveRequests 1000
KeepAliveTimeout 30

#Multiprocessing Module 섹션
#아파치 서버의 1.x 버전에서는 없던 기능이 2.x에서 부터 추가되었으며 1.x버전보다 적은 자원을
#사용해서 여러요청을 처리할수 있게 했다는 한마디로 성능이 향상된 부분이다.

#ThereadsPerChild : 하나의 프로세스당 몇개의 thread를 유지하고 있을지 설정해주는 부분이다.
#최대 1024까지 늘릴수 있는데 리눅스용은 재컴파일을 통해 이를 수정할수 있다. 서버의 사양이
#좋지 않다면 이값을 과도하게 늘리지 않는것이 좋다.

#MaxRequestsPerChild : 하나의 프로세스가 몇번의 요청을 수행하고 죽을지 설정해주는 부분이다.
#아래 내용과 같이 설정하면 10000번의 요청을 수행한뒤 ChildProcess하나가 죽고 새로 생성된다.
#값을 '0'으로 주면 무한대를 의미하며 서버의 사양이 좋지않다면 1000정도의 값을 권장한다. 무한대
#로 설정하는것이 좋을수도 있으나 일반PC를 서버로 쓰는경우 여러가지 오류로 메모리 누출이 생길
#수 있으므로 값을 적당히 설정해주는것이 좋다.

#Win32DisableAcceptEx : 가끔 네트워크를 사용할수 없다는 오류를 에러로그에서 발견할수있는데
#이구문을 활성화 하면 괜찮아진다.

<IfModule mpm_winnt.c>
ThreadsPerChild 200
MaxRequestsPerChild  10000
#Win32DisableAcceptEx
</IfModule>

#읽어들일 포트번호 설정
#기본적으로 80번포트가 웹서버 포트이나 ISP들이 자체적으로 막아놓은 경우가 있다. 이경우엔
#다른 포트를 사용해야 하는데 8080,9999등의 포트가 많이 쓰인다. 이경우 Listen 9999 등으로설정
#해주면 된다.

Listen 80

#Dynamic Shared Object (동적공유객체) 모듈 섹션
#아래내용은 아파치 2.x 버전에서 기본적으로 로딩되는 모듈에 몇가지가 추가 되어있는데
#필요없는 모듈은 주석처리를 해서 읽어들이지 않는것이 좋다. 기본적으로 제공되는 모듈외에
#서드파티 모듈또한 LoadModule 지시어를 사용해 쉽게 읽어들일수 있다. 적재순서에 따라
#성능에 영향을 줄수 있다고 한다.

#PHP 모듈 로딩섹션
#PHP를 연동시키기 위해 반드시 필요한 설정부분이다. 아파치 2.0.x 버전의 경우 php5apache2.dll
#를 읽어들여야 한다.

LoadModule php5_module "../php5/php5apache2_2.dll"

#Third Party 모듈 설정섹션(mod_evasive, mod_bandwidth, mod_security2)
#아파치에서 기본적으로 제공하는 모듈이 아니므로 따로 구해야한다. 구하지 못했다면 이부분은
#그냥 넘어가도 된다.

#Dos(Denial of Service),DDos(Distributed Denial of Service) 공격 방어 모듈설정
#리눅스의 경우 iptable을 사용해 근본적으로 막을수 있으나 윈도우에서는 IPsec등을 사용해야
#한다. 이 모듈은 개인용도의 서버에는 쓸만한 모듈이지만 과도한 공격이 시도될경우 서버가
#뻗어버릴수 있다. 이 모듈은 윈도우용으로 기본제공 되지 않으며 http://apachelounge.com
#에서 구할수 있다.

LoadModule evasive_module modules/mod_evasive.so
<IfModule evasive_module>
    DOSHashTableSize    3097
    DOSPageCount        70
    DOSPageInterval     1
    DOSSiteCount        200
    DOSSiteInterval     1
    DOSBlockingPeriod   10
    DOSLogDir "C:/APM/Apache2/logs"
</IfModule>

#Apache 방화벽 ModSecurity2 설정
#1.x 버전의 경우 한개의 설정파일에서 모든것을 관리했으나 2.x 버전에서는 여러가지 설정으로
#많은 부분의 부적절한 접속 시도를 막아준다. 상용 방화벽에 버금가는 강력한 공개 방화벽 모듈
#로 알려져있다. 윈도우용이 제공되지 않으며 http://apachelounge.com 에서 구할수있다.
#2.0.x , 2.2.x 버전에서 사용가능하다.

LoadModule security2_module modules/mod_security2.so
<IfModule security2_module>
Include conf/security/modsecurity_crs_10_config.conf
Include conf/security/modsecurity_crs_21_protocol_anomalies.conf
Include conf/security/modsecurity_crs_35_bad_robots.conf
Include conf/security/modsecurity_crs_45_trojans.conf
Include conf/security/modsecurity_crs_55_marketing.conf
Include conf/security/modsecurity_crs_20_protocol_violations.conf
Include conf/security/modsecurity_crs_30_http_policy.conf
Include conf/security/modsecurity_crs_40_generic_attacks.conf
Include conf/security/modsecurity_crs_50_outbound.conf
</IfModule>

#Bandwidth(대역폭) 제한모듈 mod_bandwidth 설정
#전송되는 파일의 속도를 일정하게 유지시켜주는 모듈이다. 아래의 LargeFileLimit 부분의
#1024 250000 의 의미는 1024kb 가 넘는 파일은 250kb의 속도로 전송하라는 의미이다. 사용자의
#환경에 맞춰 수정해서 사용하면 된다. 이 모듈역시 http://apachelounge.com 에서 구할수 있고
#없어졌다면 이블로그에서 찾을수 있다.

LoadModule bw_module modules/mod_bw.so
<IfModule bw_module>
BandWidthModule On
ForceBandWidthModule On
LargeFileLimit * 1024  250000
</IfModule>

#압축전송모듈
#Mod_deflate가 활성화 되있어야 사용할수 있다. 설정에서 정해진 파일들을 읽어들이는
#속도의 향상이 있다.
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png|bmp|zip|tar|rar|alz|a00|ace|txt|mp3|mpe?g|wav|asf|wma|wmv|swf|exe|pdf|doc|xsl|hwp|css|js|java|c|t?gz|bz2|7z)$ no-gzip dont-vary
Header append Vary User-Agent env=!dont-vary
</Location>

#서버관리자의 정보를 입력하는 부분이다.
#ServerName의 경우 정해진 도메인명의 이름을 써주는것이 좋지만 localhost나 127.0.0.1을 써줘도
#별 영향이 없으나 정확한 IP주소를 입력할경우 리다이렉션이 가능하게 해줄수 있다.
#UseCanonicalName : Off,DNS의 옵션을 써줄수 있는데 off는 이름기반의 호스트에서 쓰이며 DNS
#옵션은 IP기반 호스트에서 쓰인다. 일반적으로는 Off로 해두면 된다.

ServerAdmin test@example.com
ServerName localhost
UseCanonicalName Off

#Document 디렉토리 설정섹션

#저장될 문서디렉토리를 지정해주는 부분이다. 물론 따로 디렉토리를 설정해 줄 부분이 있다면
#<Directory> 구문으로 추가 및 수정을 할수 있다.

#FollowSymLinks : 윈도우의 단축아이콘은 보안상 사용하지 않는것을 권장하고 있다.

#AllOverride : 인증관련 파일인 .htaccess와 관련된 부분이다. 아파치가 접근할수 있는 디렉토리
#들에 대해 어떤 기능을 허용 또는 거부 할것인지 설정할수 있는 부분이다. none을 권장한다.
#Authconfig,Limit,All,Fileinfo 등의 지시자를 사용할수 있으나 특별한 상황이 없는경우 none을
#사용하도록 한다.

#Indexes : 설정해서 읽어들일 html,htm,php등의 파일이 없을때 파일리스트를 불러 들이는 지시
#자 이다. 타인에게 리스트를 보여주고 싶지 않다면 indexes를 삭제하면 된다.

#Order, Deny, Allow : Order로 allow나 deny를 지정해주고 어느부분에서 허용또는 거부할것
#인지 정한다.

DocumentRoot "C:\APM\htdocs"
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory "C:\APM\htdocs">
Options FollowSymLinks Multiviews
AllowOverride FileInfo
Order allow,deny
Allow from all
</Directory>

#User 디렉토리 설정섹션
#이 디렉토리를 통해 간단한 호스팅을 할 수 있다. 예를들어 parkdi 라는 디렉토리를 user
#디렉토리에 넣어두면 사용자의 주소는 http://example.com/~parkdi 가 된다.

UserDir "C:\APM\users"

<Directory "C:\APM\users">
AllowOverride FileInfo AuthConfig Limit
Options MultiViews SymLinksIfOwnerMatch IncludesNoExec
<Limit GET POST OPTIONS PROPFIND>
Order allow,deny
Allow from all
</Limit>
<LimitExcept GET POST OPTIONS PROPFIND>
Order deny,allow
Deny from all
</LimitExcept>
</Directory>

#인덱스로 사용할 파일명 설정 스페이스바로 구분한다. 동일 파일명이 있을시 앞쪽 파일이
#우선권을 가진다.

DirectoryIndex index.html index.htm index.php index.php3
AccessFileName .htaccess

#특정파일 형식을 지정해서 접근하지 못하게 한다. 여기서는 ht로 시작되는 모든파일에 대한
#접근금지와 bak,sav,orig,old 파일의 접근을 금지하고 있다.

<FilesMatch "^\.ht">
Order allow,deny
Deny from all
</FilesMatch>
<LocationMatch /*(\~|\.bak|\.sav|\.orig|\.old)$>
deny from all
</LocationMatch>

#mime.types파일이 저장된 위치를 지정하는 부분
TypesConfig conf/mime.types

#파일확장자를 통해 MIME타입을 알수 있는 문서에대해 기본적으로 쓸 MIME타입을 지정해준다.
#텍스트가 위주라면 text/plain으로 이미지나 바이너리 파일이 있다면 파일을 텍스트 형식으로 불러
#들이지 않게 application/octet-stream 을 입력해준다.

DefaultType text/plain

#인터넷 문서의 형식이 지정되있지 않을경우 파일의 내용을 통해 자동결정 하게 된다. 이를 conf
#폴더내의 magic 파일을 통해서 문서형식을 결정하게 된다.

<IfModule mod_mime_magic.c>
MIMEMagicFile conf/magic
</IfModule>

#EnableMMAP : 메모리매핑에 관련된 부분으로 성능향상을 가져올수 있다고 하는데 충돌이 생겨
#서버가 다운될수도 있으므로 기본값을 유지하는것을 권장하고 있다.

#EnableSendfile : 커널이 지원하는 형식을 통해 파일을 전송한다.

#HostnameLookups : 클라이언트의 IP,이름을 기록할지의 여부를 결정하는 부분이다. 기본값인
#off로 해둘경우 클라이언트의 IP를 저장하게 되며 on으로 해둘경우 이름으로 저장하게 된다.
#on으로 해두면 적어도 한번은 서버에 네임서버 요청이 발생하므로 꺼두는것이 서버의 부하를
#하나라도 줄여주는 길이다.

HostnameLookups Off
EnableMMAP off
EnableSendfile on

#로그파일이 저장될 형식을 지정하는 부분이다. error 로그의 경우 warn,debug,info,notice,crit
#alert 등의 값을 결합할수 있는데 로그파일의 크기가 상당히 커질수 있으므로 warn으로 지정해
#두는것이 좋다.
#LogFormat : CustomLog지시자에서 사용할 형식에 대한 지정부분이다.

ErrorLog logs/error.log
LogLevel warn

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent

# You need to enable mod_logio.c to use %I and %O
#LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combined

#로그파일의 위치,형식지정
#형식을 지정하지 않으면 모든 메시지를 로그파일에 저장하게 되고 지나치게 큰 로그파일은 서버
#의 속도를 저하시킨다.

CustomLog logs/access.log common
#CustomLog logs/referer.log referer
#CustomLog logs/agent.log agent
#CustomLog logs/access.log combined

#서버의 정보를 어느정도 까지 보여줄지 지정해주는 부분이다.
#ServerTokens Prod : Apache의 모든정보만 보여줌
#ServerTokens Min : Apache의 버전정보만 보여줌
#ServerTokens OS : Apache의 버전과 운영체제를 보여줌
#ServerTokens Full : 모든정보를 표시함
#ServerSignature : Off로 해두면 브라우저에서 보일수 있는 에러페이지의 아파치 서버 정보를
#숨길수 있다.

ServerTokens Full
ServerSignature Off

#별칭(가짜이름)을 지정해주는 부분이다. 적용예는 'Alias 별칭 실제이름' 으로 지정할수 있다.
#이는 서버의 메인디렉토리에 없는 부분을 마치 있는것처럼 속여주는 부분인데 아래의 예와같이
#메인디렉토리에 phpmyadmin 디렉토리에 phpmyadmin이 설치되있다면 alias를 지정시 따로
#별칭을 만들게 되어 운영이 비효율적이게 된다. 참고해서 수정,사용하도록한다. alias를 사용해서
#다른 디스크드라이브에 있는 내용을 마치 메인디렉토리에 있는것 처럼 사용할수 있다.

Alias /phpmyadmin "C:\APM/phpMyAdmin"
Alias /icons/ "C:\APM/Apache2/icons/"

<Directory "C:\APM/Apache2/icons">
Options Indexes MultiViews
AllowOverride None
Order allow,deny
Allow from all
</Directory>

#디렉토리 목록 표시여부를 결정하는(어떻게 보일지) 부분이다.
IndexOptions FancyIndexing VersionSort

#서버에게 파일,확장자에 대해 어떤 아이콘을 보여줄지 설정해주는 부분이다. 이 설정은
#바로 위에서 FancyIndexing 을 사용했을때 적용가능하다.

#ReadmeName : 디렉토리 목록뒤에 내용을 덧붙힐 Readme파일의 이름을 설정한다.
#HeaderName : 디렉토리 인덱스 앞에 내용을 덧붙힐 파일명을 설정한다.
#클라이언트의 요청시 서버는 readme.html파일을 찾게되고 없으면 txt파일을 찾아서 텍스트
#내용으로 표시하게 된다.

ReadmeName README.html
HeaderName HEADER.html

#디렉토리 인덱싱의 목록에서 제외할 파일명을 설정한다.
IndexIgnore .??* *~ *# HEADER* README* RCS CVS *,v *,t

#문서의 언어를 명시하는 부분이다. 웹브라우저가 이해할수 있는 언어의 문서를 제공할 수 있다.


#언어셋 섹션
AddCharset ISO-8859-1  .iso8859-1 .latin1
AddCharset ISO-8859-2  .iso8859-2 .latin2 .cen
AddCharset ISO-8859-3  .iso8859-3 .latin3
AddCharset ISO-8859-4  .iso8859-4 .latin4
AddCharset ISO-8859-5  .iso8859-5 .latin5 .cyr .iso-ru
AddCharset ISO-8859-6  .iso8859-6 .latin6 .arb
AddCharset ISO-8859-7  .iso8859-7 .latin7 .grk
AddCharset ISO-8859-8  .iso8859-8 .latin8 .heb
AddCharset ISO-8859-9  .iso8859-9 .latin9 .trk
AddCharset ISO-2022-JP .iso2022-jp .jis
AddCharset ISO-2022-KR .iso2022-kr .kis
AddCharset ISO-2022-CN .iso2022-cn .cis
AddCharset Big5        .Big5       .big5

# For russian, more than one charset is used (depends on client, mostly):
AddCharset WINDOWS-1251 .cp-1251   .win-1251
AddCharset CP866       .cp866
AddCharset KOI8-r      .koi8-r .koi8-ru
AddCharset KOI8-ru     .koi8-uk .ua
AddCharset ISO-10646-UCS-2 .ucs2
AddCharset ISO-10646-UCS-4 .ucs4
AddCharset UTF-8       .utf8
AddCharset GB2312      .gb2312 .gb
AddCharset utf-7       .utf7
AddCharset utf-8       .utf8
AddCharset big5        .big5 .b5
AddCharset EUC-TW      .euc-tw
AddCharset EUC-JP      .euc-jp
AddCharset EUC-KR      .euc-kr
AddCharset shift_jis   .sjis

#mime.types파일의 수정없이 MIME설정을 할수 있게 해주는 부분이다. 또한 아래와 같이 특정 파일
#들에 대해 특정타입으로 처리할수 있게 해준다.

AddType application/x-compress .Z
AddType application/x-gzip .gz .tgz

#AddHandler를 사용함으로 파일들의 확장자나 처리기(예 : CGI라면 Perl등..)을 연결하거나 파일
#타입에 대한 동작을 연결할 수 있다.

AddHandler cgi-script .cgi .pl .pm
AddHandler type-map var
AddType text/html .shtml
AddOutputFilter INCLUDES .shtml

#PHP를 위한 설정 AddType 사용으로 php확장자의 파일들에 대한 처리 타입을 지정해주고 php.ini
#파일이 있는 위치를 설정해준다.

AddType application/x-httpd-php .php .php3 .htm .html .inc .phtml
PHPIniDir "C:\APM\php5"

#에러 메시지 다국어 표시 섹션


#이부분을 없애버리거나 주석처리 하면 오류페이지 자체가 뜨지 않는다.

#CodeRed/Nimda 로그를 남기지 않게 하고 차단시켜 MS 홈페이지로 리다이렉트로 이동하는 섹션

#버추얼 호스트 설정파일 인클루드. conf 디렉토리에 두는것이 관리가 편하다.
Include conf/vhost.conf

#아파치 2.x 나 2.2.x 버전중 SSL페이지를 사용할수 있는 버전을 다운로드 해서 설치했고 필요
#하다면 인클루드 시킨다.

#LoadFile bin/libeay32.dll
#LoadFile bin/ssleay32.dll
#LoadModule ssl_module modules/mod_ssl.so

# SSL 버추얼 호스트설정파일 인클루드.

#<IfModule mod_ssl.c>
#Include conf/ssl.conf
#</IfModule>