본문으로 바로가기

설치버전에 따라 설치방법에 따라 혹은 배포판에 따라 설정파일들의 위치나 내용이 조금씩 틀릴 수 있다는 것을 감안해야 합니다. 이 문서는 CentOS 6.4 Minimal에서 yum을 이용한 패키지설치(Apache 2.2.15)를 기준으로 작성되었습니다.

httpd.conf 분석

아파치 설정 파일을 열어 살펴봅시다.

vi /etc/httpd/conf/httpd.conf

ServerTokens Prod

이 지시자는 Apache의 HTTP로서 응답할 헤드(Header)를 설정하는 것이다. 이 값에 의해 운영체제의 OS타입이나 컴파일된 모듈들의 정보들이 노출될 수 있기에 보안상 최소한의 정보만을 제공하도록 prod로 설정하는 것이 좋다.

아래는 설정했을때의 값을 나타내는 예제이다.

ServerTokens Prod[uctOnly]
Server sends (e.g.): Server: Apache

ServerTokens Major
Server sends (e.g.): Server: Apache/2

ServerTokens Minor
Server sends (e.g.): Server: Apache/2.0

ServerTokens Min[imal]
Server sends (e.g.): Server: Apache/2.0.41

ServerTokens OS
Server sends (e.g.): Server: Apache/2.0.41 (Unix)

ServerTokens Full (or not specified)
Server sends (e.g.): Server: Apache/2.0.41 (Unix) PHP/4.2.2 MyMod/1.2

ServerRoot "/etc/httpd"

이 지시자는 Apache의 홈디렉토리를 지정하며 절대경로로 지정한다. 이후에 나오는 대부분의 경로(PATH)들은 이 경로를 루트로 한 상대경로로 지정이 된다.

PidFile run/httpd.pid

서버가 시동할때 자신의 프로세스 고유 번호를 기록할 파일위치이다.

Timeout 300

클라이언트의 요청에 의해 서버와 연결이 되었을 때 클라이언트와 서버간에 아무런 메세지가 발생하지 않았을 때 타임아웃시키고 연결을 끊을 시간을 초단위로 설정한다. 다시말해, 홈페이지에 접속한 사용자가 특정페이지를 로딩한 후에 다음 연결작업(웹페이지 링크 클릭등)을 하지 않고 여기서 지정한 시간동안 머물게 되면 그 사용자와 Apache 프로세스와의 연결이 끊어지게 된다. 한참후에 다시 사용자가 페이지로딩을 하였을 때에는 다른 Apache 프로세스가 요청을 처리하고 서비스하게 된다. 이 값은 보통 300초로 지정한다. 네트웍의 속도가 낮을수록 수치값은 높게 설정하는 것이 좋다.

KeepAlive On

Apache의 특정 한 프로세스가 특정 사용자의 지속적인 요청작업들을 계속해서 처리하도록 허용할 것인가 아닌가에 대한 여부를 설정한다. 즉, 한 방문자가 홈페이지에 접속하여 다른 여러페이지들을 계속해서 보게될때 그 방문자의 지속적인 다른 요청들을 한 프로세스가 계속해서 처리하도록 할 것인가를 결정하는 지시자이다.

MaxKeepAliveRequests 100

KeepAlive의 값이 On일 경우에 유효한 값으로, 하나의 프로세스가 특정방문자의 요청을 계속해서 처리할때 지정한 횟수만큼만 처리한다. 프로세스가 이 횟수를 넘어서면 그 프로세스는 죽고 다시 다른 프로세스가 그 방문자의 요청을 처리한다.

하나의 프로세스가 지속적으로 요청을 처리하다보면 메모리의 효율이 저하되고 이런 일이 계속 발생하면 전체적인 시스템 성능이 저하된다. 이 값이 0일경우 무한대로 요청을 처리하며 성능을 높이기 위해 높은 값을 추천한다.

KeepAliveTimeout 2

KeepAlive의 값이 On일 경우에 유효한 값으로, 설정한 시간(초)동안 요청이 없다면 그 연결을 끊기 위해 타임아웃 시킨다. 효율적인 프로세스관리와 자원낭비를 줄이기 위한 설정이다. 이 값이 낮다면 동시접속 수를 좀더 올리는데 공헌할 수 있다.

<IfModule prefork.c>

컴파일이 prefork 방식으로 되었을 경우의 설정, prefork 방식은 프로세스:쓰레드 = 1:1 방식

StartServers       8

Apache가 처음 시동될 때 자식프로세스를 몇 개로 시작할 것인가를 지정한다. 그러나 시스템의 부하율에 따라 MinSpareServers와 MaxSpareServers의 설정에 의해 합리적인 개수만큼 동적으로 생성되었다가 죽기도 한다.

MinSpareServers    5
MaxSpareServers   20

Apache의 성능향상과 빠른 응답속도를 위해 서비스대기 중인 프로세스를 만들게 되는데 이 대기 프로세스의 개수를 지정하는 지시어다. MinSpareServers에 지정한 값보다 적으면 대기 프로세스를 더 많이 만들게 되고, MaxSpareServers 보다 더 많으면 대기 프로세스를 줄인다. 절대적인 수치가 아니라 설정된 수치에 맞게 Apache가 노력하게 된다.

ServerLimit      256
MaxClients      256

ServerLimit 지시어는 MaxClients가 생성할수 있는 최대 프로세스 값이다. 이 값은 Apache 2.2 버전대에 들어서면서 기본값은 256이나 최대 허용값은 20000으로 설정되어 있다. MaxClients는 최대 동접자수로 Apache 자식 프로세스의 최대값이 된다.

MaxRequestsPerChild  4000

Apache의 자식프로세스들이 생성할 수 있는 클라이언트들의 요청 개수를 제한하는 지시어다. 이 값만큼의 클라이언트 요청을 받았다면 이 자식프로세스는 자동으로 죽게된다. 이 값이 0으로 설정이 된다면 자식프로세스가 죽는일이 없다. 이 값을 적절히 설정함으로서 부하조절과 자원낭비를 어느정도 예방 할 수 있다.

</IfModule>

<IfModule worker.c>

worker 방식으로 작동시의 설정, worker 방식은 프로세스:쓰레드 = 1:n 방식

StartServers         4

시작시에 초기화되는 서버 프로세스 갯수

MaxClients         300

동시 연결가능한 클라이언트의 최대 개수

MinSpareThreads     25

대기하고 있는 최소 스레드 갯수

MaxSpareThreads     75

대기하고 있는 최대 스레드 갯수

ThreadsPerChild     25

각각의 자식프로세스가 지속적으로 가질수 있는 스레드의 갯수

MaxRequestsPerChild  0

자식 프로세스가 서비스할 수 있는 최대 요청 갯수

</IfModule>

Listen 80

시스템의 기본값 이외에 다른 IP 주소와 포트에 대해서도 연결할 수 있도록 해준다. 주로 가상호스트(Virtual Host)부분에서 기본 80번 이외에 다른 포트를 이용하여 가상호스트를 설정하고자 할 때에 필요하다.

# Dynamic Shared Object (DSO) Support

DSO 방식으로 컴파일된 Apache의 모듈을 적재. 모듈의 위치는 /etc/httpd/modules이며 이는 usr/lib64/httpd/modules의 심볼릭 링크이다.

LoadModule auth_basic_module modules/mod_auth_basic.so
LoadModule auth_digest_module modules/mod_auth_digest.so
LoadModule authn_file_module modules/mod_authn_file.so
LoadModule authn_alias_module modules/mod_authn_alias.so
LoadModule authn_anon_module modules/mod_authn_anon.so
LoadModule authn_dbm_module modules/mod_authn_dbm.so
LoadModule authn_default_module modules/mod_authn_default.so
LoadModule authz_host_module modules/mod_authz_host.so
LoadModule authz_user_module modules/mod_authz_user.so
LoadModule authz_owner_module modules/mod_authz_owner.so
LoadModule authz_groupfile_module modules/mod_authz_groupfile.so
LoadModule authz_dbm_module modules/mod_authz_dbm.so
LoadModule authz_default_module modules/mod_authz_default.so
LoadModule ldap_module modules/mod_ldap.so
LoadModule authnz_ldap_module modules/mod_authnz_ldap.so
LoadModule include_module modules/mod_include.so
LoadModule log_config_module modules/mod_log_config.so
LoadModule logio_module modules/mod_logio.so
LoadModule env_module modules/mod_env.so
LoadModule ext_filter_module modules/mod_ext_filter.so
LoadModule mime_magic_module modules/mod_mime_magic.so
LoadModule expires_module modules/mod_expires.so
LoadModule deflate_module modules/mod_deflate.so
LoadModule headers_module modules/mod_headers.so
LoadModule usertrack_module modules/mod_usertrack.so
LoadModule setenvif_module modules/mod_setenvif.so
LoadModule mime_module modules/mod_mime.so
LoadModule dav_module modules/mod_dav.so
LoadModule status_module modules/mod_status.so
LoadModule autoindex_module modules/mod_autoindex.so
LoadModule info_module modules/mod_info.so
LoadModule dav_fs_module modules/mod_dav_fs.so
LoadModule vhost_alias_module modules/mod_vhost_alias.so
LoadModule negotiation_module modules/mod_negotiation.so
LoadModule dir_module modules/mod_dir.so
LoadModule actions_module modules/mod_actions.so
LoadModule speling_module modules/mod_speling.so
LoadModule userdir_module modules/mod_userdir.so
LoadModule alias_module modules/mod_alias.so
LoadModule substitute_module modules/mod_substitute.so
LoadModule rewrite_module modules/mod_rewrite.so
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule cache_module modules/mod_cache.so
LoadModule suexec_module modules/mod_suexec.so
LoadModule disk_cache_module modules/mod_disk_cache.so
LoadModule cgi_module modules/mod_cgi.so
LoadModule version_module modules/mod_version.so
#
# The following modules are not loaded by default:
#
#LoadModule asis_module modules/mod_asis.so
#LoadModule authn_dbd_module modules/mod_authn_dbd.so
#LoadModule cern_meta_module modules/mod_cern_meta.so
#LoadModule cgid_module modules/mod_cgid.so
#LoadModule dbd_module modules/mod_dbd.so
#LoadModule dumpio_module modules/mod_dumpio.so
#LoadModule filter_module modules/mod_filter.so
#LoadModule ident_module modules/mod_ident.so
#LoadModule log_forensic_module modules/mod_log_forensic.so
#LoadModule unique_id_module modules/mod_unique_id.so
#

Include conf.d/*.conf

"/etc/httpd/conf.d" 설정 디렉토리에서 설정파일들을 불러온다. phpmyadmin.conf, php.conf, ssl.conf 등과 같은 파일들이 존재한다.

ExtendedStatus On

server-stauts로 Apache의 상태를 모니터링 할때 자세한 상태정보기능을 제공할 것인지(On) 아닌지(Off)를 설정하는 지시어이다. 기본 값은 Off이고 아래쪽 설정중에 server-status에 영향을 준다.

User nobody
Group nobody

User와 Group 이라는 설정 지시자는 홈페이지 서비스를 직접 담당하는 Apache 자식 프로세스들의 실행소유자와 소유그룹을 각각 어떤 계정으로 부여 할 것인지를 결정하는 것이다. 보안을 위해 nobody로 설정한다.

ServerAdmin root@domain.com

웹문서 로딩시 에러가 발생했을 경우와 같이 에러페이지에 보여질 관리자 메일 주소이다.

ServerName test.uzuro.com

클라이언트에게 보여주는 호스트이름을 지정한다. www를 쓰지 않는 호스트에서 www를 쓰는 것처럼 보이게 설정할 수 있다. bbs.uzuro.com을 www.uzuro.com로 지정하는 것과 같다. 만약 현재 사용하는 도메인이 없다면 여기에 IP 주소라도 꼭 적어 주어야 한다.

가끔 http://www.uzuro.com/wordpress/ 와 같이 하면 홈페이지가 로딩이 되는데 http://www.uzuro.com/wordpress 와 같이 하면 홈페이지를 찾을수 없는 경우가 있는데 이는 ServerName 지시자에 DNS에 찾을수 없는 도메인이 설정되어 있기 때문이다.

UseCanonicalName Off

이 설정이 On일 경우, 아파치가 자기 참조 URL(반응이 오고 있는 서버를 다시 가리키는 URL)을 만들 필요가 있을 때마다 "공식적인" 이름을 만들기 위해 ServerName과 Port를 사용한다. 이 값이 Off일 경우에는 아파치는 클라이언트가 제공한 호스트네임과 포트를 사용할 것이다. 간혹 웹주소의 맨끝에 '/'를 붙이지 않아 페이지를 찾지 못할 경우 이값을 Off. 이 설정은 CGI나 PHP 스크립트의 SERVER_NAME, SERVER_PORT에도 영향을 미친다. http://truefeel.tistory.com/tag/UseCanonicalName

DocumentRoot "/var/www/html"

서버의 웹문서가 있는 경로를 지정한다. 경로의 마지막에 '/'를 추가해선 안되고 심볼릭 링크나 Alias를 사용하여 다른 위치를 가리키도록 할 수 있다. https://httpd.apache.org/docs/2.2/ko/urlmapping.html

<Directory />

    Options FollowSymLinks
    AllowOverride None

</Directory>

<Directory> ~ </Directory> 지시자는 지정한 디렉토리이하의 모든 웹문서들에 대하여 어떤 서비스와 기능을 허용/거부 할 것인지를 설정하는 매우 중요한 지시자이다. 현재 루트(/) 디렉토리에 대해 심볼릭링크를 허용하고 .htaccess 파일의 사용을 거부한다. <Directory>지시자의 설정은 개인에 따라 다르니 각자 목적에 맞게 설정해야 한다.

Options 지시자는 지정한 디렉토리이하에 모든 파일과 디렉토리들에 적용할 접근제어를 설정한다. 디렉토리목록을 보여줄지, CGI를 허용할 것인지 등등의 것들의 설정을 여기서 하게 된다.

가상호스트를 사용하는 경우나 하위디렉토리에서 위와 같은 루트(상위 디렉토리)에 대한 설정이 어떻게 적용되어 있던간에 가상호스트 안이나 하위디렉토리에 다시 Options 값을 지정할 수 있다. 이때 상위디렉토리의 다른 옵션은 변경하지 않고 특정 옵션만 제거하거나 추가할때 + 나 - 를 Options 값 앞에 붙여 사용하기도 한다.

Options -FollowSymLinks는 상위 디렉토리 설정에서 허가된 FollowSymLinks를 제거하게 되며, Options +Indexes는 상위 디렉토리 설정에 없는 Indexes 설정을 추가한다.

종류 설명
None 모든 허용을 하지 않는다. 즉 None 설정으로 이외의 다른 설정들은 모두 무시한다
All MultiViews를 제외한 모든 옵션설정을 허용한다. Options 값이 공백일때도 All과 같다.
(Options (없음))
Indexes 웹서버의 디렉토리 접근시에 DirectoryIndex에서 지정한 파일(index.html등)이 존재하지 않을 경우에 디렉토리내의 파일목록리스트를 웹브라우저로 보여준다. 서버보안을 위해 사용하지 않는 것이 좋다
Includes SSI 사용을 허용하는 설정이다. 단 mod_include.c 라는 모듈이 필요하며 기본적으로 로드되어 있다.
IncludesNOEXEC SSI 사용은 허용되지만 #exec 사용과 #include는 허용되지 않는다. 즉 SSI를 사용하면서 시스템에 위험한 SSI의 실행태그는 허용하지 않겠다는 설정이다.
FollowSymlinks 심볼릭 링크를 허용한다. 이 옵션을 지정하면 웹브라우저에서 링크파일의 경로까지도 확인 할 수 있게된다. 보안상 이 값은 설정하지 않는 것이 좋다.
ExecCGI perl등과 같은 CGI 실행을 허용하기 위한 설정이다. 원래 아파치에서 CGI 사용은 ScriptAlias로 지정된 위치에서 사용하는 것이 기본이다. 하지만 ScriptAlias가 지정되지 않은 디렉토리에 이 옵션이 지정되어있다면 지정된 디렉토리내에서는 CGI 사용이 허용된다. 물론 이 경우에도 "AddHandler cgi-script" 지시자에서 정의한 확장자만 유효하다.
MultiViews 웹브라우저의 요청에 따라 적절한 페이지로 보여준다. 웹브라우저의 종류나 웹문서의 종류에 따라서 가장 적합한 페이지를 보여줄 수 있도록하는 설정이다.

AllowOverride 지시자는 어떻게 접근을 허락할 것인가에 대한 설정이다. 특정 디렉토리에 대한 방문자들의 접근방식을 어떤방식으로 인증하여 허용할 것인가의 문제라고 할 수 있다. AllowOverride에서 설정하는 값들은 중복해서 설정될 수 있으며 그때마다 가장 최근에 설정된 값잉 항상 우선적용된다.

종류 설명
None 이 값이 설정되면 AccessFileName에 지정된 파일을 액세스 인증파일로 인식하지 않는다.즉 AccessFileName의 값이 대부분 .htaccess 이므로 이를 무시하게 된다. 아주 제한적인 접근만을 허용할때 사용하는 값이다.
All 이전의 인증방식에 대하여 새로운 접근인증방식을 우선적용하도록 Override를 허용한다.
AuthConfig AccessFileName 지시자에 명시한 파일에 대하여 AuthDBMGroupFile, AuthDBMUserFile, AuthGroupFile, AuthName, AuthType, AuthUserFile, require 등과 같은 클라이언트 인증지시자의 사용을 허용한다. 즉 htpasswd 유틸리티를 이용하여 특정디렉토리의 접근은 AccessFileName에 명시한 파일(.htaccess)로 제어하고자 할 때에 해당 디렉토리내에 이 값을 주로 사용한다.(디렉토리 인증설정)
FileInfo AccessFileName 지시자에 명시한 파일에 대하여 AddEncoding, AddLanguage, AddType, DefaultType, ErrorDocument, LanguagePriority 등과 같은 문서유형을 제어하는 지시자 사용을 허용한다.
Indexes AccessFileName 지시자에 명시한 파일에 대하여 AddDescription, AddIcon, AddIconByEncoding, AddIconByType, DefaultIcon, DirectoryIndex, FancyIndexing, HeaderName, IndexIgnore, IndexOptions, ReadmeName 등과 같은 디렉토리 Indexing을 제어하는 지시자 사용을 허용한다.
Options AccessFileName 지시자에 명시한 파일에 대하여 Options 그리고 XBitHack등과 같은 특정 디렉토리옵션을 제어하는 지시자 사용을 허용한다.
Limit AccessFileName 지시자에 명시한 파일에 대하여 allow, deny, 그리고 order 등과 같은 호스트 접근을 제어하는 지시자 사요을 허용한다.

<Directory "/var/www/html">

     #Options Indexes FollowSymLinks
     Options None
     AllowOverride None
     Order allow,deny
     Allow from all

</Directory>

기본적인 DocumentRoot의 위치(홈페이지)에 대한 <Directory> 설정이다. Indexes 옵션으로 인해 적합하지 않은 웹문서 주소나 디렉토리를 가리킬 경우 하위 파일들이 목록화되어 나타난다. 보안상으로는 좋지 않은 결과를 초래한다. 그래서 None으로 설정했다.

Order 와 Allow 그리고 Deny 항목 설정이다. order 항목은 접근을 통제하는 순서를 나타낸다. allow와 deny 순으로 지정하면 allow 기능을 먼저 수행하고, deny기능을 나중에 수행하라는 의미다.

  • deny, allow – deny 지시자 부터 검사하고 allow 지시자를 검사
  • allow, deny – allow 지시자 부터 검사하고 deny 지시자를 검사
  • mutual-failure – allow목록에 없는 모든 host에게 접속을 거부

allow from 항목 다음에 쓸수 있는 항목은 아래와 같다.

  • 사용 가능한 주소는 도메인 네임
  • 호스트 이름 주소
  • 호스트 ip 주소
  • ip 주소의 앞부분 3바이트
  • 모든 주소일 경우 all을 사용한다

deny from 항목은 allow from과 반대다.

<IfModule mod_userdir.c>

     #UserDir public_html
     #UserDir enable
     #UserDir disable root
     UserDir disabled

</IfModule>

사용자들의 계정에 각각의 홈페이지를 서비스할때 필요한 개별 가입자들의 홈페이지 디렉토리이름이다. 현재는 disabled 되어 있지만 사용하게 될 경우 public_html이나 www를 설정값으로 많이 사용한다.

접근은 http://도메인/~유저명 과 같은 방식이 되며 UserDir disable root 처럼 지정하면 root 사용자는 이 기능을 사용하지 않겠다는 것이다. 스페이스로 공백을 주고 추가로 사용하지 않을 사용자를 계속 입력할 수 있다. http://httpd.apache.org/docs/2.2/ko/howto/public_html.html

#<Directory /home/*/public_html>
#    AllowOverride FileInfo AuthConfig Limit
#    Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
#    <Limit GET POST OPTIONS>
#        Order allow,deny
#        Allow from all
#    </Limit>
#    <LimitExcept GET POST OPTIONS>
#        Order deny,allow
#        Deny from all
#    </LimitExcept>
#</Directory>

UserDir 디렉토리에 대한 접근을 제어한다. 위의 예제는 사용자 홈페이지에 대하여 읽기만 가능하도록 한 예제이다.

DirectoryIndex index.html index.htm index.php index.cgi index.html.var

웹사이트의 초기페이지 문서로 어떤 파일을 사용할 것인가를 결정하는 지시자이다. 특정 디렉토리만을 지정했을 경우(http://www.uzuro.com), 적혀진 순서에 따라 읽어들이며 위에 지정한 목록들이 디렉토리에 없다면 Options 지시자에 Indexes 또는 All이 지정되어 있을 경우 디렉토리내의 파일리스트를 보여준다.

Options 지시자에 Indexes 또는 All이 지정되어 있지 않다면 Not Found 라는 에러문서를 로딩한다. index.html.var에 대한 내용은 아래의 링크를 참고한다. http://httpd.apache.org/docs/current/ko/content-negotiation.html

AccessFileName .htaccess

각 디렉토리에 대하여 접근 제어 정보 내용을 담고 있는 파일이름을 설정한다. 통상적으로 .htaccess 라는 이름을 사용한다.

<Files ~ "^\.ht">

    Order allow,deny
    Deny from all
    Satisfy All

</Files>

위의 내용은 브라우저가 .htaccess 파일과 .htpasswd 파일에 접근할 수 없도록 하는 설정으로 .ht로 시작하는 파일에는 주로 웹접근권한등에 대해 설정되어 있기때문에 보안과 연관되어 있다.

TypesConfig /etc/mime.types

mime.types 의 위치를 설정한다. CentOS 6.4 에서 yum으로 설치시 자동설정되는 Apache에는 위와 같이 설정되어 있다. 일반적으로 conf/mime.types 에 위치한다.

DefaultType text/plain

mime.types 파일에 정의되어있지 않은 파일형식에 대한 요청을 받았을때 사용할 기본 MIME 타입을 설정한다. 서버에 주로 텍스트나 HTML 문서가 많다면 "text/plain"을 쓰는 것이 좋다. 대부분이 실행 프로그램이나 이미지등 바이너리인 경우에는 웹 브라우저가 텍스트라고 생각하여 바이너리 파일을 화면에 표시하지 않도록 하기 위해 'application/octet-stream'를 적는다.

<IfModule mod_mime_magic.c>

       # MIMEMagicFile /usr/share/magic.mime
        MIMEMagicFile conf/magic

</IfModule>

mod_mime_magic 모듈을 사용하면 파일의 내용을 가지고 파일의 타입에 힌트를 얻는다. MIMEMagicFile 지시자를 사용하여 모듈에게 힌트 정보가 저장되어 있는 파일을 설정한다.

HostnameLookups Off

웹서버의 로그(access_log)에 보면 방문자들에 대한 웹문서 접근기록을 남겨두고 있다. 이 로그파일에 위의 설정값이 Off일 경우에는 IP주소를 기록하고 On일 경우에는 모든 IP 주소에 대하여 DNS에 질의하여 해당 IP 주소에 대한 도메인 정보가 있을 경우에는 도메인명으로 남기게 되지만 도메인 정보가 없는 IP 주소에 대해서는 그냥 IP 주소로 남겨지게 된다. 이때 DNS 질의로 인한 트래픽이 발생하기에 기본값을 Off로 설정하고 사용하고 있다.

#EnableMMAP off

커널에서 메모리매핑(mmap)을 지원한다면 아파치가 웹문서를 로딩하기 위하여 내부문서를 읽을때에 파일을 메모리 매핑하여 처리한다. 따라서 아파치의 성능이 크게 향상될수 있다. 그러나 메모리대응이 서버의 성능을 떨어트리고 심지어 안정성을 해치는 경우가 있고 smp Solaris 서버에서 아파치 2.0은 종종 mmap을 사용하지 않을때가 더 빠르다. 또한 NFS 마운트한 파일시스템에 있는 파일을 메모리 대응하는 도중에 다른 NFS 클라이언트에 있는 프로세스가 파일을 지우거나 파일크기를 줄이면, 웹서버 프로세스가 다음 번에 메모리대응한 파일내용을 읽을때 bus error가 발생할 수 있다.

위의 조건에 해당하면 전송하는 파일을 메모리대응하지 않도록 EnableMMAP off를 사용해야 한다. 기본 설정값은 on이다.

#EnableSendfile off

아파치는 운영체제가 sendfile을 지원하면 커널 sendfile을 사용하여 정적 파일을 서비스하는 경우 전송할 파일을 직접 읽지않을 수 있다. sendfile을 사용하면 read와 send를 따로 할 필요가 없어서 매우 빨라진다. 그러나 sendfile을 사용하면 웹서버의 안정성을 해치게되는 경우가 있고, 커널은 자신의 캐쉬를 사용하여 NFS로 마운트한 파일을 안정적으로 서비스할 수 없는 경우가 있으므로 EnableSendfile off를 사용해서 파일을 sendfile 전송하지 않도록 할수 있다. 기본 설정값은 on이다.

ErrorLog logs/error_log

아파치 웹서버의 에러로그파일(error_log)의 위치를 지정하는 것으로 가상호스트설정에서 별도의 에러로그파일의 위치를 지정하지 않았다면 이곳에 모두 저장된다.

LogLevel warn

에러로그파일(error_log)의 기록내요을 얼마나 자세하게 기록할 것인가를 결정하는 지시자이다.

  • none : 발생하는 모든 상황에 대한 메시지
  • emerg : 최상위, 매우 위험한 상황의 메시지. 전체공지가 요구되는 메시지
  • alert : 즉각적으로 조치를 취해야하는 상황의 메시지, 즉시 행동이 취해져야하는 상황
  • crit : 급한 상황은 아니지만 치명적인 시스템문제 발생 상황의 메시지
  • warn : 주의를 요하는 메시지 즉 경고상황
  • notice : 에러가 아닌 알림에 관한 메시지, 즉 경고상황
  • info : 단순한 프로그램에 대한 정보 및 통계관련 메시지, 보통수준으로 알려주는 상황
  • debug : 최하위, 디버깅관련 메시지
  • * : 발생하는 모든 상황에 대한 메시지

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

#LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio

웹로그파일(access_log)에 방문자들에 대한 기록을 어떤 포맷으로 할 것인가에 대한 포맷종류를 설정하는 지시자들이다. 바로 애래에서 설명하고 있는 CustomLog에서 사용할 몇가지 로그포맷의 이름들(combined, common, referer, agent, combinedio)을 지정한 곳이다. "combinedio"는 모듈 mod_logio_module이 로드되어 있어야 하며 %I와 %O 변수를 사용해 보내고 받는 byte를 측정할수 있다.

변수들의 의미

  • %a : 방문자의 원격의 IP 주소 (HostNameLookups 값이 On이면 도메인으로 기록될 수 있음)
  • %A : 아파치 웹서버의 로컬시스템의 IP 주소
  • %b : 헤더를 포함한 전송량(bytes)
  • %B : HTTP 헤더를 포함한 전송량
  • %{var}e : 환경 변수 "var"
  • %f : 요청한 파일이름
  • %h : 요청을 보낸 원격의 호스트
  • %H : 요구 프로토콜
  • %l : 클라이언트에서 보낸 로그인 ID명(즉 원격 로그인 ID)
  • %m : 요청방법
  • %p : 서버의 Canonical 포트 번호(요청이 처리되는 포트)
  • %P : 요청이 처리되는 아파치 자식 프로세스 ID(PID)
  • %q : 질의
  • %r : 첫번째 요청 라인
  • %s : 상태코드
  • %u : 사용자인증에 대한 원격의 유저. 클라이언트가 요청한 URL이 기본 HTTP인증 요구에 대한 사용자명을 의미
  • %U : 요청한 URL 경로
  • %v : 클라이언트 요청에 따른 Canonical 서버네임(서버네임 혹은 가상호스트의 이름)
  • %V : UseCanonicalName 설정에 따른 서버네임
  • %t : 클라이언트의 요청을 아파치 자식프로세스가 처리하기 위해 소요된 시간으로 CLF 포맷(일/월/년:시:분:초 time-zone)
  • %T : 클라이언트에 아파치 자식프로세스에게 처리를 요청하는 시간(초)
  • %{IncomingHeader}I : IncomingHeader의 내용. 즉 서버에게 보내진 요청의 헤더부분
  • %{OutgoingHeader}o : OutgoingHeader의 내용. 즉 응답의 헤더부분.
  • %{MODULE_NOTE}n : 다른 모듈로 부터의 MODULE_NOTE 내용
  • %I : 요청과 헤드를 포함하여 받은 byte수
  • %O : 요청과 헤드를 포함하여 보낸 byte수

#CustomLog logs/access_log common

#CustomLog logs/referer_log referer

#CustomLog logs/agent_log agent

CustomLog logs/access_log combined

하나의 로그파일에 common(접근정보), agent, referer 정보를 모두 저장하기 위해서 combined를 사용하였다.

ServerSignature On

부가적으로 서버가 생성하는 페이지(에러문서, FTP 디렉토리 목록, mod_status, mod_info 출력등 - CGI는 제외)에 서버 버전과 가상호스트 이름을 포함하는 행을 추가하도록 한다. "Email"로 설정하면 ServerAdmin으로의 mailto: 링크를 포함한다. On | Off | EMail 중에 하나로 설정한다.

Alias /icons/ "/var/www/icons/"

<Directory "/var/www/icons">

       Options Indexes MultiViews FollowSymLinks
       AllowOverride None
       Order allow,deny
       Allow from all

</Directory>

Alias는 별칭을 만드는 지시자이고 Alias 별칭명 실제명 과 같은 방식으로 만들게 된다. 별칭명뒤에 /를 포함하면 아파치 서버는 URL에도 /이 있어야 처리할 수 있다. 위에서는 Alias를 이용해 /icons/라는 별칭을 만들었고 그 디렉토리의 내용을 설정하고 있다. 웹브라우저를 통한 도메인 네임의 디렉토리 접근과 서버의 실제 디렉토리를 연결시켜 주는 기능을 한다.

/icons/는 Indexes 지시자가 설정되어 있을때 파일목록을 리스팅하게 되는 경우에 사용될 아이콘들의 모음이다.

<IfModule mod_dav_fs.c>

       # Location of the WebDAV lock database.
       DAVLockDB /var/lib/dav/lockdb

</IfModule>

WebDAV는 Web-based Distributed Authoring and Versioning (웹기반 분산형 저작 및 버전관리)의 약자로 웹을 통하여 웹서버에 파일을 관리(목록 조회, 수정, 삭제, 이동 등)할 수 있는 확장된 HTTP 프로토콜을 말한다. https://httpd.apache.org/docs/2.4/ko/mod/mod_dav.html

ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"

<Directory "/var/www/cgi-bin">

       AllowOverride None
       Options None
       Order allow,deny
       Allow from all

</Directory>

ScriptAlias는 근본적으로 Alias와 같으나 특별히 CGI 스크립트를 특정한 위치에서만 제공하기 위한 설정이다. 일종의 웹서버 보안을 위한 설정에 해당된다. 어떤 위치에서든 CGI를 허용하게 되면 보안에 문제가 있을 수 있으므로 위와 같은 Alias를 설정하여 사용자들이 /var/www/cgi-bin/ 디렉토리내에 존재하는 cgi 파일들만 사용할 수 있도록 할 수 있다.

http://www.uzuro.com/cgi-bin/test.cgi와 같은 방식으로 사용자들이 사용할 수 있게된다. 가상호스트를 사용할 경우에는 개별적으로 가상호스트에 설정해도 된다.

# Redirect permanent /foo http://www.example.com/bar

특정 디렉토리경로로 방문자가 로딩하였을 경우에 지정된 다른 웹사이트경로(URL)로 방향전환을 할 수 있는 지시자이다. 위의 예에서는 방문자가 /foo 라는 디렉토리를 요청하였을 경우에 http://www.example.com/bar 라는 URL로 보여주도록 하는 설정이다. 매우 유용한 설정이며 ErrorDocument 라는 설정 지시자와 상호 연관되어 있는 지시자이다.

IndexOptions FancyIndexing VersionSort NameWidth=* HTMLTable Charset=UTF-8

디렉토리목록을 표시할 때 어떻게 보여줄 것인지 설정하는 지시자로 FancyIndexing 디렉토리의 Fancy 목록을 만든다. VersionSort 파일의 버전별로 정렬하여 출력하며 NameWidth=* 바이트 단위로 파일명 열의 폭을 지정한다. * 는 길이 자동 조절, HTMLTable html 표로 fancy 디렉토리 목록을 만든다. Charset=UTF-8 문자셋을 utf-8 로 출력한다.

AddIconByEncoding (CMP,/icons/compressed.gif) x-compress x-gzip

AddIconByType (TXT,/icons/text.gif) text/*

AddIconByType (IMG,/icons/image2.gif) image/*

AddIconByType (SND,/icons/sound2.gif) audio/*

AddIconByType (VID,/icons/movie.gif) video/*

AddIcon /icons/binary.gif .bin .exe

AddIcon /icons/binhex.gif .hqx

AddIcon /icons/tar.gif .tar

AddIcon /icons/world2.gif .wrl .wrl.gz .vrml .vrm .iv

AddIcon /icons/compressed.gif .Z .z .tgz .gz .zip

AddIcon /icons/a.gif .ps .ai .eps

AddIcon /icons/layout.gif .html .shtml .htm .pdf

AddIcon /icons/text.gif .txt

AddIcon /icons/c.gif .c

AddIcon /icons/p.gif .pl .py

AddIcon /icons/f.gif .for

AddIcon /icons/dvi.gif .dvi

AddIcon /icons/uuencoded.gif .uu

AddIcon /icons/script.gif .conf .sh .shar .csh .ksh .tcl

AddIcon /icons/tex.gif .tex

AddIcon /icons/bomb.gif core

AddIcon /icons/back.gif ..

AddIcon /icons/hand.right.gif README

AddIcon /icons/folder.gif ^^DIRECTORY^^

AddIcon /icons/blank.gif ^^BLANKICON^^

AddIcon으로 시작하는 지시자들은 서버에게 다양한 파일, 파일명 확장자에 대하여 어떤 아이콘을 보여줄 것인지를 설정한다. /icons/binary.gif 의 경우 .bin .exe의 파일확장자를 가지는 파일에 대하여 아이콘을 사용한다는 의미로 해석하면 된다.

AddIconByEncoding 지시자는 파일의 판단을 확장자 대신 MIME 인코딩 값에 의해서 처리한다. AddIconByType 지시자는 파일의 판단을 확장자 대신에 MIME 타입에 의해서 처리한다. AddIcon 지시자는 지정된 파일의 확장자에 대하여 처리한다.

DefaultIcon /icons/unknown.gif

위에서 설정한 AddIcon에 해당하는 파일이름이 없을 경우에 여기서 지정한 기본 아이콘파일(unknown.gif)로 보여주도록하는 설정이다.

#AddDescription "GZIP compressed document" .gz

#AddDescription "tar archive" .tar

#AddDescription "GZIP compressed tar archive" .tgz

AddDescription 지시자는 서버가 생성한 인데스의 파일 뒤에 간단한 설명을 표시할 때 사용한다. 이 설정은 IndexOptions가 FancIndexing으로 설정되었을때만 표시된다. 설정형식은 AddDescription "표시할 설명" 파일확장자

ReadmeName README.html

HeaderName HEADER.html

ReadmeName은 디렉토리 목록표시 뒤에 붙여서 보여질 README 파일의 이름을 지정한다. HeaderName은 디렉토리 목록표시 앞에 붙여질 파일의 이름을 지정한다.

IndexIgnore .??* *~ *# HEADER* README* RCS CVS *,v *,t

디렉토리목록을 인덱싱할 때 표시할 파일리스트에서 제외할 파일들을 지정한다. 쉘스타일의 와일드카드(*,?)가 허용된다.

위의 AddIconByEncoding 지시자부터 IndexIgnore 지시자까지는 모두 해당 디렉토리의 <Directory> ~ </Directory> 지시자의 Options에 Indexes 지시자가 있어야하고 DirectoryIndex 지시자에 지정된 파일이 모두 없는 상태에서 IndexOptions 지시자의 값이 FancyIndexing으로 설정되었을 때에 적용된다.

# DefaultLanguage nl

AddLanguage ca .ca

AddLanguage cs .cz .cs

AddLanguage da .dk

AddLanguage de .de

AddLanguage el .el

AddLanguage en .en

AddLanguage eo .eo

AddLanguage es .es

AddLanguage et .et

AddLanguage fr .fr

AddLanguage he .he

AddLanguage hr .hr

AddLanguage it .it

AddLanguage ja .ja

AddLanguage ko .ko

AddLanguage ltz .ltz

AddLanguage nl .nl

AddLanguage nn .nn

AddLanguage no .no

AddLanguage pl .po

AddLanguage pt .pt

AddLanguage pt-BR .pt-br

AddLanguage ru .ru

AddLanguage sv .sv

AddLanguage zh-CN .zh-cn

AddLanguage zh-TW .zh-tw

DefaultLanguage 지시자와 AddLanguage 지시자는 웹문서의 언어를 지정하기 위한 지시자이다. 웹브라우저(클라이언트)가 이해할 수 있는 언어를 제공하기 위한 설정으로 이 설정으로 인하여 사용자가 이해할 수 있는 언어로 브라우징하기 위한 컨텐츠 협상을 사용할 수 있다.

#LanguagePriority en ca cs da de el eo es et fr he hr it ja ko ltz nl nn no pl pt pt-BR ru sv zh-CN zh-TW

LanguagePriority en ko ca cs da de el eo es et fr he hr it ja ltz nl nn no pl pt pt-BR ru sv zh-CN zh-TW

LanguagePriority는 언어의 우선순위를 내림차순으로 지정하며 컨텐츠 협상 도중에 어떤 언어를 먼저 사용할 것인가에 대한 순서를 결정한 것이다. 웹문서의 내용에 있어 표시할 언어를 결정할 때는 웹브라우저에 설정된 인코딩 메뉴를 따르게 되어 있다. 그러나 자동설정으로 되어 있을 경우에는 웹서버에서 보내주는 정보로 판단하게 된다.

LanguagePriority 는 언어 우선권을 지정해서 웹 요청에 대한 언어 우선권을 보내준다. 쓰여진 순서대로 언어 우선권이 생기게 되므로 ko를 제일 앞에 오게 하자

ForceLanguagePriority Prefer Fallback

ForceLanguagePriority는 클라이언트가 브라우저로 요청한 언어에 부합하는 페이지가 한 개가 아니면 서버는 "NOT ACCEPTABLE(Fallback)"이나 "MULTIPLE CHOICES (Prefer)"로 응답하게 된다. 이 오류를 피하기 위해 클라이언트가 요청한 언어를 무시하고 위의 LanguagePriority 지시자의 설정내용대로 응답하도록 하게 하는 설정이다.

AddDefaultCharset UTF-8

이 지시자는 외부로 보내지는 모든 웹문서들에 대하여 기본 charset을 지정한 것이다. 최근에는 대부분 UTF-8로 다국적인 표준을 사용한다. ISO-8859-1 이나 EUC-KR 으로 설정할 수도 있다.

#AddType application/x-tar .tgz

AddType은 MIME 설정파일인 mime.types에 정의되어 있지 않은 타입을 추가로 설정하고자 할 때에 사용된다. php를 설정할때 이를 사용하는데 현재 살펴보고 있는 버전의 httpd.conf 파일은 php에 대한 설정관련 부분을 /etc/httpd/conf.d/php.conf에 따로 설정하고 있다.

#AddEncoding x-compress .Z

#AddEncoding x-gzip .gz .tgz

AddEncoding은 특정 브라우저로 하여금 자료를 받으면서 정보에 대한 압축해제를 할 수 있도록 한다. 단 모든 웹브라우저에서 이 기능을 제공하는 것은 아니다.

AddType application/x-compress .Z

AddType application/x-gzip .gz .tgz

압축파일들에 대한 MIME 정의

AddType application/x-x509-ca-cert .crt

AddType application/x-pkcs7-crl .crl

SSL 인증과 관련된 MIME 타입 정의

#AddHandler cgi-script .cgi

AddHandler는 파일확장자(.cgi)를 처리기(Handler 위의 cgi-script)에 매핑(연결)시켜주게 된다. 즉 위의 설정은 *.cgi 형식의 파일들은 cgi-script라는 handler가 처리하라고 아파치웹서버에게 알려주는 것이다. 이 부분에 대한 설정을 제대로 해주지 않게 되면 CGI가 실행되지 않을 수 있다. 위의 CGI 스크립트를 정상적으로 적용하려면 Options 지시자에 ExecCGI 값이 설정되어 있어야한다.

#AddHandler send-as-is asis

자기자신의 HTTP 헤드(header)를 포함하고 있는 파일을 위한 설정이다.

AddHandler type-map var

type-map을 사용(협상 자원)하기 위한 지시자이다. 아파치는 기본적으로 "It Worked" 페이지를 다양한 언어로 배포하도록 활성화 되어있다.

AddType text/html .shtml

AddOutputFilter INCLUDES .shtml

SSI(Server Side Include)문서로 인식할 파일확장자를 지정한 것이다. 즉 SSI 코드가 들어있는 문서의 확장자를 *.shtml으로 사용할 수 있는 설정이다. SSI는 시스템의 날짜와 카운터등 CGI 프로그램을 하지 않아도 HTML 문서에서 단 몇줄로 CGI의 효과를 낼 수 있는 SSI기능을 인식하게끔하는 유용한 도구이다. 즉, 이 설정이 유효하게 설정되었을 경우에 SSI로 된 문서는 아파치 웹서버에서 먼저 해석된 후에 그 결과를 html 문서와 함께 웹브라우저로 보내지게 된다. 이 설정지시자는 Options 지시자에 Includes라는 값이 설정되어 있을 때만 유효하다.

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
</IfModule>

</IfModule>

위의 예는 에러 페이지에대한 설정을 하고 있다. 우선 에러가 발생하였을때 보여줄 웹문서의 위치를 Alias하였다. 기본적으로 제공되는 에레메세지는 국제표준적인 에러메세지의 모음이고 내용협상 기능과 SSI 기능을 사용하고 있다. 이때문에 두개의 모듈을 설정하고 그 안에서 에레문서의 디렉토리에 대한 설정을 하고 있다.

에레메세지는 가상호트별로 따로 설정할 수도 있는데 많이 사용하는 404 에러메세지를 개성에 맞게 꾸밀 수 있다. ErrorDocument 404 http://자신의 도메인/error.html 과 같은 방식을 이용할 수 있다. 에러 페이지 꾸미기

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

BrowserMatch 지시자는 특정 브라우저들에 대한 특정 수행을 지시하기 위한 설정들이다.

  • 첫번째 것은 네스케이프 2.x 또는 그를 흉내내는 브라우저에 대하여 KeepAlive 기능을 쓰지 않도록 한다. 이 브라우저들은 KeepAlive 구현에 문제점을 갖고 있기 때문이다.
  • 두번째 것은 HTTP/1.1을 잘못 구현하였고 301 또는 302 (redirect)반응에 대하여 KeepAlive를 제대로 지원하지 못하는 마이크로소프트 인터넷 익스플로러 4.0b2를 위한 것이다.
  • 세번째 것은 네번째 다섯번째 것들은 기본적인 1.1 반응도 제대로 처리하지 못함으로써 HTTP/1.1 스펙을 위반하고 있는 브라우저에 대하여 HTTP/1.1 반응을 하여 하지 않도록 한다.

BrowserMatch "Microsoft Data Access Internet Publishing Provider" redirect-carefully

BrowserMatch "MS FrontPage" redirect-carefully

BrowserMatch "^WebDrive" redirect-carefully

BrowserMatch "^WebDAVFS/1.[0123]" redirect-carefully

BrowserMatch "^gnome-vfs/1.0" redirect-carefully

BrowserMatch "^XML Spy" redirect-carefully

BrowserMatch "^Dreamweaver-WebDAV-SCM1" redirect-carefully

위 지시자들도 구현에 문제가 있는 것들에 대한 처리방식을 지정한 것이다.

#<Location /server-status>

#    SetHandler server-status
#    Order deny,allow
#    Deny from all
#    Allow from .example.com

#</Location>

<Location /server-status>

    SetHandler server-status
    Order deny,allow
    Deny from all
    Allow from 192.168.0.0/24

</Location>

mod_status를 이용해 서버 상태의 모니터링이 가능하다. http://도메인/server-status와 같이 실행한다. 관리자만이 접속할 수 있도록 서버와 같은 로컬 네트워크에서만 접속할 수 있게 설정했다.

아래와 같은 내용이 표기되며 위에서 설정한 ExtendedStatus On 지시자에 의해서 자세한 정보를 제공하고 있다.

#<Location /server-info>

#    SetHandler server-info
#    Order deny,allow
#    Deny from all
#    Allow from .example.com

#</Location>

<Location /server-info>

    SetHandler server-info
    Order deny,allow
    Deny from all
    Allow from 192.168.0.0/24

</Location>

mod_info 모듈을 사용하여 서버의 설정상태들을 보고 받을 수 있다. 실행방법은 http://도메인/server-info 와 같다. 관리자만이 접속할 수 있도록 서버와 같은 로컬 네트워크에서만 접속할 수 있게 설정했다.

#<IfModule mod_proxy.c>

#ProxyRequests On
#
#<Proxy *>
#    Order deny,allow
#    Deny from all
#    Allow from .example.com
#</Proxy>

#ProxyVia On
$\#
#<IfModule mod_disk_cache.c>
#   CacheEnable disk /
#   CacheRoot "/var/cache/mod_proxy"
#</IfModule>

#</IfModule>

프록시 서버를 다루는 지시자들이다. 프록시 서버 기능을 작동시키려면 위의 행들의 주석을 제거한다. 캐쉬 기능 자세히

#NameVirtualHost *:80

이름 기반 기상호스트를 사용하겠다고 선언하는 부분이다. 대부분의 가상호스트는 하나의 서버주소 IP에 Servername(도메인이름)을 달리하여 여러개의 가상호스트를 운용한다.

*:80 은 :80 80번포트로 들어오는 * (모든 IP요청)에 대하여가상호스트를 수행한다는 것이다. mod_ssl을 이용한 SSL을 사용할 것이라면 포트번호를 :443 과 같이 적용해야 한다. httpd -S 옵션으로 가상호스트 설정에 대한 점검을 할 수 있다. 가상호스트 자세히

#<VirtualHost *:80>

#    ServerAdmin webmaster@dummy-host.example.com
#    DocumentRoot /www/docs/dummy-host.example.com
#    ServerName dummy-host.example.com
#    ErrorLog logs/dummy-host.example.com-error_log
#    CustomLog logs/dummy-host.example.com-access_log common

#</VirtualHost>

<VirtualHost *:80> ~ </VirtualHost>와 같이 가상호스트 구역을 설정하여 사용한다. 가상호스트의 첫번째 구역은 클라이언트가 요청한 ServerName(도메인)을 찾지 못하였을 경우에 보여지게 될 부분을 설정하게 된다.

  • ServerAdmin : 해당 가상호스트의 관리자 이메일 주소
  • DocumentRoot : 해당 가상호스트의 홈페이지디렉토리 위치
  • ServerName : 해당 가상호스트의 도메인명
  • ErrorLog : 해당 가상호스트의 웹에러로그 파일 위치
  • CustomLog : 해당 가상호스트의 웹로그파일 위치

이로써 CentOS 6.4 에서 yum을 이용한 패키지 설치를 했을때의 Apache 주설정파일 httpd.conf에 대하여 알아보았다. 아래는 간단히 php.conf의 내용을 알아본다.

vi /etc/httpd/conf.d/php.conf

<IfModule prefork.c>
  LoadModule php5_module modules/libphp5.so
</IfModule>

<IfModule worker.c>
  LoadModule php5_module modules/libphp5-zts.so
</IfModule>

prefork 방식이나 worker 방식으로 작동될때 각각에 대하여 php 사용을 위해 로드해야될 모듈들을 정의하고 있다.

AddHandler php5-script .php
AddType text/html .php

AddHandler는 파일확장자를 처리기(Handler 위의 php)에 매핑(연결)시켜주게 된다. 즉 위의 설정은 *.php 형식의 파일들은 php5-script라는 handler가 처리하라고 아파치웹서버에게 알려주는 것이다. 이 부분에 대한 설정을 제대로 해주지 않게 되면 php가 실행되지 않을 수 있다.

DirectoryIndex index.php

DirectoryIndex 부분을 다시 정의해주고 있는데 기본적으로 httpd.conf에서 정의하고 있으니 중복되는 부분이다.

AddType application/x-httpd-php .php .phtml
AddType application/x-httpd-php-source .phps

.php 또는 .phtml 또는 .phps 라는 확장자를 가진 파일들이 php 인터프리터가 파싱할 수 있도록 정의한다. .phps일 경우에는 그 스크립트를 실행하지 말고 웹브라우저 상에서 소스를 모두 보여주라는 의미임

신고

댓글을 달아 주세요

  1. 박준한 2013.10.10 16:13 신고

    안녕하세요. 정말 좋은 자료 감사합니다.
    궁금한게 하나 있는데요,

    MaxKeepAliveRequests 100에서
    "하나의 프로세스가 지속적으로 요청을 처리하다보면 메모리의 효율이 저하되고 이런 일이 계속 발생하면 전체적인 시스템 성능이 저하된다. 이 값이 0일경우 무한대로 요청을 처리하며 성능을 높이기 위해 높은 값을 추천한다."
    라고 하셨는데요, 하나의 프로세스가 지속적으로 요청을 처리한다는 것은 값이 0일 경우와 높은 값을 설정한다는 건데, 왜 높은 값을 추천한다고 되어 있나요??

    초보자라 이해가 잘 안되서 그러니 답변 부탁드립니당 **

    • BlogIcon 흉내쟁이 2013.10.11 15:32 신고

      헷갈리게 적어두긴 했네요 제가 ^^;
      우선 이 값을 0으로 두면 메모리 효율이 떨이지는 것이고, 그것을 방지하기 위해 적당한 값으로 설정해야 되는데 이 값이 낮을 경우 방문자의 요청에 프로세스가 생성/제거가 빈번하게 되니 성능에 나쁜 영향을 주게 됩니다. 그래서 무한대는 아니더라도 높은 값을 주셔야 합니다. 라고 이해하심 되겠습니다.^^;

    • 박준한 2013.10.14 10:25 신고

      답변감사합니다.^^
      프로세스가 생성/제거될때 성능에 나쁜 영향을 주게되는 거네요? 즉, 하나의 프로세스가 하나의 방문자의 요청을 계속 감당하는게 좋으니까 다른 프로세스가 하나의 방문자에 의해 쓸데없이 생성/제거되는 것을 막기위해 높은 값을 하는게 좋다라는 것이지요?

      그리고 한가지 궁금한게 있는데요. 아파치에 mod_security2를 깔려고 하는데 잘 안되네요... 팁 좀 알려주세요^^;;

    • BlogIcon 흉내쟁이 2013.10.14 11:54 신고

      mod_security2 관련 정보는 저도 가지고 있질 않습니다. ;;

  2. all챙 2016.11.22 10:16 신고

    글에서 많은 도움 받고 갑니다.
    하나 궁금한게 있는데, Options All 이 Options (공백)과 같다고 하신 부분에 대해서
    Apache 문서에서도 이와 관련된 설명이 나와 있지 않아서 질문드립니다.
    Default로 Options All 설정되어 있다는 설명 때문에 Option (공백)과 같다고 하신건가요?
    아니면 따로 참고한 문서가 있는지 궁금해서 질문드립니당

    • BlogIcon 흉내쟁이 2016.11.22 10:25 신고

      현재 서버설정이 가능하다면 직접 테스트해보세요. 글작성시에 테스트해보았던것 같지만 오래전일이라 장담하진 못하겠네요.

  3. ee32320 2017.05.15 19:39 신고

    포스팅 잘 보고 갑니다.
    궁금한게 있는데, xampp서버를 키고, html파일을 수정을 해도, 바로 수정이 되지 않더라구요. htdocs폴더 안의 파일을 다빼었다가 웹브라우져로 보면, 파일이 없다고 나오는데, 다시 htdocs폴더에 파일을 넣고 약간씩 수정해도 바로 적용이 안되는데, 어떤 것이 문제인건가요??

    • BlogIcon 흉내쟁이 2017.05.15 21:15 신고

      브라우저의 캐시문제일껍니다. 브라우저별로 캐시삭제하는법이 다르니 찾아보시고 항상 캐시없이 새로고침하는 방법들도 있습니다.

티스토리 툴바