Apache 의 httpd.conf 파일에 대한 분석
This file : apache2.conf
### Section 1: Global Environment
# Do NOT add a slash at the end of the directory path.
#
# 아파치가 설치된 루트경로(경로의 마지막에 "/"를 붙이지 마라고 되어 있네요)
ServerRoot "/etc/apache2"
#
# The accept serialization lock file MUST BE STORED ON A LOCAL DISK.
#
LockFile ${APACHE_LOCK_DIR}/accept.lock
#
# PidFile: The file in which the server should record its process
# identification number when it starts.
# This needs to be set in /etc/apache2/envvars
#
# 아파치가 구동될때 부모 httpd 프로세스의 프로세스ID를 저장한다.
# 서버를 재시작하거나 죽일때 아이디를 알아야 하기때문에 저장해 두는 것이다
# 이 저장경로를 지정
PidFile ${APACHE_PID_FILE}
#
# Timeout: The number of seconds before receives and sends time out.
#
# 요청에 대한 응답 시간 제한
Timeout 300
#
# KeepAlive: Whether or not to allow persistent connections (more than
# one request per connection). Set to "Off" to deactivate.
#
# 접속한 한유저에 대해서 요청에 대한 자료를 모두 전송하고 접속을 끊을것인가 여부
# 접속자가 많지만 메모리가 충분하다 : On
# 접속자가 많지만 메모리 여유가 없다 : Off
# 접속자가 적고 메모리가 충분하다 : On
# 접속자가 적고 메모리 여유가 없다 : Off
# MaxClient 값에 도달해도 swap 메모리를 사용하지 않는 상태가 메모리가 충분한 상태이다
KeepAlive On
#
# MaxKeepAliveRequests: The maximum number of requests to allow
# during a persistent connection. Set to 0 to allow an unlimited amount.
# We recommend you leave this number high, for maximum performance.
#
MaxKeepAliveRequests 100
#
# KeepAliveTimeout: Number of seconds to wait for the next request from the
# same client on the same connection.
#
# 이어지는 요청이 몇초간 없을때 끊을 것인가
# KeepAlive On 일때만 유효하다
KeepAliveTimeout 5
##
## Server-Pool Size Regulation (MPM specific)
##
# prefork MPM
# StartServers: number of server processes to start
# MinSpareServers: minimum number of server processes which are kept spare
# MaxSpareServers: maximum number of server processes which are kept spare
# MaxClients: maximum number of server processes allowed to start
# MaxRequestsPerChild: maximum number of requests a server process serves
<IfModule mpm_prefork_module>
StartServers 5 시작시 최초 process의 갯수
MinSpareServers 5 최소 process 의 갯수
MaxSpareServers 20 최대 processs 의 갯수
MaxClients 150 동시접속가능 최대 client 의 갯수
MaxRequestsPerChild 0
</IfModule>
# worker MPM
# StartServers: initial number of server processes to start
# MinSpareThreads: minimum number of worker threads which are kept spare
# MaxSpareThreads: maximum number of worker threads which are kept spare
# ThreadLimit: ThreadsPerChild can be changed to this maximum value during a
# graceful restart. ThreadLimit can only be changed by stopping
# and starting Apache.
# ThreadsPerChild: constant number of worker threads in each server process
# MaxClients: maximum number of simultaneous client connections
# MaxRequestsPerChild: maximum number of requests a server process serves
<IfModule mpm_worker_module>
StartServers 2
MinSpareThreads 25
MaxSpareThreads 75
ThreadLimit 64
ThreadsPerChild 25
MaxClients 150
MaxRequestsPerChild 0
</IfModule>
# event MPM
# StartServers: initial number of server processes to start
# MinSpareThreads: minimum number of worker threads which are kept spare
# MaxSpareThreads: maximum number of worker threads which are kept spare
# ThreadsPerChild: constant number of worker threads in each server process
# MaxClients: maximum number of simultaneous client connections
# MaxRequestsPerChild: maximum number of requests a server process serves
<IfModule mpm_event_module>
StartServers 2
MinSpareThreads 25
MaxSpareThreads 75
ThreadLimit 64
ThreadsPerChild 25
MaxClients 150
MaxRequestsPerChild 0
</IfModule>
# 프로세스 분배 방식
# 아파치가 받아들인 요청을 처리하기 위해 'child processess'에게 분배하는 방식
# worker 와 prefork 두가지가 있다.
# worker : child process 1개당 thread n개
# prefork : child process 1개당 thread 1개
# 차이점
# 메모리 사용량 : worker < prefork
# 통신량이 많은 서버 : worker 사용
# 속도는 두방식이 비슷함
# prefork 는 안전하지 않은 제 삼자가 만든 모듈을 사용할 수 있음
# prefork 는 디버깅 지원이 빈약한 플랫폼에서 쉽게 디버깅할 수 있음
# httpd -V, apachectl -V 등으로 현재 서버의 방식이 prefork/worker 확인 가능
# prefork 방식 (안전성이 뛰어남)
# 자식프로세스 <---> 스레드
# 자식프로세스 <---> 스레드
# 자식프로세스 <---> 스레드
# worker 방식 (다중방식으로 처리가 가능)
# <--- 스레드 (1)
# 자식프로세스 <--- 스레드 (2)
# <--- 스레드 (3)
#
# 5~10개 사이의 놀고있는 프로세스(Idle Processor)를 띄워놓으면
# 생성 소멸 작업에 의한 부하를 줄일 수 있다.
# 미리 생성해 놓으면 바로바로 처리할 수도 있고 요청을 쪼개서 할당하는식으로
# 자원을 효율적으로 활용할 수 있음
# These need to be set in /etc/apache2/envvars
User ${APACHE_RUN_USER}
Group ${APACHE_RUN_GROUP}
#
# AccessFileName: The name of the file to look for in each directory
# for additional configuration directives. See also the AllowOverride
# directive.
#
AccessFileName .htaccess
#
# The following lines prevent .htaccess and .htpasswd files from being
# viewed by Web clients.
#
<Files ~ "^\.ht">
Order allow,deny
Deny from all
Satisfy all
</Files>
# 알수없는 문서타입에 대해 사용할 기본 mime 타입을 지정
DefaultType None
# 아파치 로그 파일에는 기본적으로 클라이언트의 IP주소가 기록되는데
# On 으로 설정하면 호스트 네임(도메인) 이 기록된다. 도메인으로 기록되면 DNS 로 질의를
# 하는 과정이 추가되기 때문에 속도가 느려지므로 보통 그냥 Off로 둔다.
HostnameLookups Off
# 에러 로그가 기록되는 경로(VirtualHost 에 에러로그에 대한 정보가 없는 경우)
ErrorLog ${APACHE_LOG_DIR}/error.log
# 로그메세지를 기록하는 수준을 지정한다.
# 중요도 순서 및 옵션 : debug -> info -> notice -> warn -> error -> crit -> alert -> emerg
LogLevel warn
# Include module configuration:
# 필요로 하는 모듈을 mods-enabled 폴더에 저장하여 사용한다.
Include mods-enabled/*.load
Include mods-enabled/*.conf
# status.load 모듈을 로드하면
# http://www.yourdomain.co.kr/server-status 여기서 서버를 모니터할 수 있는데
# 아주 자세한 상황까지 일일이 다 모니터하려면 On 을 하고
# 대략적인 상황만 모니터 하려면 Off 한다.
# On 하면 느려질 수 있음
# status.conf 파일에서
# ExtendedStatus On 로 설정하면 된다.
# Include all the user configurations: (추가로 httpd.conf 파일을 include 한다. 현재 파일은 httpd.conf 가 아니라 apache2.conf 파일이다)
Include httpd.conf
# Include ports listing(apache 서비스를 위한 port 정보)
Include ports.conf
#
# The following directives define some format nicknames for use with
# a CustomLog directive (see below).
# If you are behind a reverse proxy, you might want to change %h into %{X-Forwarded-For}i
#
# 로그의 형식을 정의한다.
# 맨끝에 combined, common, referer, agent 는 그냥 레이블이다
LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %O" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
# Include of directories ignores editors' and dpkg's backup files,
# see README.Debian for details.
# Include generic snippets of statements
Include conf.d/
# conf.d/security 파일내에 아래의 내용 설정
# 요청에 대해 응답할때 Header에 서버정보를 제공하는 옵션 (정보를 적게 주는것이 보안에 좋음)
# Prod : 웹서버 종류(Server:Apache)
# Min : 웹서버 종류, 마이너버전까지(Server:Apache/2.2.22)
# Major : 웹서버 종류, 메이저버전까지
# OS : 웹서버 종류, 버전, 운영체제의 종류(Server:Apache/2.2.22(Ubuntu))
# Full : 웹서버 종류, 버전, 운영체제의 종류, 설치된 모듈 등(Server: Apache/2.2.22 (Ubuntu) PHP/3.0 MyMod/1.2 )
# ServerSignature Off 를 통해 서버의 정보를 표시 하지 않을 수 있다.
ServerTokens OS
ServerSignature Off
# Include the virtual host configurations:
Include sites-enabled/
# <VirtualHost> 에서 따로 CustomLog를 지정하지 않으면 여기서 지정한 위치에 로그를 남긴다.
#CustomLog logs/access_log common
#CustomLog logs/referer_log referer
#CustomLog logs/agent_log agent
CustomLog logs/access_log combined
# 디렉토리에 별칭을 주어 접근가능하게 한다.
# 맨앞의 / 는 DocumentRoot 이다
Alias /icons/ "/var/www/icons/"
# Alias 와 기능은 같고 실행할 스크립트 디렉토리에 alias할때 사용한다.
ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
# 요청되는 URL에 파일명이 없을경우 찾아볼 파일들 (첫번째로 찾은걸 보여준다)
DirectoryIndex index.html index.php index.html.var index.htm
# 디렉토리 목록을 보여줄 경우 확장자에 대해 간략한 설명을 달 수 있다.
#AddDescription "GZIP compressed document" .gz
#AddDescription "tar archive" .tar
#AddDescription "GZIP compressed tar archive" .tgz
# 디렉토리를 보여줄 경우에 위(HEADER), 아래(README) 에 추가로 출력할 텍스트 파일 지정
ReadmeName README.html
HeaderName HEADER.html
# 디렉토리를 보여줄 경우 파일이 보이지 않게 설정하는 부분
IndexIgnore .??* *~ *# HEADER* README* RCS CVS *,v *,t
# 커널에서 메모리매핑(mmap)을 지원한다면 아파치가 웹문서를 로딩하기 위하여
# 내부문서를 읽을때에 파일을 메모리 매핑하여 처리한다. 따라서 아파치의 성능이 크게 향상될수 있다.
# 그러나 메모리대응이 서버의 성능을 떨어트리고 심지어 안정성을 해치는 경우가 있고
# smp Solaris 서버에서 아파치 2.0은 종종 mmap을 사용하지 않을때가 더 빠르다.
# 또한 NFS 마운트한 파일시스템에 있는 파일을 메모리 대응하는 도중에 다른 NFS 클라이언트에
# 있는 프로세스가 파일을 지우거나 파일크기를 줄이면, 웹서버 프로세스가 다음 번에 메모리대응한
# 파일내용을 읽을때 bus error가 발생할 수 있다.
# 위의 조건에 해당하면 전송하는 파일을 메모리대응하지 않도록 EnableMMAP off를 사용해야 한다.
#EnableMMAP off
# 아파치 에러에 대해 보여줄 텍스트나 문서지정
# 문자열은 "" 으로 문서는 경로로 지정한다.
# 외부 url로도 가능하다
#ErrorDocument 500 "The server made a boo boo."
#ErrorDocument 404 /missing.html
#ErrorDocument 404 "/cgi-bin/missing_handler.pl"
#ErrorDocument 402 http://www.example.com/subscription_info.html
Alias /error/ "/var/www/error/"
<IfModule mod_negotiation.c>
<IfModule mod_include.c>
<Directory "/var/www/error">
AllowOverride None
Options IncludesNoExec
AddOutputFilter Includes html
AddHandler type-map var
Order allow,deny
Allow from all
LanguagePriority en es de fr
ForceLanguagePriority Prefer Fallback
</Directory>
# ErrorDocument 400 /error/HTTP_BAD_REQUEST.html.var
# ErrorDocument 401 /error/HTTP_UNAUTHORIZED.html.var
# ErrorDocument 403 /error/HTTP_FORBIDDEN.html.var
# ErrorDocument 404 /error/HTTP_NOT_FOUND.html.var
# ErrorDocument 405 /error/HTTP_METHOD_NOT_ALLOWED.html.var
# ErrorDocument 408 /error/HTTP_REQUEST_TIME_OUT.html.var
# ErrorDocument 410 /error/HTTP_GONE.html.var
# ErrorDocument 411 /error/HTTP_LENGTH_REQUIRED.html.var
# ErrorDocument 412 /error/HTTP_PRECONDITION_FAILED.html.var
# ErrorDocument 413 /error/HTTP_REQUEST_ENTITY_TOO_LARGE.html.var
# ErrorDocument 414 /error/HTTP_REQUEST_URI_TOO_LARGE.html.var
# ErrorDocument 415 /error/HTTP_UNSUPPORTED_MEDIA_TYPE.html.var
# ErrorDocument 500 /error/HTTP_INTERNAL_SERVER_ERROR.html.var
# ErrorDocument 501 /error/HTTP_NOT_IMPLEMENTED.html.var
# ErrorDocument 502 /error/HTTP_BAD_GATEWAY.html.var
# ErrorDocument 503 /error/HTTP_SERVICE_UNAVAILABLE.html.var
# ErrorDocument 506 /error/HTTP_VARIANT_ALSO_VARIES.html.var
/mod-enables/setenvif.conf 에서 설정
# ----------------------------------------------------------------------------
# 브라우저들마다 조금씩 다르게 동작하거나 에러가 나는 것들을 방지하기 위해
# 응답을 보낼때 각각의 브라우저들에게 맞게 세팅하는 부분이다
# ----------------------------------------------------------------------------
# 브라우저에 따른 환경세팅
# downgrade-1.0 : 요청이 이후 버전을 사용하더라도 HTTP/1.0 요청으로 처리한다.
# force-gzip : DEFLATE 필터를 사용할때 브라우저의 accept-enconding 설정을 무시하고
# 무조건 압축된 결과를 보낸다
# force-no-vary : 어떤 클라이언트는 Vari필드를 해석하지 못하기 때문에 응답을 보내기전에
# 헤더에서 Vary필드를 뺀다.
# force-response-1.0 : HTTP/1.0 요청을 하는 클라이언트에게 무조건 1.0으로만 보낸다
# 1.1로 보내면 동작하지 않을 수도 있으므로
# gzip-only-text/html : 값이 1이면 text/html이 아닌 content-type에 대해 mod_deflate의
# DEFLATE 출력필터를 사용하지 않는다.
# no-gzipe : mod_deflate 의 DEFLATE 필터를 사용하지 않고 mod_negotiation은 인코딩된 자원을 보내지 않는다.
# nokeepalive : 위에서 설정한 keepalive 를 무시한다.
# prefer-language : 내용협상시 변수가 en,ko,ja 등의 언어태그를 담고 있으면 mod_negotiation은
그 언어로 된것을 보낸다. 없으면 일반적인 협상과정을 시작한다.
# redirect-carefully : Microsoft의 WebFolders 소프트웨어가 리다이렉션을 처리하는데 문제가 있어서 만들어졌다.
# suppress-error_charset :
BrowserMatch "Mozilla/2" nokeepalive
BrowserMatch "MSIE 4\.0b2;" nokeepalive downgrade-1.0 force-response-1.0
BrowserMatch "RealPlayer 4\.0" force-response-1.0
BrowserMatch "Java/1\.0" force-response-1.0
BrowserMatch "JDK/1\.0" force-response-1.0
##############################################################################
# <Directory /> 디렉토리 옵션
##############################################################################
# Directory : 아파치가 접근할 수 있는 각 디렉토리에 대해 어떤 서비스와 기능을
# 허용하고 거부할 것인지를 설정한다. 설정된 디렉토리의 서브디렉토리에도 영향을 미친다
# 옵션의 예
# None : 어떤 옵션도 이용할 수 없다
# All : 모든 명령을 이용할 수 있다.(MultiViews 는 제외)
# Indexes : URL에 지정된 디렉토리에 지정된 파일이 없을경우 파일 목록을 보여준다(보안상 좋지않다)
# Includes : 추가적인 정보를 인클루드한다
# IncludesNoExec : 추가적인 정보를 인클루드하지만 실행파일을 실행하는것은 방지한다(#exec, include)
# FollowSymLinks : 디렉토리에서 심볼릭 링크를 허용한다
# ExecCGI : CGI 스크립트를 실행을 허용한다
# MultiViews : 요청에 따라 적절하게 페이지를 보여준다.
# http 헤드 정보가 Accept-Language:ko 라면 Korea 언어에 맞게 데이터를 클라이언트에 전송한다.
# Order : 서버가 access 컨트롤을 수행하는 순서를 지정한다.
# 예) Order allow,deny (allow 기능을 먼저 수행하고 deny 기능을 수행한다)
# Allow from : 나열되는 주소들에 대한 access 컨트롤을 허용한다
# 예) Allow from all [222.xxx.xxx.xxx 222.xxx.xxx.xxx alov.co.kr]
# Deny from : 나열되는 주소들에 대한 access 컨트롤을 제한한다
# 예) Deny from all [222.xxx.xxx.xxx 222.xxx.xxx.xxx alov.co.kr]
# require : 사용자그룹에 대한 접근을 통제한다
# require user [group vaild-user] <ID>
# user - 지정된 사용자들에게만 접근 허용. AuthUserFile에서 지정
# group - 지정된 그룹에게만 접근을 허용. AuthGroupFile에서 지정
# valid-user - AuthUserFile에 있는 모든 사용자 들에게 접
# SymLinksIfOwnerMatch : 심볼릭 링크를 허용하지만 사용자소유로 되어 있는것만 허용한다
# AllowOverride : AccessFileName 에 설정한 파일(.htaccess) 에 대한 권한 설정
# All : 모든것 허용
# AuthConfig : 사용자 인증 지시자 사용 허용
# AuthDBMGroupFile, AuthDBMUserFile, AuthGroupFile, AuthName, AuthType,
# AuthUserFile, required 등
# FileInfo : 문서유형을 제어하는 지시자 사용 허용
# AddEncoding, AddLanguage, AddType, DefaultType, ErrorDocument, LanguagePriority 등
# Indexes : 디렉토리 인덱싱을 제어하는 지시자 사용 허용
# AddDescription, AddIcon, AddIconByEncoding, AddIconByType, DefaultIcon,
# DirectoryIndex, FancyIndexing, HeaderName, IndexIgnore, IndexOptions, ReadmeName 등
# Limit : 호스트 접근을 제어하는 지시자 허용
# Allow, Deny, order 등
# Options : Options, XBiHack 등과 같은 지시자 사용을 허용
# <Limit> 블럭 : IP나 ID/PW 같은 인증을 거친 사용자에게 허용하는 메쏘드
# <LimitExcept> 블럭 : 인증을 거치지 않은 사용자에게 허용하는 메쏘드
# 시스템 루트에 대한 설정
<Directory />
Options FollowSymLinks # 심볼릭 링크 허용
AllowOverride None # .htaccess 를 허용하지 않음
</Directory>