# 서버 타입을 설정하는 지시자 이다.
# ServerType 에서 설정할 수 있는 것은 Standalone 과 inetd 두가지 설정이 있다.
ServerRoot /usr/local/apache
# 아파치 서버의 루트 디렉토리를 설정한다.
PidFile /usr/local/apache/logs/httpd.pid
# 아파치가 실행될 때 생성되는 httpd.pid 파일이 생성될 경로를 지정한다.
ScoreBoardFile /usr/local/apache/logs/httpd.scoreboard
#부모 프로세스가 자식 프로세스와 의사 소통을 할 때 사용되는 지시자와 그 파일을 지정한다.
Timeout 300
# Timeout은 클라이언트에서 서버로 접속할 때 클라이언트나 서버의 통신장애로 인해 300초 동안 클라이언트에서
# 완벽한 처리를 하지 못할 때 클라이언트와의 연결을 해제한다.
KeepAlive On
# 서버와의 지속적인 연결을 하도록 설정되어 있다. 즉 한번의 연결에 대해 한번의 요청만 처리하는 것이 아니라 또 다른
# 요청을 기다리게 된다. 하지만 지속적인 연결 시간은 KeepAliveTimeout 값에 설정한 만큼 유지된다.
# KeepAlive를 Off로 설정하게 되면 클라이언트로 부터 한번의 요청을 받은 후 바로 접속을 해제한다.
# 특별한 경우가 아니라면 On 상태로 유지하는 것이 좋다.
more..
매 request마다 새로운 connection을 맺지 않음으로써 일반적으로 성능 향상을 기대할 수 있다. 하지만 대규모 환경에서 KeepAlive On으로 인해 http process가 매우 많이 유지되는 경우, process들을 유지하는데 드는 overhead가 커지게 되어, 이 값을 Off로 하여 httpd process를 적게 유지하는것이 전체적인 resource 사용 및 성능에 도움이 될 수 있다.
MaxKeepAliveRequests 100
# KeepAlive 상태에서 처리할 최대 요청 처리 건수를 설정한다.
# 보통의 웹 사이트에서는 설정값 100으로 충분하다.
# 서버가클라이언트와의접속을유지하면서최대클라이언트로부터받을수있는요청의수이다
# 즉 한번 연결후에 클라이언트에서 번의 요청을 받았다면 자동으로 설정을 끊는것이다
# 0 으로설정을하는것은클라이언트에서스스로접속을끊을때까지모든요청을받는다는것이다
# 웹사이트가 복잡하게 되어있는 웹서버에서는 이 값을 늘여주는 것이 좋다
more..
default: MaxKeepAliveRequests 100
KeepAlive가 On으로 설정된 경우, 한 connection에서 처리될 request의 수를 제한한다. 결국 KeepAlive가 설정된 경우, 여기 설정된 갯수만큼의 request를 처리하거나 혹은 MaxKeepAliveTimeout에 설정된 초동안 inactive가 되면 connection은 close되는 것이다.
KeepAliveTimeout 15
# KeepAlive 상태를 유지할 시간을 초 단위로 설정한다.
# 접속이 유지된다고 해도 하루종일되어있다면 동시접속자 제한에 걸려서웹서버의 접속을 할수없게된다.
# 이때 설정해 주는값으로 지정된 시간동안 요청이 없으면 서버에서 연결을 끊어버리게되어 다른 접속자가
# 웹서버에 접속 할 수 있도록 설정 해주는것이다 .
# 동시접속자가 많을때 웹서버 성능을 너무 떨어뜨리지 않게 하기 위해서 를 으로 설정해놓고 이 값을 줄여주는 방
# 법도 있다
more..
KeepAlive의 값이 On인 경우 같은 connection에서 몇 초나 더 다음 request를 기다릴 것인지를 나타낸다. 여기 지정된 시간이 지나도 연결된 client로부터 다음 request가 없는 경우 connection은 close되게 된다.
MinSpareServers 5
# 아파치가 실행될 때 최소 예비 프로세스 수를 설정한다. 이 값에 의해 현재 nobody 소유의 아파치 프로세스가 5보다
# 작을 경우 자동으로 부족한 만큼의 아파치 프로세스 생성한다.
# 8 정도 설정하는 것이 적당하다.
# 접속자가 많은 경우는 10~15 정도로 설정하자.
more..
default: MaxSpareServers 10
idle한 child process갯수의 최대값을 지정한다. idle한 child process갯수가 MaxSpareServers값 보다 크게 되면 idle한 process를 terminate시켜 이 값을 넘지 않게 유지시킨다.
Windows에서는 효과가 없다.
MaxSpareServers 10
# 아파치가 실행될 때 최대 예비 프로세스 수를 설정한다. 이 값에 의해 현재 nobody 소유의 아파치 프로세스가 10보다
# 클 경우 불필요한 프로세스를 제거한다.
# 20 정도 설정하는 것이 적당하다.
# 접속자가 많은 경우는 40-50 으로 설정하자.
StartServers 5
# 아파치가 실행될 때 생성 시키는 자식 프로세스 수이다.
# 하지만 이 값이 MinSpareServers 값보다 작을 경우 아파치 실행 후에 바로 MinSpareServers 의 설정만큼 생성하기
# 때문에 아무런 의미가 없게 된다. StartServer 값과 MinSpareServers 값은 같은 값을 설정하는것이 바람직하다.
more..
(8) StartServers
default: StartServers 5
ohs start시 구동될 child process의 갯수를 지정한다. child process들의 갯수는 업무 부하와 이곳에 설명된 directive들에 의해 유동적으로 변경되기 때문에 StartServers의 값이 큰 의미를 지니지는 않는다.
하지만 일반적으로 동시 request가 많아 httpd process가 전체적으로 많이 사용되는 경우 미리 충분한 갯수를 띄워 두어 필요에 따라 추가로 뜨는 부하를 줄일 수 있다.
Windows 시스템의 경우 이 directive도 효과가 없다. ThreadsPerChild를 참조한다.
MaxClients 150
# 아파치 서버의 동시 접속자 수를 정의한다.
# 최대 값은 256이다.
# 256 이상의 값을 설정하고 싶을 때는 아파치 소스의 httpd.h 헤어 파일의 HARD_SERVER_LIMIT 부분을 수정하고
# 아파치를 다시 컴파일 해야 된다.
more..
default: MaxClients 256
동시에 몇개의 client request를 처리할 것인지를 나타낸다. 즉 한 순간에
최대 이 갯수만큼의 httpd process가 active상태로 실제 작업을 하게 되며,
동시에 이 갯수 이상의 request가 들어오는 경우 error_log를 통해 일부
request들은 처리되지 못했음을 확인할 수 있다.
단 이 값을 동시 사용자만큼 두어야 하는것은 아니다. 이미 알고 있듯이,
HTTP 처리는 db connection과는 달라서 실제 1000명의 동시 사용자가
HTTP process를 진행 중이라해서 1000개의 connection이 맺어지고 그 connection이 모두 request를 처리 중인 것은 아니다. 1000명의 동시 사용자가 작업 중이라 하더라도 한 시점에서 보면 그 보다는 훨씬 적은 수의 동시 request가 처리중이게 된다.
MaxClients의 최대값은 $ORACLE_HOME/Apache/Apache/include/httpd.h의 HARD_SERVER_LIMIT 값으로 지정되어 있으며, apache 1.2.13에서는 256, 9iAS 1.x에서는 1024, 9iAS 9.0.2 이상에서는 8192 이다.
이미 언급한 바와 같이 한개의 child process안에 thead방식으로 움직이는,
Windows system에서는 이 directive가 의미가 없다. 아래 ThreadsPerChild값을 참조하도록 한다.
MaxRequestsPerChild 0
# 아파치의 자식 프로세스가 처리할 수 있는 최대 요청 처리 건수를 설정한다.
# 0 은 무제한을 뜻한다.
# 한 자식 프로세서당 처리 할 수 있는 최대 요청수는 0으로, 자식프로세서가 죽지않으므로 속도향상을 기대 할 수는
# 있으나 잘못된 프로그래밍이나 코드수행으로 인해서 문제가 발생할경우에는 서버전체에 부하를 유발 할 수가 있다
# 보통 정도로 설정하고 사이트가 복잡하거나 요청이 많아야 할 경우에는 500-1000등으로 수치를 올려준다.
more..
(5) MaxRequestsPerChild
default: MaxRequestsPerChild 0
MaxRequestsPerChild는 하나의 child process가 최대 처리할 수 있는 request수를 제한한다. httpd process는 ilde상태가 되었다 하더라도 바로 terminate되지 않고 아래 설명되는 MinSpareServers/MaxSpareServers값에 의해 다시 필요에따라 사용될 수 있다. 이러한 과정에서 httpd process가 구동되는 시간이 매우 오래되고 OS상에 memory leak문제등이 존재하는경우 누적되는 memory leak 공간이 상당히 커지는 문제가 발생할 수 있다.
이 directive는 현재 상황의 전체 process수를 제한한다기보다, 다른 모든
directive와 관계없이 각각의 child process에 대해서 각자 이제까지 처리한
request의 수가 일정 수에 도달하면 해당 process를 terminate시키고 필요에 따라 다시 start시켜서 child process의 lifetime을 제한하게 된다.
KeepAlive가 On상태인 경우는 전체 request수를 계산하는 대신, connection이 맺어져서 close되기 전에 여러 request가 이어져도, 한번의 connection에 대해서는 1로만 계산한다.
그러므로 KeepAlive 설정시는 child process당 누적되는 connection의 수를 제한한다고 볼 수 있다.
0을 설정하면 무한대 값으로 이 directive에 의해 child process가 termionate 되지는 않는다. 단 0이라고 해서 child process가 절대 terminate안되고 ohs 가 up된 상태에서는 한번 구동되면 계속 살아있는것을 의미하는것은 아니다.
0라 하더라도 이 directive외에 MinSpareServers/MaxSpareServers등에 의해 유동적으로 process는 terminate되고 다시 start되게 되며 단 이 directive에 의한 terminate만이 없음을 의미한다.
최근의 OS는 대부분 process의 lifetime이 어느 정도 길어도 문제될 정도의 memory leak이 발생하거나 하지 않고 견고하므로, 이 값은 주로 default이 0이 권장된다.
(9) ThreadsPerChild
default: ThreadsPerChild 50
이 directive는 Windows 시스템에서만 사용된다. Windows에서는 하나의 child process내의 여러 thread가 각각의 request들을 처리하게 되므로, 결국 이 directive에 의해 동시에 처리 가능한 client request수가 제어된다고 볼 수
있으므로 Unix의 MaxClients directive역할이라고 볼 수 있다.
KeepAlive가 On인 상태에서는 각 thread가 처리하는 client에 dedicate되어 다음 request를 기다리며 connection을 유지하게 되므로, 그러한 경에는 동시에 처리 가능한 connection의 수가 되는 것이다.
많은 문서에서 이 directive를 MaxRequestsPerChild값 대신 Windows에서 사용하는 것으로 나와있다. 하지만 MaxRequestsPerChild가 한 child process가 누적되어 처리하는 request/connection의 수인데 반해, 이 directive는 동시에 몇개의 최대 몇개의 thread가 유지될 것인지를 나타내기 때문에 서로 1:1로 비교될 수 있는 directive는 확실히 아닌것이다.
BindAddress *
# 가상 호스트를 지워한다. 기본적으로 주석 처리 되어 있지만 실제로는 가상 호스트에 영향을 주지 않았다.
Port 80
# 아파치가 사용할 기본 포트를 지정한다.
User nobody
Group nobody
# 자식 프로세스가 생성될 때 그 프로세스의 소유자와 소유그룹을 결정한다.
# 보안상 절대 root 로 설정하는 일은 없도록 한다.
ServerAdmin admin@rootman.co.kr
# 아파치 서버 관리자 e-mail을 설정하는 부분이다.
ServerName rootman.co.kr
# 아파치 서버가 작동중인 서버 이름을 설정한다. 기본적으로 주석 처리 되어 있다.
# 도메인이 아닌 IP 주소로 사용자의 홈페이지에 접속할 때 URL 끝에 /를 붙여야 접속이 되는 경우가 있는데 이럴 경우
# ServerName 지시자에 주석을 제거 하고 아이피 주소를 설정해 주면 된다.
DocumentRoot "/usr/local/apache/htdocs"
#아파치의 웹 문서들의 루트 디렉토리를 지정한다.
# 아래 부터 디렉토리 제어이다. Directory 구문에 대한 자세한 설명은 아래에 있다.
# 시스템 루트( / ) 디렉토리에 대한 제어
Options FollowSymLinks
AllowOverride None
# /usr/local/apache/htdocs 디렉토리에 대한 제어
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
Allow from all
# 사용자 홈 디렉토리인 public_html 디렉토리에 대한 제어
AllowOverride FileInfo AuthConfig Limit
Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
Order allow,deny
Allow from all
Order deny,allow
Deny from all
################################################################
디렉토리 제어와 관련된 설정과 옵션 설명
################################################################
디렉토리를 제어할때에는
# -->> Options(옵션) 설명 ;
옵션 구문은 Options 라는 키워드로 시작된다.
None : 어떤 옵션도 이용할수 없음을 나타낸다 모든 접근 불가(모든 설정을 부정한다.)
All : MultiViews를 제외한 옵션을 의미한다.
Indexes : httpd.conf 설정에서 DirectoryIndex에 설정되어있는 파일이 해당 URL에 없을 경우에 디렉토리의 파일 목록을 보여준다 보안상 사용하지 않는 것이 좋다.
Includes : 서버측에 추가적인 정보를 제공할수 있도록 한다. shtml,SSL 파일 사용시 적용
FollowSymLinks : 디렉토리의 심볼릭 링크를 사용할수 있도록 한다
ExecCGI : CGI 실행을 허용한다.
MultiViews : 클라이언트의 요청에 따라 적절하게 페이지를 보여준다. 쉽게 생각하면 HTTP 헤드 정보가 Accept-Language:ko 라면 Korea 언어에 맞게 데이터를 클라이언트에 전송한다.
Order : 서버가 access 컨트롤을 수행하는 순서를 지정한다.
Order allow,deny (allow 기능을 먼저 수행하고 deny 기능을수행한다)
Allow from : 나열되는 주소들에 대한 access 컨드롤을 허용한다
사용가능한 설정은 도메인명 호스트명 이모든 것을 허용하는 "all" 이있다.
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]
requre : 사용자그룹에대한접근을통제한다
require user [group vaild-user]
user - 지정된 사용자들에게만 접근 허용. AuthUserFile에서 지정
group - 지정된 그룹에게만 접근을 허용. AuthGroupFile에서 지정
valid-user - AuthUserFile에 있는 모든 사용자 들에게 접근을 허용
SymLinksIfOwnerMatch : 링크를 허용하지만 링크 하고자 하는 사용자의 소유로 되어 있는 것만 링크 가능하다.
IncludesNOEXEC : SSI를 허용하지만 "#exec" 와 "include"로 정의한 CGI 실행은 거부한다.
# -->> AllowOverride 설명
AllowOverride는 클라이언트의 디렉토리 접근 제어에 관한 설정이다.
AllowOverride 는 AccessFileName 지시자와 밀접한 관계를 가지고 있다.
아래의 각 설정값들은 AccessFileName 지시자에서 설정한 파일에 적용된다.
None : AllowOverride를 off 한다는 것이다.
All : AccessFileName 지시자로 설정한 파일에 대해 민감하게 반응한다. 모든 지시자를 사용할 수 있다.
AuthConfig : AccessFileName 지시자에 명시한 파일에 대해서 사용자 인증 지시자 사용을 허락한다.
--> AuthDBMGroupFile, AuthDBMUserFile, AuthGroupFile, AuthName, AuthType, AuthUserFile, require등을 사용할 수 있다.
FileInfo : AccessFileName 지시자로 설정한 파일에 대해서 문서 유형을 제어하는 지시자 사용을 허락한다.
--> AddEncoding, AddLanguage, AddType, DefaultType, ErrorDocument, LanguagePriority등을 사용할 수 있다.
Indexes : AccessFileName 지시자로 설정한 파일에 대해서 디렉토리 Indexing을 제어하는 지시자 사용을 허락한다.
--> AddDescription, AddIcon, AddIconByEncoding, AddIconByType, DefaultIcon, DirectoryIndex, FancyIndexing, HeaderName, IndexIgnore, IndexOpions, ReadmeName등을 사용할 수 있다.
Limit : AccessFileName 지시자로 설정한 파일에 대해서 호스트 접근을 제어하는 지시자 사용을 허락한다.
--> Allow, Deny, order 등을 사용할 수 있다.
Options : AccessFileName 지시자에 명시한 파일에 대해서 Options 그리고 XBiHack 등과 같은 지시자 사용을 허락한다.
--> Options, XBitHack등을 사용할 수 있다.
AloowOverride와 AccessFileName에 설정한 파일을 이용해서 아파치 인증 기능을 사용할 수 있다.
아파치 인증에 관한 자세한 설명은 "아파치 인증" 강좌를 참고하길 바란다.
################################################################
DirectoryIndex index.html index.htm index.php index.php3
# 클라이언트가 웹서버에 대한 요청이 있을때 해당 도메인이 디렉토리 안에서 가장 먼저 읽을 파일을 지정한다
# 파일 이름을 명시하지 않고 디렉토리에 접근할 경우 자동으로 보여줄 파일 이름을 설정한다.
# 여러개의 파일 이름을 설정할 수 있다. 파일 이름에 대한 구분은 Space 키, 즉 빈 공간으로 구분한다.
AccessFileName .htaccess
# 특정 디렉토리의 접근 제어를 할 파일 이름을 정의한다.
# 단, 해당 디렉토리의 AllowOverride 에서 None으로 설정되어 있지 않아야 된다.
# 자세한 설명은 "아파치 인증" 강좌 참고
CacheNegotiatedDocs
# 프록시 서버에 문서를 캐시하도록 설정한다. 기본적으로 주석 처리 되어 있다.
HostnameLookup Off
# 아파치의 로그 파일에는 기본적으로 클라이언트의 IP 주소 정보가 기록되는데 이 설정을 On 하면 호스트 네임(도메인)
# 이 기록된다. 하지만 DNS 질의를 해야 되므로 속도가 느리다는 단점이 있다.
# 그냥 Off로 사용하는것을 추천한다.
ErrorLog /usr/local/apache/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
# 사용자 접속을 기록할 로그 포멧을 정의한 부분이다. 위와 같이 4가지 형식의 로그 포멧이 기본적으로 설정되어 있다.
common : 가장 일반적인 로그 기록
referer : 현재 아파치 서버에 접속하기 전에 머물렀던 URL으 기록한다.
agent : 접속자의 웹 브라우저(OS 포함) 종류를 기록한다.
combined : 위의 3가지 로그 포멧을 모두 조합한 것이다.
접속자에 대한 많은 정보를 기록하길 원한다면 combined으로 설정하면 된다.
# %h %I 등과 같은 아파치 로그 포멧을 알고 싶으면 아파치 메뉴얼를 참고 하기 바란다.
CustomLog /usr/local/apache/logs/access_log common
# 로그 파일의 경로와 파일 이름, 그리고 로그의 포맷을 설정한다.
# common 이외에 위에서 정의한 로그 포멧을 지정할 수 있다.
ServerSignature On
# apache 서버가 생성하는 Error 페이지와 Ftp 디렉토리 목록, mod_status, mod_info 등에 apache 서버 버젼과 가상 호스트 네임을 추가적으로 표시해 준다.(On 설정시) Email 설정시 ServerAdmin의 E-mail 주소를 페이지에 링크해 준다.
# On, Off, Email을 설정해서 사용할 수 있다.
Alias /icons/ "/usr/local/apache/icons/"
# 특정 디렉토리를 alias 한다. 위의 경우는 /usr/local/apache/icons/ 디렉토리를 icons 라는 이름으로 alias 한것이다
# icons 디렉토리 앞의 /(슬래쉬)는 DocumentRoot를 의미한다.
ScriptAlias /cgi-bin/ "/usr/local/apache/cgi-bin/"
# Alias와 같은 형식이고 실행할 스크립트 디렉토리를 alias할 때 사용한다.
Redirect old-URL new-URL
# old-URL을 new-URL로 코딩해준다. 하지만 HTML태그로 위의 기능을 대신할 수 있기때문에 사용할 일이 거의 없을것이다.
IndexOptions Fancy Indexing
# 디렉토리에 DirectoryIndex에 설정된 파일명이 없을경우 아파치서버는 디렉토리목록을 보여주는데 Fancy Indexing을 설정
# 할 경우 파일의 크기, 생성날짜 등을 같이 출력해준다.
DefaultIcon /icons/unknown.gif
# 아이콘이 설정되어 있지 않은 파일 확장자들의 아이콘을 대신한다
AddDescription "GZIP compressed document" .gz
AddDescription "tar archive" .tar
AddDescription "GZIP compressed tar archive" .tgz
# 아파치가 디렉토리 목록을 보여줄 경우 파일 확장자에 대해 간략한 설명을 할 수 있게 한다. 단, IndexOptions에서
# FancyIndexing이 적용되어 있어야 된다.
ReadmeName README
HeaderName HEADER
# 아파치가 디렉토리가 목록을 보여줄 경우 페이지 위(HEADER)와 아래(README)에 추가로 출력할 텍스트들을 설정할 수 있다.
# 각 디렉토리에 README, HEADER 라는 이름으로 텍스트 파일을 만들면 된다.
ErrorDocument 500 "The server made a boo bo"
ErrorDocument 404 /missing.html
ErrorDocument 402 http://some.other_server.com/subscription_info.html
# 클라이언트의 요구에 의해 발생하는 아파치 서버의 에러페이지에 출력할 텍스트나 문서를 정의할 수 있다.
# 각 페이지는 에러 코드별로 설정할 수 있으며 외부의 URL을 지정할 수도 있다.
# 문자열을 설정을 경우네는 " "안에 문자열을 설정하면 되고 내부 html 문서를 지정해줄 경우에는 문서의 경로를 지정해
# 주면 된다. 단, (/)최상위 경로는 DocumentRoot를 의미한다.
SetHandler server-status
Order deny,allow
Deny from all
Allow from .your_domain.com
SetHandler server-info
Order deny,allow
Deny from all
Allow from .your_domain.com
# 위의 설정을 함으로써 웹 브라우저에서 아파치 서버의 상태와 정보를 볼수 있다. 보안상 특정 호스트에서만 볼 수 있게
# 설정할 수 있으며 기본적으로 주석 처리되어 있다.
Deny from all
ErrorDocument 403 http://phf.apache.org/phf_abuse_log.cgi
# 아파치 1.1 이전 버젼의 버그를 악용하는 경우가 있는데 이 설정에 해 두면 이러한 공격을 phf.apache.org의 로깅 스키립트로 리다이렉트 시켜준다. 요즘은 필요없는 설정이고 위의 URL에 cgi스크립트가 존재하지도 않는다.
DefaultType text/plain
# 아파치가 처리할 기본 문서들을 정의한다. 위의 설정은 html과 text 파일을 포함시킨 것이다.
# 위의 설정 때문에 text 파일도 웹 브라우저에 표시해 줄수 있는 것이다.
#프록시 서버 과련 설정은 제외 시켰습니다. 차후에 프록시 서버 강좌에서 다룰 예정입니다.


0