티스토리 뷰

Linux

httpd.conf (아파치 설정 옵션) 정리

초보의 CHOMAN 2015.06.12 11:02

httpd.conf 버전에 따라 옵션이라든지 디렉토리 구조가 좀 틀린듯 하다.

ServerTokens OS
- 클라이언트 요청에 되돌려주는 정보에 웹서버의 OS에 대한 정보를 클라이언트에게 보여줌
- ServerTokens Prod : 정보보여주지 않는다??

ServerTokens min
- 클라이언트 요청에 최소한의 정보만을 클라이언트에게 보여줌

ServerRoot "/usr/local/apache" 
- 웹서버의 본체가 있는 디렉토리 소스설치하거나 rpm 으로 설치한 경우 경로가 틀려질수도 ㅋㅋ

PidFile run/httpd.pid
- 웹 프로세스의 PID를 기록할 파일의 위치를 설정 (뭔지 모르겠네 ㅋ)

Timeout 300
- 클라이언트가 300초후에 접속 끊겠다 아마 응답이 없으면 5분에 끊어지는듯


KeepAlive Off
- 클라이언트의 지속적인 접속 허용여부 결정 (디폴트는 Off)
- OFF 의 경우 클라이언트의 요청이 있은후 접속이 끊어지고 클라이언트 요청시 다시 접속하게 됨
- ON의 경우 클라이언트 요청시 다시 접속하는 과정이 생략 되어서 좋다는데 모르겠음 좋은지 ㅋ
- 한번 접속후 많은 통신이 이루어지는 서버의 경우 On 이 유리할지도 모름 (자원소모가 있다네)

MaxKeepAliveRequests 100 (Keepalive 가 On일때만 유효함)
- 클라이언트가 접속되어 있을시 웹서버에 요청할수 있는 최대 횟수
- 100이면 클라이언트의 요청을 받으면 끊고 다시 접속하게 하여 웹 서비스 처리 (프로세스가 100번의 요청이 들어오면 자신은 죽고

  다음 프로세스가 다시 클라이언트 요청을 받아서 처리)
- 0은 제한 없음을 의미하며 클라이언트가 접속을 끊지 않는 이상 계속 연결되게 할려고 할거임
- MaxClients 제한 이상의 연결시도는 보통 ListenBacklog 지시자에 설정된 수까지 대기

KeepAliveTimeout 15
- 클라이언트가 서버에 접속한 이후 15초동안 요청이 없다면 서버가 클라이언트 접속을 끊음 (일종의 대기시간)
- 60초 이상 설정 하지 말라네요.

그냥 디폴트의 아파치라면 prefork MPM 방식
- 미리 프로세스를 띠우고 있다가 요청이 있을시 자식프로세스를 생성하여 서비스 해주는 방식

 

StartServer
- 웹 서버가 시작할때 자식 프로세스 수를 지정 (아파치 시작후 ps -ef | grep httpd 하면 확인 가능)
- MinSpareServers, MaxSpareServers 등의 지시자에 의해서 프로세스는 생성되기도 하고 죽기도 하므로 큰 의미 없다고 함
MinSpareServers / MaxSpareServers
- MinSpareServers 수 보다 자식프로세스가 적으면 설정된 값만큼 자식프로세스 생성 (항상 대기하고 있을 프로세스 최소 갯수)
- MaxSpareServers 수 보다 많다면 만들어진 자식프로세스 중에 일부를 끝내어 버림 (항상 대기하고 있을 프로세스 최대 갯수)

ServerLimit
- 웹서버 운영중에 만들수 있는 자식프로세스의 한도를 지정

MaxClient
- 클라이언트들이 동시에 최대로 접속했을때 실행할수 있는 자식프로세스의 최대값 결정

MaxRequestPerChild
- 웹서버가 실행된후 자식 프로세스가 처리하는 최대 연결 요청 (하나의 프로세스당 최대 처리할수 있는 방문자 요청 횟수)
- 0인 경우 한번 실행된 웹서버의 자식 프로세스는 결코 죽지 않아 속도가 빨라짐?, 오류가 생기면 뒤지지 않음ㅋ

 

Listen 80
- 아이피 주소 지정하면 해당하는 아이피로만 들어오는 80번의 응답을 기다림
- 쿨하게 그냥 80만 적자

Include conf.d/*.conf
- 아파치 웹서버의 설정파일의 위치

User apache
Group apache
- 웹서버의 데몬 자식 프로세스의 사용그룹 지정
- Root 계정으로 실행된 다음 apache 라는 사용자 권한으로 사용자 권한으로 자식 프로세스 생성
- 보안때문에 설정된것. 웹 프로세스를 해킹하더라도 apache 권한 밖에 못 얻음 (root를 보호하자)

- 웹에서 디렉토리 / 파일에 대해 제어가 이루어질 경우 해당 소유자의 권한을 apache 대신에 해당 소유자를 지시자에 넣거나 

   디렉토리나 파일의 퍼미션을 조정해야한다. (실행이 되지 않음)


#ExtendedStatus On
- server_status 항목을 이용해서 서버의 상태를 보여주는 웹문서에 어떤 정보를 표시할것인지 설정
- 확장정보를 On으로 해놓으면 수집해야하는 부분이 있으므로 부화 생길지도 디폴트가 off, 주석처리 되어 있네

DSO (Dynamic Shared Object) 동적 공유 객체? (기능을 확장해주는것을 모듈화 해서 제공함)
- LoadModules 모듈을 실행하기 위한 항목 
- modules 디렉토리 안에 있지 싶음

ServerAdmin takakocap@kensei.co.kr
- 서버 문제 발생시 보낼 관리자 메일 지정

ServerName kensei.co.kr
- 웹 서버 이름 지정

UseCanonicaName Off
- 아파치 웹 서버가 자신을 가르키는 URL 주소를 구성할껀지 결정
- ServerName:port 형식으로 웹서비스 한다는데 무슨 말인지 모르겠음

DocumentRoot "/var/www/html"
- 웹 문서 디렉토리의 결로 지정 ( 웹 문서의 Root 디렉토리)

<Directory /> ~ </Directory>
- 디렉토리를 제어하기 위한 구문 (Root 디렉토리에 대한 설정) 
- 하위 디렉토리에 까지 적용되므로 공통적으로 적용되는 내용이라고 보면 됨

 

Options FollowSymLinks
- 클라이언트가 심볼릭 링크를 따라 이동할수 없게 하는 옵션

AllowOverride None
- 각각의 디렉토리에 접근 권한을 설정할때 필요한 옵션 (설정된 아파치 환경설정을 무시하고 새로운 설정을 적용하는 방법)
- 웹 문서를 제공하는 디렉토리에서 (.htaccess) 파일을 찾으면 이 파일로 디렉토리 접근을 재설정을 허용할지 결정
- None 값은 보안을 위해 설정 내용을 변경하지 못하게 하고 있음?
아파치는 /.htaccess, /www/.htaccess, /www/htdocs/.htaccess를 매번 열려고 시도한다.
최고의 성능을 얻으려면 항상 AllowOverride None을 사용하자.

 

 

AuthConfig

AuthDBMGroupFile, AuthDBMUserFile, AuthGroupFile, AuthName, AuthType, AuthUserFile, require 등과 같은 클라이언트

인증지시자의 사용을 허용.

FileInfo

AccessFileName 으로 지정한 파일에 대하여 AddEncoding, AddLanguage, AddType,
DefaultType, ErrorDocument, LanguagePriority 등과같은 문서유형을 제어하는 지시자 사용을 허용

 

Indexes
AccessFileName 으로 지정한 파일에 대하여 AddDescription, AddIcon,
AddIconByEncoding, DirectoryIndex, FancyIndexing 등과같은 디렉토리 인덱싱을 제어하는
지시자 사용을 허용

 

Limit
AccessFileName 으로 지정한 파일에 대하여 allow, deny, order 같은 호스트접근을 제어하는 지시자사용을 허용

 

Options
AccessFileName 으로 지정한 파일에 대하여 Options 지시자를 이용한 재설정을 허용

 

All
위에서 이야기한 모든 것을 허용

 

None
AccessFileName 으로 지정한 파일을 무시. 어떠한 설정도 재설정 할 수 없다.

 

<Directory "var/www/html"> ~ </Directory>
- 특정디렉토리에 대한 설정을 하는 부분임

 

indexes
- 시작 웹 문서 파일인 인덱스 파일이 없을때 디렉토리에 있는 파일 내용 보여줄것이다라는? 옵션

AllowOverride None
- 위에 꺼랑 같은 옵션 내용임

Order
- 디렉토리 접근 권한을 위한 지시자

allow, deny
- 디렉토리에 접근에 대해 먼저 허용하고 그 다음이 거부하겠다 (순서에 따라서 ㅋㅋ)

Allow from all 
- 모든곳에서 들어오는 접속을 허용
- all 대신에 특정 도메인도 넣을수 있다

 

EnableMMAP

커널에서 메모리매핑(mmap)을 지원한다면 아파치가 웹문서를 로딩하기 위하여 내부문서를 읽을때에 파일을 메모리 매핑하여 처리

메모리대응이 서버의 성능을 떨어트리고 심지어 안정성을 해치는 경우

또한 NFS 마운트한 파일시스템에 있는 파일을 메모리 대응하는 도중에 다른 NFS 클라이언트에 있는 프로세스가 파일을 지우거나

파일크기를 줄이면, 웹서버 프로세스가 다음 번에 메모리대응한 파일내용을 읽을때 bus error가 발생할 수 있다

 

되도록이면 off 하자

 

UserDir public_html
UserDir disable
- Root 계정이외에 사용자가 자기 계정에 해당하는 웹서버의 기본 디렉토리를 public_html으로 지정함
- 계정별로 웹 서비스를 지정할수 있는 옵션부분임 (아마 웹 호스팅?)
- 디폴트가 주석처리이고 disable임


DirectoryIndex index.php index.html 18nom.html ......
- 처음에 보여줄 웹 문서 지정 (순차적으로 적어주자 먼저 보여줄것)
- 지정되어 있지 않으면 파일 목록을 보여주거나 403 Forbidden 오류 메세지 출력
- 완전한 파일명을 명시하며 자주 쓰이는 것 부터 먼저 명시

AccessFileName .htaccess
- 디렉토리 사용자인증에 필요한 파일을 지정

<Files ~ "^\.ht"> ~ </Files>
- 파일에 대한 접근을 제어하기 위한 부분. 여기서는 *.ht 로 시작되는 확장자에 대한 파일에 대한 제어 부분임
- 디폴트로 Deny from all 로 되어있다. 웹 클라이언트가 이 부분 수정하면 조때죠...

TypesConfig /etc/mime.types
- /etc/mime.types 에는 파일 확장자가 거기에 대응하는 컨텐츠 유형이 설정되어 있음
- 서버가 클라이언트의 요청에 응답할때 시작 부분에 MIME 정보 함께 전송하여 이에 클라이언트에 
이를 재생하기 위해 적절한 응용프로그램을 선택할수 있게 한다

DefaultType text/plain
- 웹서버가 알지 못하는 MIME 유형 제공할때 디폴트가 text/plain 의 유형으로 지정 (뭔지는 모름 텍스트??)

MIMEmagicFile conf/magic
- 클라이언트에게 제공할 파일의 내용을 통해 MIME 유형을 결정할때 힌트를 얻을수 있다??
- 사용할 리도 없겠지만 httpd.conf에 Loadmodule mime_magic_module modules/mod_mime_magic.so 적어준다.

HostnameLookups Off
- 웹서버가 로그정보를 기록할때 클라이언트들의 IP들을 DNS에 질의해서 도메인으로 남길지 설정
- 도메인으로 변경할때 성능저하를 가지고 올수 있음 ( 할 이유가 없다 따로 질의해봐도 되니깐 ㅋ)

ErrorLog "/var/log/httpd/erroe_log"
- 아파치 에러로그 남길 파일 지정

LogLevel warn
- 로그를 기록할 수준 선택 (debug, info, notice, warn, error, crit → 이쪽 순으로 갈수록 간단하게 남김)


LogFormat 에서 접속로그를 기록할 형식을 결정

CustomLog 에서 원하는 형식의 로그 기록 방식을 선택
- %h : host
- %i : ident
- %u : authuser
- %t : date and time 
- %r : request
- %>s : status
- %b : byte

 

 

로그포맷을 아래와 같이 뒤에 이름을 붙여서 설정도 가능함...
LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%v %{X-Forwarded-For}i %l %u %t \"%r\" %>s %b" X-Forwarded-For
LogFormat "%v %{X-Forwarded-For}i %l %u %t \"%r\" %>s %b %{GEOIP_COUNTRY_CODE}e" KENSEI

 

 

vhost 설정 부분에서 아래와 같이 httpd.conf에서 지정한 로그포맷 이름을 주어서 로그 생성가능
CustomLog "logs/kensei.co.kr-access_log" KENSEI


이미지 파일 등은 로그 남기지 않기

 

SetEnvIfNoCase Request_URI "\.(swf|png|gif|jpg|jpeg|js|css|mpg|mpeg|ico)$" NO_LOG
CustomLog logs/access_log combined env=!NO_LOG

 

 

임의의 아이피 로그 남기지 않기

SetEnvIf Remote_Addr "^100.100.100.100$" NO_LOG

 

 

아예 로그 남기지 않기

- CustomLog 설정 하지 않을시 그냥 access.log 로 (디폴트)로 남기게 될것임

CustomLog /dev/null combined

 

 

용량별로 로그 로테이트 시키기

 - 100메가 끊어서 로테이트 시키기

ErrorLog "|/usr/local/apache/bin/rotatelogs /home/log/error-log/access-%Y-%m-%d.log 100M"e

 

Alias /icons/ "/var/www/icons/" 
- DocumentRoot 이외의 다른 디렉토리에서도 웹 문서를 서비스 할수 있게 디렉토리 경로에 별칭 부여
- 별칭을 부여한다면 웹 문서에서 /icons/파일이름 으로 사용가능함

<Directory "/var/www/icons/"> ~ </Directory> 지시자를 통해 웹 문서에 제공할 디렉토리에 대한 속성 정의


ScriptAlias /cgi-bin/ "/usr/local/apache/cgi-bin/" 
- 위와 같이 별칭부여의 한가지이며 별칭을 CGI 스크립트로 인식한다는 점

<Directory "/usr/local/apache/cgi-bin"> ~ </Directory> 를 통해 CGI 스크립트를 제공할 디렉토리 속성 정의

*. CGI : Common Gateway Interface 
- 웹서버에서 외부의 프로그램을 실행하고 그 결과를 받아오기 위한 규약
- 웹 컨텐츠를 동적으로 만드는데 이용됨 ex) 게시판 방명록 등등....

# Redirect permanent /foo http://www.example.com/bar
- 웹도메인이 변경되었을때 기존도메인으로 들어온다면 새로운 웹 주소의 문서를 제공해준다.

IndexOptions FancyIndexing VersionSort NameWidth=*
- DocumentRoot 디렉토리에 DirectoryIndex 항목에서 설정한 시작문서가 없다면 디렉토리의 파일목록을 보여주는데
이때 각 파일들을 어떤 형식으로 보여줄지 결졍

 

FancyIndexing
- 파일의 아이콘, 파일크기, 파일이 수정된 시간을 보여줌

VersionSort
- 파일의 버전순으로 정렬하여 보여줌

NameWidth=*
- 출력되는 파일 목록의 열의 폭을 필요한 만큼 늘림

 

 

/conf.d/welcome.conf
- 웹서버 테스트 파일은 따로 존재하지 않음, 이 페이지에 설정파일에 대해 정의 되어 있다.
- 주석처리 하면 테스트 페이지 대신에 파일목록을 나열함

 

<LocationMatch "^/+$">
Options -Indexes
ErrorDocument 403 /error/noindex.html
</LocationMatch>

 

 

IndexIgone .??* *~ *# HEADER* README* RCS CVS *,v *,t
- 디렉토리안에 있는 파일목록을 출력할때 숨길파일을 정의

Include conf/extra/httpd-languages.conf
- 웹서버가 제공할 웹 문서 사용되는 언어 정의

 

아래와 같이 정의 되어 있음

AddLanguage ca .ca
AddLanguage cs .cz .cs
AddLanguage da .dk
....

 

 

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 tr zh-CN zh-TW
- 각 언어에 대한 우선순위 부여함

ForceLanguagePriority Prefer Fallback
- 언어가 AddLanguage 목록에 없을때 LanguagePriority에 정의된 순서대로 판단할 수 있게 함

AddCharset us-ascii.ascii .us-ascii
- 언어의 문자세트가 정의 되어 있음

AddType application/x-httpd-php .htm .html .php .ph php3 .php4 .phtml .inc
- mime.type 을 통해 변환하지 않고 웹서버가 제공하는 MIME 유형을 정의 할때 사용
- 위의 예는 php 형식에 파일에 대해서는 PHP로의 변환이 필요하다는것을 의미함

AddEncoding x-compress .Z
- 특정 브라우저에서 자료를 내려받음과 동시에 압축 해제가능하게 하는 지시자, 만약 주석처리 한다면
AddType application/x-gzip .gz .tgz 와 같이 파일 형식에 대한 MIME 유형을 AddType 으로 정의해야함
- 웹 브라우져에서 기능을 지원해야 한다고 함 ( 안 써도 될듯한 기능일거 같음?)

#ErrorDocument 500 "The server made a boo boo."
- 사용자 정의 에러메시지에 대한 설정부분 메세지로 나타낼수도 있으며 문서로 지정할수도 있다.
아파치/error 디렉토리에 정의 문서가 제공되어 지는듯하다, 해당디렉토리를 alias 해서 사용하면 될거 같다

BrowserMatch "Mozila/2" nokeepalive
- 클라이언트에서 접근하는 브라우져별 특정한 행동을 지정할수 있음

ErrorDocument 404 http://도메인
- 없는 페이지를 요청할 경우 특정 도메인으로 리다이렉팅 시킴


ex) http-vhost.conf
- 들어오는 모든 80번 트래픽에 한해 한가지 페이지만 띠울때 ...

NameVirtualHost *:80
<VirtualHost *:80>
DocumentRoot "/home/imsi-page"
ServerName *
</VirtualHost>


댓글
댓글쓰기 폼