}

블로그 소개


*여러분들의 따듯한 댓글은 5%, 팔로우는 10% 블로그 포스팅 속도와 퀄리티를 높여줍니다.*

프로필

팔로우 해주시면 포스트할 때 큰 힘이 됩니다!!! 사실 저도 이 팔로우가 무슨 기능이 있는지는 모르겠습니다만, 팔로우 수가 늘면 '날 응원해주는 사람들이 있구나' 생각이 들어서 큰 힘이 됩니다.

팔로어

다른 페이지로 이동


리눅스 독학 페이지 운영체제 독학 페이지 네트워크 독학 페이지 하드웨어 독학 페이지 프로그래밍 독학 페이지 보안 페이지

오스 페이지 다이어트 정보 페이지 게임 정보 페이지 인생 꿀팁


****사진을 클릭하시면 페이지로 이동할 수 있습니다!****

<===***===↓↓↓You can use translate on the chrome↓↓↓===***===>

2022년 3월 12일 토요일

아파치 httpd.conf 모든 주석 해석 자세히!

 안녕하세요~ 마무입니다. 오늘은 리눅스에서 가장 많이 사용되는 웹 서버 프로그램 중 하나인 "아파치"의 핵심 설정 파일 "httpd.conf", ".htacess란", "아파치 지시어들"에 대해서 자세히 다뤄보려 합니다. 

당~~연하지만 2급 범위에 적은 네트워크 개념 섹션의 지식들을모두 알아야 이해가 되므로, 꼭 "리눅스 독학 페이지 -> 네트워크 개념"으로 구분한 포스트들을 모두 읽고 오시길 바랍니다.

httpd.conf내 중요한 지시어들은 다음에 다른 포스트에서 기능을 구현해볼 것이니 일단은 한번 가벼운 마음으로 읽어주시고, 나중에 까먹었을 때 "CTRL + F"를 통해 원하는 지시어를 검색하여 보시면 될 것 같습니다.

이 포스트를 한번이라도 다 읽으시면, 아파치 설정 파일에 대한 두려움이 사라지며 아파치 작동의 전체적인 흐름을 이해하게 될 겁니다!


-----목차-----

1. httpd.conf 지시어 종류

2. 아파치 httpd.conf 지시어들

i) ServerRoot, mutex

ii) Listen

iii) LoadModule

iv) <ifModule></ifModule>

v) User, Group

vi) ServerAdmin

vii) ServerName

viii) <Directory></Directory> 와 내부 지시어( AllowOverride, .htaccess, Require)

ix) DocumentRoot

x) <Directory></Directory> 내부 지시어 Options

xi) DirectoryIndex

xii) <Files></Files>

xiii) ErrorLog

xiv) LogLevel

xv) LogFormat, CustomLog

xvi) Redirect, Alias, ScriptAlias

xvii) ScriptSock, RequestHeader

xviii) TypesConfig, AddType, AddEncoding

a) MIME이란

xix) AddHandler, AddOutputFilter, MIMEMagicFile, ErrorDocument

xx) MaxRanges, EnableMMAP, EnableSendfile

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

여기 없는 정보들은

리눅스 독학 페이지 : https://mamu2830.blogspot.com/p/blog-page_13.html

네트워크 독학 페이지 : https://mamu2830.blogspot.com/p/blog-page_15.html

에서 찾아보세요!




1. httpd.conf 지시어 종류


2.2 미만 버전 아파치는 환경 설정을 모두 'httpd.conf'파일 하나로 해결했지만, 2.2 버전 이상부터는최소한의 설정만'httpd.conf'에서 설정하고 세부적인 설정들은'extra' 디렉토리 내부 '.conf'로 끝나는 다른 설정 파일을 이용해 설정하게 됐습니다.

이 말은 달리 말하면 가~장 기본적인 웹 서버 운영은'httpd.conf'만 알아도 가능하다는 것이죠!!

그래서 이번엔 가장 핵심 설정 파일인'httpd.conf'에 대해서 배워보도록 하고, 그 외 extra 설정들은 다른 포스트에서 다루도록 하겠습니다.

자 그럼 한번 아파치의 핵심 설정 파일인 '/usr/local/apache/conf/httpd.conf'를 vim으로 열어서 확인해봅니다.(/usr/local/apache에 설치했다는 가정하에)

이제 막 리눅스마스터 1급 범위를 공부하시는 분들이라면, 처음으로 엄청난 길이 내용의 설정 파일을 보는 것이라 많은 내용들주석들 때문에 어지러우실텐데요.. 

하지만 저는 처음 공부할 때 느끼는 어지러움은낯설음에서 오는 것이며, 그 낯섦을 없애는 방법은 바로 전체적으로 꼼꼼히 읽는 것이라 생각하거든요!

그래서 힘들겠지만(저도 여려분도..) 이번 포스트에서 'httpd.conf'적혀있는 주석들을 모두 해석하고, 거기에 제 설명을  

/*****

저의 설명

*****/

이런 형식으로 마지막에 덧붙이려 합니다. 

참고로 리눅스 파일에선 파이썬과 마찬가지로 '#'로 시작하는 파란색 글씨들이주석입니다.

그리고 아파치의 설정 파일은'지시어(Directive)'라고 부르는 특정 키워드를 통해 각 키워드에 맞는 설정을 하는데요.

이제 밑에서 보시겠지만 보통

Listen ip:port

ServerRoot /usr/local/apache

이런 식으로 대문자로 시작하는 키워드가 바로 '지시어'입니다.

그리고 

<ifModule [특정 모듈]> 

~~~~

~~~~

</ifModule>

 이런 형태의 Container(무언가를 담을 수 있는)형태도 볼 수 있는데요, 이것도 지시어입니다. 하지만 아파치 공식 문서에선 이 지시어를 container 지시어라고 하기에, 저도 '컨테이너 지시어'라고 표현할 겁니다. 

컨테이너 형태의 지시어의 특징HTML처럼 태그 형태로 시작을 표현하며태그 조건이 맞을 시태그 사이의 내용을 실행한다는 뜻입니다.

그리고 

<Directory />

AllowOverride none 

</Directory>


'AllowOverride'와 같은 특정 컨테이너 지시어 안에서만 쓰이는 지시어들이 있는데, 편의상 그냥 포스트에서 '내부 지시어'라고 표현하겠습니다. 

자.. 이렇게 httpd.conf를 이루고 있는 주석, 지시어, 컨테이너 지시어, 내부 지시어의 대략적인 구조를 말씀드렸는데.. 사실 이제 본격적으로 읽기 시작하면 지시어가 너~~무 많아서뭐가 중요한지 감이 안 오실 겁니다. 

그러므로 리눅스마스터 1급에 나올 만큼 중요한 지시어는노란색으로 색칠해 놓을테니, 그 부분만 아셔도시험 볼 땐 괜찮으실 겁니다. 

아무래도 시험에 나오기 애매한 지시어는초록색으로 색칠해놓겠습니다.

참고로 저의 포스트의 자세한 정보들은 아파치 공식 사이트 메뉴얼을 토대로 합니다.

출처 : http://httpd.apache.org/docs/2.4/en/

자.. 심호흡 한번 하시고!! 이제 출발해봅시다!




2. 아파치 httpd.conf 지시어들




2~7 # This is the main Apache HTTP server configuration file.(이것은 메인 아파치 HTTP 서버 설정 파일입니다.)  

It contains the configuration directives that give the server its instructions. (이 파일은 적혀있는 명령을 서버에게 주는 지시어들을 포함하고 있습니다.) 

See <URL:http://httpd.apache.org/docs/2.4/> for detailed information.(더 자세한 정보는 URL:http://httpd.apache.org/docs/2.4/에서 확인하세요.)

In particular, see <URL:http://httpd.apache.org/docs/2.4/mod/directives.html> for a discussion of each configuration directive. (특히 각각의 설정 지시어들에 대한 논의들은 URL:http://httpd.apache.org/docs/2.4/mod/directives.html에서 확인하세요.)

8 #

9~ 11 # Do NOT simply read the instructions in here without understanding what they do.(절대로 지시어들이 무엇을 하는지 이해하지 않고, 여기에 적혀있는 간단한 설명만 읽지 마시오.)

They're here only as hints or reminders.(여기에 있는 설명들은 오직 힌트나 다시 기억하기 용입니다.)

If you are unsure consult the online docs.(만약 당신이 확신하지 못한다면 온라인 문서를 참조하시오.) 

You have been warned.(당신은 경고를 받은 겁니다.{난 경고 했습니다} 

12 #

13~19 # Configuration and logfile names: If the filenames you specify for many of the server's control files begin with "/" (or "drive:/" for Win32), the server will use that explicit path.(설정과 로그 파일 이름들: 만약 당신이 지정한 많은 서버의 컨트롤 파일들의 이름이 "/"(윈도우32는 "drive:/")으로 시작한다면, 서버는 그 경로를 매우 명백하게 사용할 것입니다.)

 If the filenames do *not* begin with "/", the value of ServerRoot is prepended -- so "logs/access_log" with ServerRoot set to "/usr/local/apache2" will be interpreted by the server as "/usr/local/apache2/logs/access_log", whereas "/logs/access_log" will be interpreted as '/logs/access_log'.(만약 파일 이름이 "/"로 시작하지 않는다면, ServerRoot의 값이 앞에 붙을 겁니다. -- 그러니까 "logs/access_log"란 파일이 있고 ServerRoot를 "/usr/local/apache2"라고 설정한 경우, 이 파일 이름은 서버에서 "/usr/local/apache2/logs/access_log"로 해석된다는 겁니다. 반면에 파일 이름이 "/logs/access_log"인 경우 서버에서는 '/logs/access_log'로 해석될겁니다.) 

 20 

 21 #



i) ServerRoot, mutex 


 22 #ServerRoot: The top of the directory tree under which the server's configuration, error, and log files are kept.(ServerRoot: 서버의 설정, 에러 그리고 로그 파일들이 들어있는 최상단 디렉토리입니다.)

 24 #
 25~29 # Do not add a slash at the end of the directory path.(디렉토리 경로 끝에 슬래쉬(/)를 추가하지 마시오.)  

If you point ServerRoot at a non-local disk, be sure to specify a local disk on the Mutex directive, if file-based mutexes are used..(만약 file-base mutexes을 사용하고 있고 당신이 ServerRoot를 non-local disk{현재 컴퓨터에 없는 디스크 공간}으로 지정했다면, 하나의 local disk(컴퓨터에 있는 디스크)는 Mutex 지시어에 적어서 확실히 해라.)  
(mutex : Mutual Exclusion, 상호 배제)

If you wish to share the same ServerRoot for multiple httpd daemons, you will need to change at least PidFile.(만약 당신이 여러 개의 httpd 데몬들이 같은 ServerRoot를 공유하길 바란다면, 최소한 PidFile은 변경해야 한다.)

/*****

'ServerRoot'는 그냥 아파치 디렉토리 위치를 설정해주는 지시어라고 생각하시면 됩니다. 

지시어를 통해 ServerRoot "/usr/local/apache" 이렇게 적어놓으면, 이후 다른 지시어에서절대 경로 없이 파일 이름 'example'만 적어도 아파치가 이 ServerRoot에 적힌 경로를 이용해 자동으로 /usr/local/apache/example 이렇게 해석하고 찾는 것이죠.

*****/



34~35 #Mutex: Allows you to set the mutex mechanism and mutex file directory for individual mutexes, or change the global defaults(Mutex: 당신이 mutex 메커니즘과 개인 mutexes를 위한 mutex 파일 디렉토리를 설정할 수 있게 허용하거나, 전역 기본 설정을 변경할 수 있게 허용해준다, mutex는 mutual exclusion: 상호배제의 약자입니다.)

36 #

37~39 # Uncomment and change the directory if mutexes are file-based and the default mutex file directory is not on a local disk or is not appropriate for some other reason.(만약 mutexes가 file-base{파일기반}이고 기본 설정 mutex 파일 디렉토리가 로컬 디스크에 없거나, 다른 이유 등으로 적합하지 않다면 주석을 제거하고 디렉토리를 변경하시오.)

 40 #

 41 #Mutex default:logs

이 Mutex라는 지시어에 대한 자세한 설명은

http://httpd.apache.org/docs/2.4/en/mod/core.html#mutex 에서 확인할 수 있습니다.


/*****

참고로 Mutex란 운영체제 공부 때 배우는 Mutual Exclusion(상호 배제)를 말합니다.

*****/


ii) Listen 


 44~46 #Listen: Allows you to bind Apache to specific IP addresses and/or ports, instead of the default. See also the <VirtualHost> directive.(Listen: 당신이 기본 설정 대신, 아파치를 특정 IP주소 + 포트와 연결해줍니다. <VirtualHost>지시어도 봐주세요.)

 47 #

 48~49 # Change this to Listen on specific IP addresses as shown below to prevent Apache from glomming onto all bound IP addresses.(밑에 써있는 것처럼 이곳을 특정 IP주소들만 Listen{신호를 받게}하게 바꾸는 것은, 아파치가 모든 IP 주소 영역에서 정보들을 glomming{훔치는 것, 듣는 것{의역}}을 막습니다.)   

 50 #

 51 #Listen 12.34.56.78:80

 52 #Listen 80


/*****

말 그대로 Listen(듣겠다)IP:port의 신호를 이란 뜻으로, 특정 IP나 전체 IP의 특정 포트에서 오는 신호만 서버로 받아들이게 하는 지시어입니다.

하지만 보통 웹 서버는 대부분의 사람들이 접속할 수 있어야 하므로, 잘 알려진 포트 번호(well-known port)인 HTTP 프로토콜 번호 '80'이나 HTTPS 번호'443'을 적습니다.

ex) 80 포트와 443 포트 둘 다 받기

Listen 80

Listen 443

이 Listen 지시어에 대한 매우 자세한 설명은 

http://httpd.apache.org/docs/2.4/en/mod/mpm_common.html#listen 에서 확인할 수 있습니다.

*****/




iii) LoadModule 



55# Dynamic Shared Object(DSO) Support (동적공유오브젝트, 그냥 동적 라이브러리 지원)

57~59# To be able to use the functionality of a module which was built as a DSO you have to place corresponding `LoadModule' lines at this location so the directives contained in it are actually available _before_ they are used.(DSO로 만들어진 모듈의 기능을 사용하려면, 당신은 비슷한 'LoadModule' 줄들을 이 장소에 배치해야 합니다. 그래야 이곳에 있는 지시어들이 사용되기 전 실제로 이용 가능합니다. 

 60 # Statically compiled modules (those listed by `httpd -l') do not need to be loaded here.(정적으로 컴파일 된 모듈들{'httpd -l'를 통해 볼 수 있는 모듈들}은 여기에 적을 필요가 없습니다.)

/*****

LoadModule(Load Module, 모듈을 싣겠다)라는 뜻대로, 아파치에서 사용할 동적 모듈의 이름을 적는 지시어입니다. 실제로 저희가 php를 연동할 때, php를 동적 모듈로서 아파치와 연동하기 위해 이 'LoadModule'을 사용했었죠! 

보시면 엄청나게 많은 모듈이 적혀있지만 대부분은 '#'을 통해 주석으로 돼 있는 걸 볼 수 있습니다. 이렇듯 그냥 특정 모듈을 사용하고 싶지 않을 땐 '#'을 붙여 주석화시키면 됩니다. 

이 외에도 '/conf/extra/' 내에 있는 세부 설정을 위한'.conf' 파일들을 사용할 때도, 각 '.conf'가 적힌 "# LoadModule" 주석을제거해줘야 합니다.(이 부분은 나중에 extra의 conf 파일들을 다룰 때 해볼 겁니다.)


*****/





iv) <ifModule></ifModule>




<IfModule unixd_module> 


/*****


'<IfModule ???></ifModule>'는 이름 그대로 만약 모듈 "???"이 있다면<IfModule ~~> </IfModule>사이에 있는 지시어들을 실행하란 컨테이너 지시어 입니다. 

여기선 'unixd_module(유닉스와 비슷한 플랫폼에서 필요한 기초 보안 모듈)'이 있으면 범위 내에 있는 지시어를 실행하란 뜻이죠! 

이걸 외울 필요는 없을 것 같고, 그냥 <IfModule> 컨테이너 지시어의 의미 아시면 될 것 같습니다.


*****/


v) User, Group 


169 # If you wish httpd to run as a different user or group, you must run httpd as root initially and it will switch. (만약 당신이 httpd{아파치}가 다른 유저나 그룹으로 실행되길 바란다면, 당신은 반드시 처음에 httpd를 root계정으로 실행해야 합니다 그러면 이후 여기 적혀있는 유저나 그룹으로 바뀝니다.)

172 # User/Group: The name (or #number) of the user/group to run httpd as.(User/Group : httpd를 실행할 때 사용할 유저/그룹의 이름(또는 #번호).)

173 # It is usually good practice to create a dedicated user and group for running httpd, as with most system services.(대부분의 시스템 서비스처럼, httpd를 실행하기 위한 특정 목적의 유저나 그룹을 만드는 것은 좋은 관행입니다.)

175 #

176 User daemon

177 Group daemon

</IfModule>

/*****

유닉스/리눅스 시스템에서는프로세스가 실행되려면 반드시 유저와 그룹 이름이 필요한데요, 이러한 서비스(데몬)을 실행할 때마다 root 권한을 주는건 상당히 위험합니다. 실제로 웹 프로그램의 root권한을 이용해 서버를 마음대로 하는 악성 행위가 있거든요.

그래서 보통 특정 서비스(데몬)에 사용할 유저나 그룹을 따로 만들어 사용하며, 리눅스에는 기본저긍로 데몬(서비스)을 위해 사용하라고 만들어진 'daemon' 유저, 그룹이 있습니다.  

그래서 이 'httpd.conf' 설정 파일에 기본 값으로 'daemon'이 적혀있을 수 있던 거죠.

그리고 이런 식으로 아파치 프로세스의 'User''Group'기본적인 보안에 관련된 지시어라 ,아까 'unixd_module(유닉스와 비슷한 플랫폼에서 필요한 기초 보안 모듈)'가 지원하던 겁니다.

더 자세한 정보는 밑 URL에 있습니다.

https://httpd.apache.org/docs/2.4/mod/mod_unixd.html#user

https://httpd.apache.org/docs/2.4/mod/mod_unixd.html#group


*****/





181 # 'Main' server configuration('메인' 서버 설정)

182 #

183~185 # The directives in this section set up the values used by the 'main' server, which responds to any requests that aren't handled by a <VirtualHost> definition.(이 구역에 있는 지시어들은 '메인'서버에서 사용되는 값들을 설정합니다. 그리고 이 값들은 <VirtualHost> 정의에서 처리되지 않는 요청에 응답합니다.)

185~186 # These values also provide defaults for any <VirtualHost> containers you may define later in the file.(또한 이 값들은 이후 당신이 파일 뒷부분에 정의할 수 있는 모든 <VirtualHost> 컨테이너들에게 기본 설정 값을 제공합니다.)

187 #

188~190 # All of these directives may appear inside <VirtualHost> containers, in which case these default settings will be overridden for the virtual host being defined.(이러한 모든 지시어들은 <VirtualHost>컨테이너들 안에 쓰일 수 있으며, 그런 상황인 경우 이 기본 설정 값들은 버츄얼 호스트가 정의될 때 덮어 쓰여집니다.) 


vi) ServerAdmin





194~196 # ServerAdmin: Your address, where problems with the server should be e-mailed.  This address appears on some server-generated pages, such as error documents.  e.g. admin@your-domain.com(ServerAdmin: 서버에서 문제가 있을 때 이메일을 보내야 하는 당신의 주소. 이 주소는 서버에서 생산하는 에러 문서와 같은 페이지들에 나타납니다. 예를 들어 admin@your-domain.com)

197 #

198 ServerAdmin you@example.com


/*****

ServerAdmin이란 주석에 써있던 대로, 서버에서 문제가 발생했을 때 서버를 이용하는 클라이언트에게 보낼관리자(어드민) 주소입니다. 

예를 들어, 백엔드 개발자가 특정 페이지 URL 처리를 잘못할 경우 클라이언트가 특정 URL에 접근할 때 당연히 에러 페이지가 뜨거든요. 그 때 에러 페이지에 보여질 관리자 주소라는 것이죠.

실제로 이 옵션은 사용하길 추천하는데, 왜냐면 에러 상황 외에도서버에서 사용하는 많은 CGI 스크립트들이 권한 요구를 할 때 사용하기 때문입니다. 

이메일 형식이 아닌 URL을 사용해도 되지만당연히 다른 서버의 URL을 적어야 합니다. 왜냐면 당연히 에러가 발생한 웹 서버의 URL은 클라이언트가 접촉할 수 없기 때문이죠.  

더 자세한 정보는


*****/


vii) ServerName 





201 # ServerName gives the name and port that the server uses to identify itself.(ServerName은 서버가 스스로를 인식할 때 사용하는 이름과 포트 번호를 주는 지시어 입니다.)

202~203 # This can often be determined automatically, but we recommend you specify it explicitly to prevent problems during startup.(이건 종종 자동으로 정해지긴 하지만, 우리는 당신이 프로세스 시작 때 발생할 수 있는 문제들을 방지하기 위해 아주 명백하게 적기를 추천합니다.)
204 #
205 # If your host doesn't have a registered DNS name, enter its IP address here.(만약 당신이 공식적으로 등록된 DNS 이름을 갖고 있지 않다면, 그냥 당신의 IP 주소를 여기에 적으세요.)

206 #
207 #ServerName www.example.com:80
208 ServerName 192.168.3.132
209 #

/*****

ServerName이란 위에 주석 설명대로 아파치 서버가 자신을 식별할 호스트 이름(도메인)포트 번호를 적는 곳입니다.

지금 저희는 아직 DNS 서버를 구축하지 않았고, 실제로 돈을 주고 쓰는 공인 도메인도 없기에 그냥 제 VM이 사용 중인사설 IP '192.168.3.132'를 적어 놓은 겁니다.

추가로 이 'ServerName' 지시어는 서버의 호스트 이름을 지정하는 지시어로 나중에 배울 <virtualHost></virtualHost>라는 여러 도메인을 운영하게 해주는 지시어를 쓸 때, 각 <virtualHost> 지시어 내부에서 각 도메인을 구분하기 위해 쓰입니다.

더 자세한 정보는 

https://httpd.apache.org/docs/2.4/mod/core.html#servername

에 있습니다.

*****/


viii) <Directory></Directory> 와 내부 지시어들( AllowOverride, .htaccess, Require) 




210~212 # Deny access to the entirety of your server's filesystem. You must explicitly permit access to web content directories in other <Directory> blocks below.(당신 서버의 파일시스템 전체에서 외부의 접속을 거부합니다. 당신은 반드시 다른 <Directory> 블록 안에서 웹 내용 디렉토리들의 접속을 허용해야 합니다.) 


213 #

214 <Directory />

215     AllowOverride none

216     Require all denied

217 </Directory>

218 


/*****

아파치는 아파치에서 사용하는 각 디렉토리마다 반드시 이 <Directory ["디렉토리 절대위치"]> </Directory> 태그를 적어줘야 합니다.

위에서 나오는 <Directory />리눅스 최상위 디렉토리 '/'를 말하며, 즉 리눅스 서버 시스템 전체에서 적용할 설정을 하는 것입니다. 
그리고 </Directory>라는 부분은 HTML을 아시는 분들은 익숙할, 끝을 나타내는 태그(지시어)죠

그래서 여기 <Directory /></Directory> 사이에 적는 모든 지시어들은 최상위 디렉토리 '/'에(그 밑에 있는 모든 디렉토리와 파일들까지)적용된다는 겁니다.

그리고 밑에서 다룰 거지만 안에 "Require all denied"가 보일텐데요.

의미는모두의 접근을 거부한다로, 당연히 서버에서 허용한 특정 디렉토리 외엔 클라가 접근하지 못하도록최상위 디렉토리부터 막아둔 겁니다. 

그럼 어떻게 클라이언트가 웹 서버에 접근하느냐? 

이제 추가적으로 <Directory "디렉토리 경로">를 적어서 클라에게 허용할 일부 디렉토리를 추가하는 것이죠.

기본적으로 전체 문을 다 닫아놓고 앞으로 사용할 문들만 열기 위해, 최상위 디렉토리부터 닫아놓은 느낌이라고 보시면 됩니다.

또 <Directory "디렉토리 절대 위치">에서 디렉토리 이름에는 리눅스 쉘에서 쓰는 와일드카드(?, *, {})를 쓸 수 있으며, '~'를 붙이면 정규표현식(^)도 쓸 수 있습니다.

예를 들어 <Directory "/home/*/public_html"> 이런식으로 쓸 경우 이건 /home에 들어있는 모든 유저 홈 디렉토리 내 'public_html' 파일을 의미하죠

여기서 절대 디렉토리 경로를 적을 때 그냥 <Directory /home/*/public_html>이렇게 적는 방식<Directory "/home/*/public_html"> 이렇게 ""를 이용해 적는 방법 둘다 됩니다만
""를 안 쓸 경우 디렉토리 경로에 공백이 있으면 인식을 못하기에 디렉토리 경로를 쓸 때 ""를 쓰는 게 더 좋습니다. 

<Directory>의 자세한 정보는 


AllowOverride(허용한다 덮어 씌우기)는 정규표현식을 안 쓴 <Directory> 컨테이너 지시어의내부용 지시어로, 특정 디렉토리 내에 있는 '.htaccess'란 파일의 내용이 httpd.conf 설정을 덮어 씌우는 것을 허용한다는 것을 말합니다.

".htaccess(hypertext access)"특정 디렉토리에만 적용하기 위해 만드는 맞춤형 httpd.conf 파일이라고 생각하시면 됩니다.

특정 디렉토리 내에'.htaccess'란 파일을 만들고 그 안에 'httpd.conf'의 지시어를 적으면, 그 '.htaccess' 파일이 속한 디렉토리와 그 하위 디렉토리에만 .htaccess 내 지시어 설정이 적용됩니다.

예를 들어 특정 <Directory ["디렉토리"]> 지시어 내부에 AllowOverrideAll 이고 그 디렉토리에 ".htaccess" 파일이 있으면, httpd.conf 설정보다 ".htaccess" 내 설정이 더 우선이 되는 것이죠.

이러한 AllowOverride라는 내부 지시어에 올 수 있는 값들은

---AllowOverride 지시어의 값----
 
None(하나도 허용 x) 
All(허용)
특정 지시어(AuthConfig, FileInfo, Indexes, Limit, Options)

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

가 있습니다
 
만, 아직 우리는 배우는 단계라 그냥 .htaccess란 파일이 뭔지AllowOverride 지시어가 .htaccess란 파일을 허용하는 지시어라는 것만 알고 넘어가면 될 것 같습니다.

AllowOverride의 더 자세한 정보는 
.htaccess의 더 자세한 정보는 


Require 지시어는 <Directory>에 접근하는 대상을 제한하는지시어입니다.

---Require 지시어 값---

all(모두) granted(권한이 주어짐) : 모든 사람이 접근 가능
all(모두) denied(거부됨) : 모든 사람이 접근 불가
ip [ip주소] : 특정 ip주소만 접근 가능 
host [도메인] : 특정 도메인 호스트만 접근 가능
not ip [ip주소] : 특정 ip 주소는 접근 불가
not host [도메인] : 특정 도메인 호스트는 접근 불가

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

이런 식으로 쓰이며, 만약 다 허용하는데 특정 ip 주소만 거부하고 싶을 경우

<Directory "/var/local/">
Require all granted
Require not ip 10.50.32.43
</Directory>

이런 식으로 먼저 윗 줄에 "Require all granted"를 적어 모두 허용하되, 밑에 "Require not ip 10.50.32.43"을 적어서특정 ip만 거부할 수 있습니다.

이렇듯 순서가 중요하지만, 아까 말했던 것처럼 전체에 대한 정책을 먼저 정해놓고, 일부를 변경하는 느낌만 기억하시면 순서는 자동으로 체화되실 겁니다.

Require의 자세한 정보는


*****/


ix) DocumentRoot 



220~223# Note that from this point forward you must specifically allow particular features to be enabled - so if something's not working as you might expect, make sure that you have specifically enabled it below.(여기서부터 당신은 반드시 구체적으로 특정 특징들이 사용되게 설정해야 합니다. - 그러니 만약 당신이 예상했던 것처럼 작동하지 않는다면, 당신이 이 밑에 구체적으로 설정했는지 확인하시오) 

227~229 # DocumentRoot: The directory out of which you will serve your documents. By default, all requests are taken from this directory, but symbolic links and aliases may be used to point to other locations.(DocumentRoot: 당신의 문서들을 제공하기 위한 디렉토리. 기본적으로, 모든 요청들은 이 디렉토리에서 가져오지만, 심볼릭 링크들이나 별칭들을 이용해 다른 장소들을 가리킬 수 있다.) 

DocumentRoot"/usr/local/apache/htdocs"


/*****


DocumentRoot는 이름 그대로 문서(Document)들이 있는 핵심 위치(Root)를 말하며, 클라이언트가 웹 서버에 접속했을 때 받는 메인 사이트의 html 파일(문서)들을 넣는 장소입니다.

나중에 아파치를 이용해 간단한 웹사이트를 구성할 때, 이 htdocs(hypertext documents)디렉토리에 웹 페이지를 구성하는 html파일들을 넣습니다.

당연히 웹 문서들(html 등등)을 넣는 위치를 바꾸고 싶을 땐, 이 DocumentRoot에 그 바꾼 위치를 적어주면 됩니다.

여기서 중요한 건 DocumentRoot맨 끝에 디렉토리를 나타내는 '/'를 붙이지 않습니다.

예를 들어 만약 웹사이트에서 클라이언트가 "https://my.example.com/1.html"이란 URL로 '1.html' 파일을 요청한다면, 자동으로 우리가 DocumentRoot에 설정한 "/usr/local/apache/htdocs" 내부에 있는 "1.html" 파일을 보냅니다.

만약 여기서 DocumentRoot 지시어 값절대위치가 아닌, 'htdocs'이렇게 해놓으면, 저~~ 위에서 설정한 ServerRoot 지시어에 설정한 "/usr/local/apache"를 붙여서 /usr/local/apache/htdocs 이렇게 해석합니다.

더 자세한 DocumentRoot 지시어 정보는

https://httpd.apache.org/docs/2.4/mod/core.html#documentroot에 있습니다.


*****/


x) <Directory></Directory> 내부 지시어 Options 



<Directory "/usr/local/apache/htdocs">

234~236 # Possible values for the Options directive are "None", "All", or any combination of: Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews(여기서 설정 가능한 Options 지시어 값들은 "None", "All", 또는 Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews들의 조합 입니다.)

238~239 # Note that "MultiViews" must be named *explicitly* --- "Options All" doesn't give it to you.("MultiVeiws" 지시어 이름은 분명하게 적어야 합니다. --- "Options All"로는 이 기능이 제공되지 않습니다.) 

241~243 # The Options directive is both complicated and important.  Please see http://httpd.apache.org/docs/2.4/mod/core.html#options for more information.(Options 지시어는 복잡하면서도 매우 중요합니다. 부디http://httpd.apache.org/docs/2.4/mod/core/mod/core.html#options로 가서 더 많은 정보를 보세요.)

Options Indexes FollowSymLinks

248~250 # AllowOverride controls what directives may be placed in .htaccess files. It can be "All", "None", or any combination of the keywords: AllowOverride FileInfo AuthConfig Limit(AllowOverride는 .htaccess 파일들에 적힌 지시어들을 컨트롤합니다. 이 값은 "All"이나 "None" 또는 AllowOverride FileInfo AuthConfig Limit 키워드의 조합이 될 수 있습니다.)

AllowOverride None

255     # Controls who can get stuff from this server.(서버로부터 뭔가를 받을 수 있는 사람을 컨트롤 합니다.)

Require all granted

</Directory>


/*****

아까 저 위에서 DocumentRoot "/usr/local/apache/htdocs"를 썼었죠? 당연히 이 때 
적은 "/usr/local/apache/htdocs" 디렉토리도 아파치가 인식해야 하므로 <Directory "/usr/local/apache/htdocs"></Directory>를 통해 등록한 겁니다.

저~ 위 쪽에서 이미 <Directory /></Directory>전체 범위에서 거부를 해놨기에, 사용할 디렉토리가 있다면<Directory></Directory>로 추가해야한다라 한 것 기억나시죠?

'AllowOverride''Require' 내부 지시어는 위에서 다뤘지만, 여기서 'Options'이란 지시어가 새로 나오는데요. 

주석에 써 있는데로 이 Options 지시어는 디렉토리에 적용할 옵션을 정하는 내부 지시어입니다.

---Options 지시어 값---

None : 어떠한 옵션도 사용 x

All : MultiViews를 제외한 모든 옵션 사용

Indexes : 위에서 지정한 디렉토리에 'index.html' 처럼 클라에게 보내려 지정한 파일이 없으면, 디렉토리 내부에 있는 모든 파일을 목록화(index)하여 보여주는 옵션
--> 보안을 위해 제거해야 하는 옵션

Includes : SSI(SSI, Server-Side-Includes) 기능을 제공하는 'mod_include'란 모듈을 사용하겠다는 옵션 (SSI란? : https://mamu2830.blogspot.com/2022/03/what-is-SSI.html)

IncludesNOEXEC : Includes NOEXEC(위에 설명한 includes기능인데, exec는 제외)라는 뜻대로, Includes를 하되 위 SSI 예시로 설명한 쉘 스크립트 실행 SSI인 'exec cmd'와 CGI 실행 'exec cgi'는 금지하는 옵션입니다.

FollowSymLinks : Follow(따라가겠다) Symbolic Links(심볼릭 링크들을)이란 뜻대로, 이 디렉토리 내부에 있는 심볼릭(소프트)링크 파일들의 원래 위치를 따란가다는 소리로 그냥 심볼릭링크 사용을 허용한다는 옵션입니다.

SymLinksifOwnerMatch : symlinks(심볼릭 링크들) if OwnerMatch(소유자가 같을 경우에만)이란 뜻대로, 심볼릭 링크 목적지 파일의 소유자(UID)가 같을 경우에만 허용한다는 옵션입니다. 

ExecCGI : Execution(실행) CGI(CGI파일)이란 뜻대로, 이 디렉토리 내에 있는 CGI 파일을 실행할 수 있게 허용하는 옵션입니다.

MultiViews : 이 지시어가 설정된 디렉토리에 없는 파일을 클라가 요청 할 때, 같은 이름의 파일들 중 가장 유사한 파일을 대신 보내는 옵션입니다.

예를 들어, /usr/local/apache/htdocs/boo.html이란 요청이 왔는데, 만약 boo.html이란 파일이 없을 경우 기존에 요청 받은 'boo.*'로 시작하는 파일들을(Multi) 보여주는(views) 겁니다.

이 Options 내부 지시어 값들은 띄어쓰기를 통해 여러 개 사용할 수 있습니다.

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

더 자세한 Options의 설명은


*****/


xi) DirectoryIndex 




261~262 # DirectoryIndex: sets the file that Apache will serve if a directory is requested.(DirectoryIndex : 디렉토리에 대한 요청이 들어올 경우 아파치가 제공할 파일을 설정합니다.)


<IfModule dir_module>

DirectoryIndex index.html

</IfModule>


/*****


DirectoryIndex(디렉토리 인덱스)란 이름대로, 디렉토리에 대한 요청이 들어올 경우 제공할 파일을 설정하는 지시어입니다. 

잠깐! 분명 여기서 '디렉토리 요청이' 뭐지? 하는 분들이 있을겁니다.

예를 들어 "www.mamu.com"이란 서버(웹사이트)가 있을 때, 유저가 "https://www.mamu.com/a" 라고 URL을 치면, 이것은 우리가 위에서 DocumentRoot값을 "/usr/local/apache/htdocs"로 해놓았기에  www.mamu.com 서버의 "/usr/local/apache/htdocs/a"라는 파일을 https 프로토콜로 달라는 의미인데요. 

같은 맥락으로 "https://www.mamu.com/a/" 이것은 파일 끝에 '/'가 붙으면 '디렉토리'라는 의미라 "/usr/local/apache/htdocs/a/"라는 "a디렉토리 정보(a가 디렉토리라고 가정)"를 달라는 의미가 됩니다. 

그리고 디렉토리 정보라는건 디렉토리 내에 있는 파일들을 포함한 정보이기 때문에 보안에 안 좋습니다.

자 그럼 이번엔 우리가 홈페이지라 부르는 "https://www.mamu.com"은 어떤 의미일까요? 

우린 DocumentRoot값을 "/usr/local/apache/htdocs"로 해놓았기에(htdocs는 디렉토리죠), "https://www.mamu.com/"이나 "https://www.mamu.com"이란 URL의 대상은 "/usr/local/apache/htdocs"란 디렉토리가 됩니다.

그런데 여기서 우린 디렉토리 요청이 올 때 대신 보낼 파일을 지정하는 "DirectoryIndex" 지시어 값으로 index.html를 지정했기 때문에!!! "www.mamu.com/(/usr/local/apache/htdocs/)"란 디렉토리 정보 대신 지정한 "index.html"이란 파일을 대신 보내는 겁니다.

이후 아파치 실습을 다룬 포스트에서 볼 내용이지만, 아파치를 처음 시작하면




이렇게 디폴트값으로 It works! 란 문구가 뜨는데요~('127.0.0.1'은 자기 컴퓨터의 IP를 나타내는 IP입니다, 이걸 'Loopback IP'라고도 하며, 127.0.0.1의 도메인 형태는 'localhost' 입니다.)

사실 이건




이렇게 "/usr/local/apache/htdocs/index.html"을'/usr/local/apache/htdocs 디렉토리' 대신 보낸 것이며




실제로 'index.html'의 내부를 보시면"It works!"를 출력하는 아주 간단한 HTML이 써져있는 것을 볼 수 있습니다~

사실 저희 처음 아파치를 설치하고 구동했을 때 홈페이지는index.html이라는 것이죠.

조금 자세하게 말하다보니 길어졌는데, 간단히 표현하자면

DirectoryIndex 지시어란 파일이 아닌 디렉토리 요청이 왔을 때 대신 보낼 파일로, 홈페이지로 보여줄 파일을 지정하는 지시어입니다.


DirectorIndex와 dir_module의 더 자세한 정보는https://httpd.apache.org/docs/2.4/en/mod/mod_dir.html에 있습니다.


*****/


xii) <Files></Files>




269~270 # The following lines prevent .htaccess and .htpasswd files from being viewed by Web clients. (다음에 나오는 줄들은 .htaccess와 .htpasswd 파일들이 웹 클라이언트들에게 읽혀지는 걸 막습니다.)

<Files ".ht*">
Requrie all denied
</Files>


/*****

<Files></Files> 컨테이너 지시어는 <Directory></Directory>와 사용법이 비슷합니다.
다른 점이라고 한다면, 이름처럼 <Files></Files>는 디렉토리가 아닌 파일들을 대상으로 httpd.conf의 규칙을 적용하는 것이죠.

아파치가 사용하는 디렉토리들은 httpd.conf에 <Directory "사용할 디렉토리"></Directory>형태로 적듯이, 아파치의 모든 경로에서 사용할 특정 파일 이름들은 <Files "사용할 파일"></Files>로 등록해야합니다.

위에 써있는 <Files ".ht*"></Files>란 말 그대로 모든 경로에서 ".ht"로 시작하는 파일들을 대상으로 적용할 정책입니다.

만약 특정 디렉토리 내의 특정 파일만으로 대상을 좁히고 싶으면

<Directory "/var/example">
    <Files ".ht*">
     ~~~~
    </Files>
</Directory>

이렇게 <Directory> 컨테이너 지시어안에 <File> 지시어를 사용하면 됩니다.

이처럼 <Directory></Directory>와 사용법이 비슷하기에 <File>에 쓰는 내부 지시어도 <Directory>와 거의 비슷하며, 똑같이 정규 표현식이나 와일드카드를 쓸 수 있습니다.

그리고 안에 정의한 "Require all denied(<Directory>에서 배웠죠?)"이란 주석에 써있는대로, ".ht"로 시작하는 모든 파일들에 대해서모든 사람(all)의 접근을 거부(denied)하란 의미입니다.

그래서 주석에서 모든 클라이언트들이 .htacess와 .htpasswd 파일에 접근 못하게 한다 라고 써있던 겁니다.


<Files></Files>에 더 자세한 정보는


*****/


xiii) ErrorLog 





277 # ErrorLog: The location of the error log file.(ErrorLog : 에러 로그 파일의 위치)

278~280 # If you do not specify an ErrorLog directive within a <VirtualHost> container, error messages relating to that virtual host will be logged here. (만약 당신이 <VirtualHost>컨테이너 지시어 안에 따로 ErrorLog 지시어를 쓰지 않으면, 그 버츄얼 호스트에 관련된 에러 메세지들은 이곳 지시어에 적힌 장소에 쓰입니다.)   

280~281 # If you *do* define an error logfile for a <VirtualHost> container, that host's errors will be logged there and not here.(만약 당신이 <VirtualHost> 컨테이너 지시어 안에 에러 로그 파일 위치를 *정의한다*면, 그 호스트의 에러들은 <VirtualHost> 안에 정의한 장소에 적힙니다.)


/*****


ErrorLog : 에러 로그라는 말대로, 에러가 발생했을 때 그 기록을 어디에 저장할지를 정의하는 지시어입니다.

절대 위치로 적으면그 절대 위치 파일에 적으며, 위 예시인 "logs/error_log"처럼 상대 위치로 적을 경우엔 저~ 위에서 적은 ServerRoot 지시어에 적은 장소를 기준으로 위치를 정합니다.  

더 자세한 ErrorLog 지시어에 대한 정보는

https://httpd.apache.org/docs/2.4/mod/core.html#errorlog에 있습니다.


*****/ 


xiv) LogLevel 





286 # LogLevel: Control the number of messages logged to the error_log.(LogLevel : error_log 파일에 적히는 많은 메세지들을 컨트롤 합니다.)

287~288 # Possible values include: debug, info, notice, warn, error, crit, alert, emerg.(사용가능한 값들 : debug, info, notice, warn, error, crit, alert, emerg)

LogLevel : warn


/***** 


LogLevel : 기록의 수준이라는 이름대로, 에러 로그를 기록할 때얼마나 자세하게 적을 것인지를 결정하는 지시어입니다.

--로그 레벨의 수준--

emerg : (설명 수준 예시)자식 프로세스는 잠긴 파일을 열 수 없음, 종료 중 

alert : (설명 수준 예시)getpwuid : UID로부터 사용자 이름을 확인할 수 없음

crit : (설명 수준 예시)Socket : 소켓을 얻는데 실패했습니다. 자식 프로세스 종료 중

error : (설명 수준 예시)스크립트의 헤더가 조기 종료됨

warn : (설명 수준 예시)자식 프로세스 1234가 종료되지 않아, 다른 SIGHUP 시그널을 보내는 중

notice : (설명 수준 예시)SIGBUS를 받아, 코어를 덤프하려는 중...

info : (설명 수준 예시)서버가 바쁜 것 같습니다. (당신이 StartServer나 Min/MaxSpareServers를 늘려야할 수도 있습니다.)

debug : (설명 수준 예시)설정 파일 ???을 여는중... 

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


순이고. 아래(debug쪽)로 갈수록설명의 상세도가 높아지며, 특정 레벨을 고르면그 위에 있는 레벨 수준의 설명도 같이 적힙니다.

ex) LogLevel : error 

이 경우엔 error와 error 위에 있는emerg, alert, crit에 해당하는 수준의 에러 설명이 모두 적히는 겁니다.

아무래도 설명이 자세할수록 에러 로그 파일 크기가 너무 빨리 커지기 때문에, 아파치 문서에서는 'crit'을 쓰길 추천합니다. 

LogLevel의 자세한 정보는

https://httpd.apache.org/docs/2.4/mod/core.html#loglevel에 있습니다.


*****/ 


xv) LogFormat, CustomLog 





292 <IfModule log_config_module>

294~295     # The following directives define some format nicknames for use with a CustomLog directive (see below).(다음에 오는 지시어들은 CustomLog 지시어에 사용할 이름 형식을 정의합니다.)

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

298     LogFormat "%h %l %u %t \"%r\" %>s %b" common

300     <IfModule logio_module>

301       # You need to enable mod_logio.c to use %I and %O( %I와 %O를 사용하기 위해선 mod_logio.c를 사용해야 합니다.)

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

303     </IfModule>

306     # The location and format of the access logfile (Common Logfile Format).(access 로그 파일의 형식과 위치(Common 로그 파일 포맷))

307~8  # If you do not define any access logfiles within a <VirtualHost> container, they will be logged here. (만약 당신이 <VirtualHost> 컨테이너 안에 어떠한 access 로그 파일도 정의하지 않았으면, 그것들은 여기에 적힙니다.)

309~310 # Contrariwise, if you *do* define per-<VirtualHost> access logfiles, transactions will be logged therein and *not* in this file.(반대로 만약 당신이 <VirtualHost>마다 access 로그 파일들을 *정의했다*면 그 과정들은 그곳에 적히고, 여기 파일에 *적히지 않습니다*)

312     CustomLog "logs/access_log" common

315~316     # If you prefer a logfile with access, agent, and referer information(Combined Logfile Format) you can use the following directive.(만약 당신이 access, agent, referer 들의 정보들도 같이 로그 파일에 쓰이길 선호한다면, 다음에 오는 지시어를 써도 됩니다.)

318     #CustomLog "logs/access_log" combined
319 </IfModule>


/*****


먼저 LogFormatCustomLog 지시어는 묶음 세트입니다. 둘 다 클라이언트가 아파치 서버에 접근하며 요청(request)한 정보를 적는'access_log' 파일에 대한 설정을 하는 지시어입니다.

먼저 위에 써 있는 LogFormat 지시어는 CustomLog지정된 파일에 기록할 클라이언트 요청 정보 형식을 지정하는 곳입니다.

위 예시를 보시면

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

이렇게 써 있는데요.

이건 %h(host 이름) %l(identd로부터 받은 원격 log 이름) %u(사용자 인증에 사용된 user명) %t(요청을 받은 time) %r(요청의 첫 번째 줄) %>s(request의 마지막 상태) %b(HTTP헤더를 제외한 request의 크기를 CLF 형식으로 보여줌) %{Referer}i(참고할 것, HTTP 헤더에 있는 요청을 한 이전 웹 주소%{User-Agent}i(유저 대리인, HTTP 헤더에 있는 서버에 접속할 때 사용한 브라우저나 운영체제의 정보) 형식을 combined라는 닉네임에 저장한다

라는 뜻입니다.

맨 뒤에는 'nickname' 이라 해서, 변수 마냥앞에 지정한 형식을 저장할 이름을 붙여주면 됩니다. 여기선 'combined'닉네임인 것이죠.

변수 마냥 앞에서 설정한 형식들은닉네임에 저장되며, 이후 이 닉네임을 access_log파일을 지정하는 CustomLog 맨 뒤에 붙여주면 적용이 되는 겁니다.

ex) 

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

CustomLog logs/access_log2 combined

--->LogFormat으로 만든 combined라는 형식을 /usr/local/apache/logs/access_log2에 적용한다

이렇듯 LogFormat 맨 뒤에 적는 영어는 변수와 같은 닉네임이기 때문에 

LogFormat "%h %l %u %t \"%r\" %>s %b" common

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

이것도 그냥 common, combinedio라는 닉네임에 따로 저장해둔 형식들입니다.

CustomLogaccess_log 파일을 지정하는 지시어인데, 다른 모든 지시어가 그렇듯 절대 경로가 아닌 상대 경로로 쓰면 httpd.conf 초반에 설정한 'ServerRoot' 지시어 값이 앞에 붙습니다.

그리고 아파치가 C언어로 만들어져서 그런가, 여기서도 ""안에 또 다른 ""를 붙이고 싶을 땐 '\(escape)'를 붙여서 써주면 됩니다. 

위 예시에선 \"%r\"\"%{User-Agent}i\"가 ""안에 "를 쓰기 위한 예시라고 볼 수 있죠.

이러한 httpd.conf에 적혀있는LogFormat의 형식 종류를 다시 정리하자면

웹 서버에 접근(access)한 기록이 남는 아주 중요한 로그 파일을 지정하는 지시어입니다.


-----LogFormat 형식-----


%h(host): 호스트 이름

 %l(log name): identd로부터 받은 원격 log 이름, ident이란 TCP를 이용한 연결된 유저를 확인(identification)하게 도와주는 프로토콜로, 이 ident를 사용하는 가장 유명한 프로그램(데몬)이 identd입니다.

 %u(user): 사용자 인증에 사용된 user명

 %t(time): 요청을 받은 time

 %r(request): 요청의 첫 번째 줄

 %>s(status): request의 마지막 상태

 %b(bytes): HTTP헤더를 제외한 request의 크기를 CLF 형식으로 보여줌

 %{Referer}i: 참고할 것, HTTP 헤더에 있는 요청을 한 이전 웹 주소

 %{User-Agent}i: 유저 대리인, HTTP 헤더에 있는서버에 접속할 때 사용한 브라우저나 운영체제의 정보

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

입니다.

더 자세한 LogFormat과 CustomLog의 정보는

https://httpd.apache.org/docs/current/en/mod/mod_log_config.html

https://httpd.apache.org/docs/2.4/en/logs.html

에 있습니다.


*****/


xvi) Redirect, Alias, ScriptAlias 




321 <IfModule alias_module>

323~325 # Redirect: Allows you to tell clients about documents that used to exist in your server's namespace, but do not anymore. The client will make a new request for the document at its new location.(Redirect: 서버 이름 공간(URL) 위치에 문서가 없을 경우, 없다고 클라이언트에게 말할 수 있게 해준다. 클라이언트는 그러면 새 위치에 있는 문서를 요청을 한다.)

326~327 # Example: Redirect permanent /foo http://www.example.com/bar

330~331 # Alias: Maps web paths into filesystem paths and is used to access content that does not live under the DocumentRoot.(Alias: 웹 경로를 파일시스템 경로와 연결해주고, DocumentRoot 아래에 있지 않은 컨텐츠에 접근할 수 있게 할 때 사용된다.)

332~333 # Example: Alias /webpath /full/filesystem/path

335~338 # If you include a trailing / on /webpath then the server will require it to be present in the URL.  You will also likely need to provide a <Directory> section to allow access to the filesystem path.(만약 당신이 '/'를 '/webpath' 끝에 포함시키면, 서버는 URL 안에서도 끝에 '/'가 있길 요구합니다. 또한 파일시스템에 대한 접근을 허용하기 위해 <Directory> 섹션을 제공해야 할 수도 있습니다.)

341     # ScriptAlias: This controls which directories contain server scripts.(ScriptAlias: 이것은 어떤 디렉토리들이 서버 스크립트를 갖고 있는지 제어합니다.) 

342~344  # ScriptAliases are essentially the same as Aliases, except that documents in the target directory are treated as applications and run by the server when requested rather than as documents sent to the client. (ScriptAliase들은 목표 디렉토리 내에 있는 문서들이 어플리케이션처럼 대해지고, 요청이 올 때 클라이언트들에게 전송되기보다 서버에서 실행된다는 점을 제외하곤 Aliases와 똑같습니다.) 

345~346  # The same rules about trailing "/" apply to ScriptAlias directives as to Alias.(ScriptAlias 지시어 값 뒤에 "/"를 붙이는 것에 대한 규칙은 Alias와 같게 적용됩니다.)

348     ScriptAlias /cgi-bin/ "/usr/local/apache/cgi-bin/"

350 </IfModule>


/*****


Redirect 지시어는 이름대로 오래된 URL에 클라가 접근할 때새 URL로 리다이렉트 해주는 지시어 입니다.

형식은 

Redirect [옵션] [/로 시작하는 old 경로] [/로 시작하는 new 경로]

ex) 

Redirect "/service" "/service2" 

---> 

"https://host1.example.com/service"로 시작하는 모든 요청은 "https://host1.example.com/service2"로 처리해라 인데, 예시를 들자면 https://host1.example.com/service/test.txt 이란 신호가 들어오면, https://host1.example.com/service2/test.txt로 처리하는 식으로 아예 디렉토리 위치를 바꿔버리는 것이죠. (GET의 매개변수도 포함)

만약 다른 호스트나 사이트로 리다이렉션하고 싶으면

Redirect "/service" "https://host2.example.com/service"이렇게 할 경우,

(현재 아파치 서버가 host1.example.com라고 가정할 때)

https://host1.example.com/service/test.txt의 요청이 올 때 다른 서버https://host2.example.com/service/test.txt로 리다이렉션할 수 있습니다.

Redirect 지시어엔상대경로를 못 쓴다는 점을 기억하시면 될 것 같습니다.

옵션은 말 그대로 써도 되고 안 써도 되는 것으로

-----옵션값-----


permanent : 영구적이라는 의미대로, 기존 URL에 있던 자료가 영구히 삭제됨(다른 위치로 영구히 변경됨)을 알려주는 301 상태를 보냅니다.

temp : 임시라는 temporary의 약자대로, 일시적인 현상임을 나타내는 302를 보냅니다.(디폴트 값)

seeother : 다른 곳을 보라는 의미대로, 다른 곳에 이동됐으니 GET 메소드로 얻으라 알려주는 303 상태를 보냅니다.

gone : 기존 URL이 영구히 삭제됨을 알려주는 410 상태을 보냄


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

더 자세한 redirect의 정보는https://httpd.apache.org/docs/2.4/en/mod/mod_alias.html#redirect에 있습니다.


alias 지시어는 기존 리눅스에서 "ls -l" 를 "ll"로 바꾸듯 사용한 별칭을 만드는 역할 지시어입니다.  

주로 맨 위에서 DocumentRoot 지시어 경로가 아닌다른 경로에 저장돼 있는 문서를 제공할 때 사용합니다.

ex)

Alias "/image" "/ftp/pub/image" 

---> 우린 저 위에서 DocumentRoot를 "/usr/local/apache/htdocs"로 했었기에 "https://host1.example.com/image/test.html"은원래라면"/usr/local/apache/htdocs/image/test.html"을 https로 달라는 요청입니다

하지만 위에서 우리는 alias를 이용해 "/image"를 "/ftp/pub/image"로 바꿨기에 "https://host1.example.com/image/test.html"이란 요청은

 "/ftp/pub/image/test.html"를 https로 달라는 요청으로 바뀌는겁니다.

하지만 이 경우 당연히 아파치에서 특정 디렉토리를 사용하게 만드는 것이므로, 추가적인 

<Directory "/ftp/pub/image"></Directory> 컨테이너 지시어를 만들어줘야합니다.

그리고 다른 지시어처럼 Alias 지시어 값의 끝에 '/'를 붙이면, URL에서도 끝에 '/'를 붙여야합니다.


더 자세한 alias 정보는 https://httpd.apache.org/docs/2.4/en/mod/mod_alias.html#alias에 있습니다.


ScriptAlias 지시어는 URL을 파일시스템에 연결해주고, 대상이 CGI 스크립트라는 것을 공식적으로 지정하는 지시어입니다.

Alias는 모든 디렉토리를 대상으로 한다는 것에 비해 'ScriptAlias'는 'mod_cgi'모듈의 'cgi-script handler'에 의해 처리되며, CGI 스크립트가 들어있는 디렉토리만을 대상으로 한다는 것에서 Alias랑 약간 다릅니다. 

그리고 Alias랑 거의 비슷하므로, ScriptAlias를 사용할 때도 당연히 <Directory></Directory> 컨테이너 지시어를 추가해줘야합니다.

더 자세한 ScriptAlias 지시어에 대한 설명은

https://httpd.apache.org/docs/2.4/en/mod/mod_alias.html#scriptalias에 있습니다.


*****/


xvii) ScriptSock, RequestHeader 





352 <IfModule cgid_module>

354~355 # ScriptSock: On threaded servers, designate the path to the UNIX socket used to communicate with the CGI daemon of mod_cgid.(ScriptSock: 쓰레드 서버들에서 mod_cgid의 CGI 데몬과 통신하기 위해 사용되는 UNIX 소켓의 경로를 지정합니다.)

357     #Scriptsock cgisock

358 </IfModule>

361~362 # "/usr/local/apache/cgi-bin" should be changed to whatever your ScriptAliased CGI directory exists, if you have that configured.(만약 당신이 ScriptAlias로 지정된 CGI 디렉토리를 가지고 있다면, "/usr/local/apache/cig-bin"은 바꾸는게 좋다)

364 <Directory "/usr/local/apache/cgi-bin">

365     AllowOverride None

366     Options None

367     Require all granted

368 </Directory>


370 <IfModule headers_module>

372~373 # Avoid passing HTTP_PROXY environment to CGI's on this or any proxied backend servers which have lingering "httpoxy" defects.(HTTP_PROXY 환경이, 현재 서버의 CGI 환경이나 오래가는 "httpoxy" 결점들을 가진 프록시화된 백엔드 서버들을 통과하는 것을 막는다.) 

374 # 'Proxy' request header is undefined by the IETF, not listed by IANA('Proxy' 요청 헤더는 IETF에서 정의되지 않았으며, IANA에 의해서 나열되지도 않습니다.)

376     RequestHeader unset Proxy early

377 </IfModule>





/*****


ScriptSock은 이름 그대로 소켓 역할인 스크립트접두사 이름을 지정하는 지시어입니다.
그리고 확장자에는 서버의 프로세스 ID가 추가된다고 합니다.

이 때 소켓은 아파치를 실행시킨 유저의 권한으로 실행됩니다.

<Directory "/usr/local/apache/cgi-bin">위에서 우리가
ScriptAlias /cig-bin/ "/usr/local/apache/cig-bin/" 지시어를 적었기에
추가해준 겁니다.

더 자세한 ScriptSock의 정보는

RequestHeader는 이름 그대로 클라이언트가 서버에게 요청(Request)HTTP의 헤더에 대한 설정을 하는 지시어입니다.

리눅스마스터 1급 시험에선 나올진 애매하지만, 웹 백엔드에선 HTTP의 헤더를 변경할 수 있는 중요한 지시어입니다. 

httpd.conf 주석에는 안 써있지만 Header 라는 지시어도 있는데요, 이 Header는 RequestHeader와 반대로 서버가 클라에게 보내는response의 헤더에 대한 설정을 하는 지시어입니다. 

Header 지시어는 request가 아닌response에 대한 헤더 설정이라는 점만 다르기에, RequestHeader 지시어와 사용법이 거의 같습니다.


이 RequestHeader 지시어를 통해서 HTTP 요청 헤더들을 대체하거나, 합치거나, 바꾸거나, 제거할 수 있습니다.  

RequestHeader [add|append|deit|merge|set|...][앞 옵션에 맞는 값]

이런 느낌으로 옵션이 뭐냐에 따라 당연히 뒤에 오는 값들도 달라지는데요, 그냥 문맥에 맞춰서 필요한 값을 주면 됩니다. 

문맥에 맞춰 주라니 조금 아리송 하실텐데요~ 밑에 각 옵션들에 대한 설명을 보시면 이해가 되실겁니다.

옵션에 맞는 값(value)에는 문자열이나 아파치 형식 지정자가 쓰일 수 있으며, 값에 공백이 있을 경우엔반드시 ""로 감싸야합니다.

또한 헤더에 넣을 값 같은 경우엔 안 써도 됩니다. 대신 이런 경우 헤더만 만들고 내용물 없이 보내겠죠.

---RequestHeader의 옵션 값들---

ReqeustHeader add [추가할 헤더 이름] [헤더에 넣을 값]: 더한다는 이름대로 기존에 같은 이름의 헤더가 있어도 같은 이름의 헤더를 또 추가한다. 예측 불가능한 결과를 초래할 수 있으므로 보통 set이나 append, merge를 쓰길 권고된다.

RequestHeader append [추가할 헤더 이름] [헤더에 넣을 값]: 헤더를 추가하되, 만약 같은 이름의 헤더가 있으면 기존 헤더 안에 ',(콤마)'를 통해 값을 분리해 넣는다. 이것이 헤더에 여러개의 값을 주는 표준 방식이다.

RequestHeader set [추가할 헤더 이름] [헤더에 넣을 값]: 헤더를 추가하되, 만약 같은 이름의 헤더가 있으면 대체함

RequestHeader unset [제거할 헤더이름] : 적은 헤더를 제거합니다. 

RequestHeader edit [편집할 헤더 이름] [헤더 내 값 or 정규표현식] [대체값] : 헤더에 들어있는 값이나 정규표현식에 맞는 값을 대체값으로 변경한다. 

RequestHeader setifempty [추가할 헤더 이름] [헤더에 넣을 값] : set if empty라는 말대로, 같은 이름의 헤더가 없을 때만 헤더를 추가합니다.

-맨 뒤에 추가할 수 있는 옵션-

late : 원래 'Header'나 'RequestHeader'는 'late'가 기본 값으로 보통은 생략돼 있습니다. late가 설정된 지시어는 콘텐츠 생성기가 실행되기 직전에 설정된 경우 적용이 안되며, Response 헤더인 경우엔 회선으로 보내졌을 때랑 같습니다. 그리고 작동 중인 서버에선 항상 'late'를 사용합니다.

early : 개발자의 테스트/디버깅 도구로 만들어진 옵션으로, early 키워드가 붙은 지시어는 Request의 처리가 시작될 때 즉시 적용됩니다. 그렇기 때문에 다른 Request를 시뮬레이션 하거나 테스트 상황을 만들 때 사용할 수 있습니다. 그 대신 Response가 만들어지기 전 언제든 지 다른 모듈들에 의해 헤더가 변경될 수 있습니다. 
그리고 early인 경우 Request의 경로 설정이 통과되기 전에 처리되므로(Request 경로와 상관이 없음),  <Directory>나 <Location> 컨테이너 지시어에 사용될 수 없습니다. 
   
expr=[정규표현식] : 정규표현식의 결과가 True일 때만 지시어가 실행되게 한다.


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

---헤더 값에 쓸 수 있는 형식지정자---

%% : '%' 문자

%t(time) : 요청이 수신된 마이크로초 단위 시간을 t='값' 형태로 보여줌

%D : 요청을 받은 시간부터 회선으로 전송하기까지의 마이크로초 단위 시간을, D='값' 형태로 보여줌

%l(load average) : 현재 서버의 부하 평균을 l='값' 형태로 보여주며, 추가로 5분, 15분 평균치도 보여준다

%i(idle percentage) :  httpd의 현재 이용 가능한 유후 상태의 프로세스와 쓰레드를 0~100 사이에서 i='값' 형태로 보여준다 

%b(busy percentage) : httpd의 현재 이용 가능한 사용 중인 프로세스와 쓰레드의 상태를 0~100사이에서 b='값' 형태로 보여준다

%[변수이름]e(environment) : 변수 이름의 환경 변수 값을 보여줌

%[변수이름]s(ssl) : 만약 mod_ssl이 이용 가능할 시, 변수 이름의 SSL 환경 변수 값을 보여줌
 

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

참고로 httpd.conf에 기본적으로 있는 "RequestHeader unset Proxy early"는 보안취약점인 'httpoxy'를 막기 위해 http의 Proxy 헤더를 없애는 설정입니다.

더 자세한 RequestHeader의 정보는
에 있습니다.


*****/


xviii) TypesConfig, AddType, AddEncoding 




<IfModule mime_module>

381~382 # TypesConfig points to the file containing the list of mappings from filename extension to MIME-type.(TypesConfig는 파일의 확장자와 MIME-type을 연결해주는 리스트가 적힌 파일을 지정합니다.)

a) MIME이란

MIME(Multipurpose Internal Mail Extensions, 다양한 형태의 디지털 데이터{문자 뿐만이 아니라 사진, 영상 등등}를 전자 우편으로 교환할 수 있게 해주는 프로토콜)  

384     TypesConfig conf/mime.types

387~388 # AddType allows you to add to or override the MIME configuration file specified in TypesConfig for specific file types.(AddType은 특정 파일 종류를 TypesConfig에 설정된 MIME 설정 파일에 추가하거나 덮어쓸 수 있게 해준다.) 

390     #AddType application/x-gzip .tgz

392~393     # AddEncoding allows you to have certain browsers uncompress information on the fly. Note: Not all browsers support this.(AddEncoding은 특정 브라우저가 즉시 압축해제를 할 수 있게 해준다. 주의: 모든 브라우저가 이걸 지원하진 않는다)

395     #AddEncoding x-compress .Z

396     #AddEncoding x-gzip .gz .tgz

398~399 # If the AddEncoding directives above are commented-out, then you probably should define those extensions to indicate media types:(만약 위에 있는 AddEncoding 지시어가 주석화 돼 있다면, 당신은 그 지시어의 확장자들이 밑에 있는 특정 미디어 유형들을 가리키게 정의해야 한다.)

401     AddType application/x-compress .Z

402     AddType application/x-gzip .gz .tgz

403         AddType application/x-httpd-php .php .htm .html .inc .php5

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

</IfModule>


/*****


TypesConfig 지시어는 말 그대로 여러 종류(Types)가 적힌 설정 파일인mime.types 파일을 지정하는 지시어입니다. 

더 자세한 TypesConfig의 정보는 https://httpd.apache.org/docs/2.4/en/mod/mod_mime.html#typesconfig에 있습니다.

AddType시어는 적은 파일 확장자와 특정 컨텐츠를 연결해주는 지시어입니다. AddType에 적은 내용은 mime.types 내용보다 우선이 되니, mime.types를 직접 변경하지 않고AddType을 사용하길 아파치 문서에선 권고하고 있습니다.

형식은

AddType [미디어 유형] [파일 확장자...]

입니다. 

파일 확장자는 띄어쓰기를 통해 여러 개 추가할 수 있습니다.

제 아파치 설치 포스트를 통해 php 연동을 하셨던 분들이면 바로 403번 줄과 404번 줄에 AddType을 적어 php를 연동했던 것이 기억나실 겁니다 ㅎㅎ

더 자세한 AddType의 정보는 https://httpd.apache.org/docs/2.4/en/mod/mod_mime.html#addtype 에 있습니다.

AddEncoding 지시어는 특정 HTTP 인코딩된 컨텐츠와 특정 파일 확장자를 연결해주는 지시어입니다. 인코딩 파일 범주에 압축 파일이 속하므로, 인코딩 파일을 브라우저가 인식할 수 있게 된다는 것브라우저가 바로 압축 해제(디코딩)을 할 수 있다는 겁니다.(물론 기능을 지원하는 특정 브라우저에서만) 

형식은 

AddEncoding [인코딩 형식] [파일 확장자....]

으로 똑같이 띄어쓰기를 통해 여러 파일 확장자를 추가할 수 있습니다. 

더 자세한 AddEncoding 정보는

https://httpd.apache.org/docs/2.4/en/mod/mod_mime.html#addencoding에 있습니다.


*****/


xix) AddHandler, AddOutputFilter, MIMEMagicFile, ErrorDocument 




406~407 # AddHandler allows you to map certain file extensions to "handlers": actions unrelated to filetype. (AddHandler는 특정 파일의 확장자들을 "handlers"와 연결해줍니다:파일 타입과 관계없는 것들도)

408 # These can be either built into the server or added with the Action directive (see below) (이것들은 서버 내부에서 만들어지거나, Action 지시어와 함께 추가됩니다. 밑을 보시오)

410~411 # To use CGI scripts outside of ScriptAliased directories: (You will also need to add "ExecCGI" to the "Options" directive.) (ScriptAliased 디렉토리 외부에 있는 CGI 스크립트들을 사용하기 위한 것: 당신은 따로 Options 지시어에 ExecCGI를 추가해야 합니다.) 

413     #AddHandler cgi-script .cgi

415~416  # For type maps (negotiated resources): (type map들을 위한 것, 협상된 자원들:)

416     #AddHandler type-map var

419     # Filters allow you to process content before it is sent to the client.(내용들을 클라이언트에게 보내기 전 처리하기 위한 필터들)

420     #

421~422 # To parse .shtml files for server-side includes (SSI): (You will also need to add "Includes" to the "Options" directive.) (SSI를 위한 .shtml을 해석하기 위한 것, 당신은 "Options"지시어에 "Includes"를 추가해야 합니다.)

424     #AddType text/html .shtml

425     #AddOutputFilter INCLUDES .shtml

426 </IfModule>

429~430 # The mod_mime_magic module allows the server to use various hints from the contents of the file itself to determine its type. (mod_mime_magic 모듈은 서버가 파일 내용에서 나온 다양한 힌트들을 이용해 파일 형식을 결정하게 해줍니다.)

431 # The MIMEMagicFile directive tells the module where the hint definitions are located.(MIMEMagicFile 지시어는 힌트 정의가 위치한 곳을 모듈에게 알려줍니다.)

433 #MIMEMagicFile conf/magic

436 # Customizable error responses come in three flavors:(3가지 특징 중 하나로 올 수 있는 커스텀마이징 가능한 에러 response들) 

437 # 1) plain text 2) local redirects 3) external redirects(1. 평범한 글 2. 서버 내부에서 리다이렉트 3. 외부로 리다이렉트)

439 # Some examples:(몇몇 예시들:)

440 #ErrorDocument 500 "The server made a boo boo."

441 #ErrorDocument 404 /missing.html

442 #ErrorDocument 404 "/cgi-bin/missing_handler.pl"

443 #ErrorDocument 402 http://www.example.com/subscription_info.html


/*****

AddHandler 지시어는 말 그대로 특정 확장자를 Handler(아파치 내에서 수행할 작업)에 추가하는 지시어 입니다.

위 예시에서 나온 "AddHandler cgi-script .cgi" 인 경우, 확장자가 .cgi인 모든 파일을CGI로 처리하게 만든다는 겁니다. 

형식은

AddHandler [아파치 핸들러] [확장자]

입니다.

-아파치 핸들러 종류-

default-handler : 정적 내용을 처리할 때 사용하는 디폴트 핸들러를 사용해 파일을 보낸다

send-as-is : HTTP 헤더가 있는 파일을 그대로(as-is) 보낸다

cgi-script : 파일을 CGI 스크립트로 처리한다

imap-files : imagemap 규칙 파일처럼 분석한다

server-info : 서버의 설정 정보를 가져온다

server-status : 서버의 상태 보고서를 가져온다

type-map : 콘텐츠 협상을 위한 type-map 파일처럼 분석한다

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

더 자세한 AddHandler의 정보는

https://httpd.apache.org/docs/2.4/mod/mod_mime.html#addhandler

https://httpd.apache.org/docs/2.4/en/handler.html

https://httpd.apache.org/docs/2.4/mod/mod_negotiation.html에 있습니다.


AddOutputFilter 지시어는 클라이언트에게 보내기 전 서버에서 처리하는Output 필터와 특정 파일 확장자를 연결합니다.

위 예시인 " AddOutputFilter INCLUDES .shtml"는 SSI를 위한 필터 INCLUDES.shtml 확장자를 추가한 겁니다.




더 자세한 AddOutputFilter 정보는https://httpd.apache.org/docs/2.4/mod/mod_mime.html#addoutputfilter

https://httpd.apache.org/docs/2.4/en/filter.html에 있습니다.


MIMEMagicFile는 내용물의 특정 바이트를 보고 파일의 타입을 정하게 해주는mod_mime_magic 모듈을, 지정한 magic 파일을 이용해 사용하는 지시어입니다.

"MIMEMagicFile conf/magic" 는 말 그대로 /usr/local/apache/conf/magic 파일을 이용해 mod_mime_magic 모듈을 사용하겠다는 것이죠.

더 자세한 MIMEMagicFile의 정보는https://httpd.apache.org/docs/2.4/en/mod/mod_mime_magic.html#mimemagicfile에 있습니다.


ErrorDocument는 특정 서버 에러 코드가 발생 했을 때 보낼문자열이나 파일을 지정하는 지시어입니다.

ErrorDocument [에러 코드] [할 행위]

이런 형식이며, 

여기서 할 행위에는

ErrorDocument 500 https://example.com/cgi-bin/server-error.cgi 이렇게 URL 형태도 되고

ErrorDocument 404 /errors/bad_urls.php 이렇게 특정 파일을 지정해도 됩니다. 이 때 '/'는 DocumentRoot에 지정한 /usr/local/apache/입니다.

ErrorDocument 403 "You cant access" 이렇게 보낼 문자열을 지정해도 됩니다.

물론 이런 ErrorDocument 지시어는 나중에 배울 "httpd-multilang-errordoc.conf"에 주로 적습니다.

https://httpd.apache.org/docs/2.4/en/mod/core.html#errordocument


*****/


xx) MaxRanges, EnableMMAP, EnableSendfile 




447~449 # MaxRanges: Maximum number of Ranges in a request before returning the entire resource, or one of the special values 'default', 'none' or 'unlimited'.(MaxRange: 전체 자원을 반환하기 전 요청 최대 범위 값 또는 특별한 값인 'default', 'none', 'unlimited'중 하나) 

450 # Default setting is to accept 200 Ranges.(디폴트 세팅은 200 범위를 받습니다.)

451 #MaxRanges unlimited

454~455 # EnableMMAP and EnableSendfile: On systems that support it, memory-mapping or the sendfile syscall may be used to deliver files.(EnableMMap이랑 EnableSendfile: 이것을 지원하는 시스템에서, 메모리 매핑 또는 sendfile 시스템 콜을 파일을 보낼 때 사용한다.)

456~459 # This usually improves server performance, but must be turned off when serving from networked-mounted filesystems or if support for these functions is otherwise broken on your system.(이건 보통 서버의 수행력을 높이지만, 네트워크를 이용해 마운트된 파일시스템이거나, 시스템에서 이런 기능들이 고장난 경우엔 반드시 꺼야한다)

460 # Defaults: EnableMMAP On, EnableSendfile Off

462 #EnableMMAP off

463 #EnableSendfile on


/*****

MaxRanges파일의 특정 범위 데이터만 보내 달라할 때 쓰는 HTTP 헤더 'Range'의 크기를 제한하는 지시어입니다.

서버에서 이 지시어에 정한 범위 이상을 클라이언트가 요청하면, 그냥 파일 전체를 보냅니다.

원래 'Range' 헤더는 클라이언트가 서버에 특정 파일을 달라고 'request'를 보낼 때, 파일의 특정 범위(range)만 보내 달라 정할 수 있는 헤더입니다.

우리가 동영상을 볼 때, 보던 동영상의 시간을 앞으로 다시 되감기가 가능했던 것도 이 'Range' 헤더를 이용한 것이라고 합니다.

MaxRanges의 형태는

MaxRanges [숫자|default|none|unlimited|number-of-ranges]

이며

--MaxRange 값--

default : 컴파일 시간 200으로 범위를 제한

none : Range 헤더 무시

unlimited : 서버가 범위를 제한하지 않음

number-of-ranges : 서버가 만족 가능한 최대 범위 양수

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

더 자세한 MaxRanges의 정보는 https://httpd.apache.org/docs/2.4/en/mod/core.html#maxranges에 있습니다.


EnableMMAP는 Enable(가능하게 하다) MMAP(Memory MAPping)이란 뜻대로, httpd가 전송 중인 파일의 내용을 읽어야 할 경우메모리 매핑을 사용할 것인지 아닌지 정하는 지시어입니다.

메모리 매핑(memory mapping)은 말 그대로 프로세스의 가상 메모리(memory)에 특정 파일 데이터를 연결(mapping)하는 것을 말합니다.

이러한 메모리 매핑을 사용하는 건 성능 향상이 있을 수 있지만, 몇몇 운영체제에선 문제가 발생할 수 있기에 보통은 꺼놓는 것이 좋다고 합니다.

더 자세한 EnableMMAP 지시어 정보는https://httpd.apache.org/docs/2.4/en/mod/core.html#enablemmap에 있습니다.


EnableSendfilehttpd가 파일의 내용을 전송할 때커널이 지원하는 sendfile() 시스템 콜의 도움을 받을지 말지를 정하는 지시어입니다.

EnableSendfile 지시어인 경우 일부 시스템이나 파일시스템에서 이러한 문제가 발생할 수 있기에 끄는것이 좋다고 합니다.

* 빌드 시스템이 탐지 못하는 sendfile()를 일부 플랫폼이 지원 중단할 수 있다.  특히 다른 박스(디렉토리?)에서 빌드되고 sendfile()를 지원하지 않는 시스템으로 이동 된 경우

* 리눅스에서 sendfile()를 사용하는 것은, IPv6에서 특정 네트워크 카드의 TCP 체크섬 오프로딩 버그를 일으킬 수 있다.

* Itanium CPU를 쓰는 리눅스의 sendfile()은 2GB를 넘는 크기 파일을 보낼 수 없다

* 네트워크를 이용해 마운트된 DocumentRoot(예시 : NFS, SMB, CIFS, FUSE)를 사용시,  커널이 자체 캐시를 통해 네트워크 파일을 제공하지 못할 수 있다. 

그리고 위에서 말한 문제들에 취약하지 않은 서버라면EnableSendfile 지시어를 on 해도 된다고 하네요. 

그리고 네트워크를 이용한 마운트된 파일들에서 발생할 수 있는 문제들은

<Directory "/nfs로 연결된 디렉토리">

EnableSendfile off

</Directory>

이렇게 디렉토리 별로 EnableSendfile off 지시어를 추가해 막을 수 있다고 합니다.

하지만 <Directory> 지시어 또는 .htaccess에 설정한 EnableSendfile 지시어는 "mod_cache_disk" 모듈의 지원을 받지 않다고 합니다. 오직 httpd.conf 전체 영역에서 정의한 EnableSendfile 지시어만 지원 받는다고 하네요.

더 자세한 EnableSendfile 지시어에 대한 정보는https://httpd.apache.org/docs/2.4/en/mod/core.html#enablesendfile에 있습니다.


*****/




이렇게 다른 설정 파일들을 제외한 httpd.conf에 있는 주석과 지시어들에 대한 모든 설명이 끝났네요 ㅠㅠ

와.. 진짜 지금까지 쓴 포스트들 중 가장 오래 걸렸네요 ㅠㅠ  httpd.conf 주석 뿐만 아니라, 한글 아파치 문서는 다 옛날것이라 정보가 많이 없어 영어 버전을 전부 해석해가며 썼으며, 진짜 쓰다가 너무 귀찮고 힘들어서 포기하고 싶은 맘만 5번은 든 것 같습니다.

그러나 나 아니면 누가 이런 글을 쓰겠냐라는 마음으로 하루 6시간, 총 8일 동안 투자해서 결국 다 썼네요..

정~~~~~말 눈물 콧물 다 투자해 힘들게 쓴 포스트인 만큼 이 글을 읽는 사람들에게 꼭 도움이 되길 바랍니다.

도움이 되셨다면따뜻한 댓글 및 팔로우 클릭은 저에게 큰 힘이 돼 포스트 퀄리티 향상에 도움을 줍니다!!

그럼 다음엔 본격적으로 httpd.conf 설정을 통해 기본적인 웹 사이트를 구축해보겠습니다.


댓글 없음:

댓글 쓰기

#1 여러분들이 소중한 시간을 투자해 달아주시는 따뜻한 댓글들은 저에게 정말 큰 힘이 됩니다!

#2 저의 각 포스트들은 엄청난 노력과 시간 투자를 통해 만들어진 포스트들로, 무단 복제나 모방하는 것을 금지합니다.

#3 저의 포스트에도 틀린 정보가 있을 수도 있습니다. 그럴 경우 친절한 말투로 근거와 함께 댓글로 달아주시면 정말 감사하겠습니다!

* 바쁜 개인 일정으로 댓글 답변이 많이 느립니다 *