Web Server/Apache

○ Apache 가이드 - 설정파일 분석하기

심심한 낙지 2020. 7. 5. 19:00

POOPOO: 배변 일기 앱

SMALL

 

이 포스팅은 CentOS 7 버전에서 진행되었습니다.


목차


httpd.conf 파일의 속성

 

ServerRoot

이 설정파일에서 특정 파일을 참조하는 경우에는 이 경로를 기준으로 상대경로를 입력합니다.

ServerRoot "/etc/httpd"

 

예를들어 /etc/httpd/modules/hello.so 모듈을 로드하기 원하는 경우에는 아래와 같습니다. (modules/hello.so 상대경로 사용)

LoadModule hello_module modules/hello.so

 

 

Listen

Apache에서 다룰 포트를 추가하기 위해 사용합니다.

기본적으로는 80번 포트를 등록해 놓고 사용합니다. 하지만 추가적으로 더 많은 포트가 필요한 경우에는 아래와 같이 사용하실 수 있습니다.

Listen 80
Listen 81
Listen 82

 

 

Include

일반적으로 Apache의 설정파일의 구조는 설정파일을 용도에 맞게 여러개의 파일로 분리해 놓고, httpd.conf 파일에서 불러와서 사용하는 형태로 이루어져 있습니다. 그러기 위해서 필요한 부분이 바로 이 Include 옵션입니다.

 

Apache httpd 버전 2.3.6 이상부터 쓸 수 있는 IncludeOptional 이라는 옵션이 있는데, 이 의미는 해당하는 파일이 없더라도 에러를 발생시키지 않도록 합니다.

 

/etc/httpd/conf.d/*.conf 안에 있는 용도에 따른 설정파일을 가져옵니다.

IncludeOptional conf.d/*.conf

 

/etc/httpd/conf.module.d/*.conf 안에 있는 모듈을 로딩한 설정파일을 가져옵니다.

Include conf.modules.d/*.conf

 

 

User / Group

User와 Group 옵션은 홈페이지 서비스를 직접 담당하는 Apache 서버의 하위 프로세스들의 실행 소유자와 소유그룹을 결정합니다. Apache 서버는 HTTP 포트, 포트 80에 액세스하기 위해 루트 사용자로 실행됩니다.

클라이언트 요청에 응답하기 위해서 Apache는 필요한 하위 프로세스를 분리합니다.

그 하위 프로세스는 최소한의 권한으로 실행되어야 합니다. 따라서 초기에 설정은 apache 유저와 apache 그룹으로 설정되어 있지만, 클라이언트의 엑세스를 최소화하려면 이 부분을 nobody로 설정해야합니다.

User nobody
Group nobody

 

 

ServerAdmin

웹 문서 로딩과 같은 문제로 에러가 발생 시, 에러페이지에 보여질 관리자 메일 주소이다.

ServerAdmin root@localhost

 

 

ServerName

클라이언트에게 보여주는 호스트이름을 지정합니다. 만약 현재 사용하는 도메인이 없다면 IP주소나 localhost를 입력합니다.

ServerName localhost

 

 

DocumentRoot

요청을 받은 아파치는 어떤 파일을 서비스할지 결정하기위해 기본적으로 요청의 URL-경로(URL에서 호스트명과 포트 뒤에 나오는 부분)를 설정파일에서 지정한 DocumentRoot 뒤에 붙입니다. 그래서 DocumentRoot 아래있는 파일과 디렉토리들은 웹에서 보게될 기본적인 내용들을 가지고 있습니다.

 

예를들어, DocumentRoot /etc 라고 정의하였다고 가정합니다.

http://localhost/hello.jpg 라고 주소를 입력할 시, etc 폴더 안에 있는 hello.jpg 파일을 찾아서 보여줍니다.

 

초기에는 아래와 같이 설정되어있으나, 변경을 원하는 경우에 자유롭게 바꿀 수 있습니다.

DocumentRoot "/var/www/html"

 

 

AddDefaultCharset

이 옵션은 외부로 보내지는 모든 웹문서들에 대하여 기본 charset을 지정한 것입니다. 최근에는 대부분 UTF-8로 다국적인 표준을 사용합니다.

AddDefaultCharset UTF-8

 

 

EnableSendfile

Apache는 운영체제가 sendfile을 지원하면 커널 sendfile을 사용하여 정적 파일을 서비스하는 경우 전송할 파일을 직접 읽지 않을 수 있습니다. sendfile을 사용하면 read와 send를 따로 할 필요가 없어서 매우 빨라집니다.

 

하지만, sendfile을 사용하면 웹서버의 안정성을 해치게되는 경우가 있고, 커널은 자신의 캐쉬를 사용하여 NFS로 마운트한 파일을 안정적으로 서비스할 수 없는 경우가 있으므로 EnableSendfile off를 사용해서 파일을 sendfile 전송하지 않도록 할수 있습니다.

 

기본 설정값은 on 입니다.

EnableSendfile on

 

 

LogLevel

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

초기에는 info로 설정되어있고, 하단의 테이블을 참조해서 원하는 로그 수준으로 변경할 수 있습니다.

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

 

 

<Directory>

지정한 디렉토리 안에있는 모든 웹문서들에 대하여, 어떤 서비스와 기능을 허용 및 거부 할 것인지를 설정합니다.

 

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

 

[Option 종류]

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

 

AllowOverride는 어떻게 접근을 허락할 것인가에 대한 설정입니다.

특정 디렉토리에 대한 방문자들의 접근방식을 어떤방식으로 인증하여 허용할 것인가를 정의하는 경우에 사용합니다.

AllowOverride에서 설정하는 값들은 중복해서 설정될 수 있으며 그때마다 가장 최근에 설정된 값이 항상 우선 적용됩니다.

 

[AllowOverride 종류]

No 제목 날짜
1 None 이 값이 설정되면 AccessFileName에 지정된 파일을 액세스 인증파일로 인식하지 않습니다.

즉, AccessFileName의 값이 대부분 .htaccess 이므로 이를 무시하게 됩니다.
아주 제한적인 접근만을 허용할때 사용합니다.
2 All 이전의 인증방식에 대하여 새로운 접근인증방식을 우선적용하도록 Override를 허용합니다.
3 AuthConfig AccessFileName에서 명시한 파일에 대하여 AuthDBMGroupFile, AuthDBMUserFile, AuthGroupFile, AuthName, AuthType, AuthUserFile, require 등과 같은 클라이언트 인증옵션의 사용을 허용합니다.

즉, htpasswd 유틸리티를 이용하여 특정디렉토리의 접근은 AccessFileName에 명시한 파일(.htaccess)로 제어하고자 할 때에 해당 디렉토리내에 이 값을 주로 사용합니다. (디렉토리 인증설정)
4 FileInfo AccessFileName 지시자에 명시한 파일에 대하여 AddEncoding, AddLanguage, AddType, DefaultType, ErrorDocument, LanguagePriority 등과 같은 문서유형을 제어하는 옵션의 사용을 허용합니다.
5 Indexes AccessFileName 지시자에 명시한 파일에 대하여 AddDescription, AddIcon, AddIconByEncoding, AddIconByType, DefaultIcon, DirectoryIndex, FancyIndexing, HeaderName, IndexIgnore, IndexOptions, ReadmeName 등과 같은 디렉토리 Indexing을 제어하는 옵션의 사용을 허용합니다.
6 Options AccessFileName 지시자에 명시한 파일에 대하여 Options 그리고 XBitHack등과 같은 특정 디렉토리를 제어하는 옵션의 사용을 허용합니다.
7 Limit AccessFileName 지시자에 명시한 파일에 대하여 allow, deny, 그리고 order 등과 같은 호스트 접근을 제어하는 옵션의 사용을 허용합니다.

 

위에있는 표를 참고하여 아래와 같이 해당하는 경로에 따라서 옵션을 지정할 수 있습니다.

기존에 있는 설정은 아래와 같습니다. 루트폴더와 /var/www, /var/www/html, /var/www/cgi-bin 폴더에 대한 옵션이 정의되어있습니다.

Apache 웹서버를 통해서 다른 폴더로도 접근을 원한다면, Directory 태그를 추가로 정의해서 사용하실 수 있습니다.

 

<Directory />
    AllowOverride none
    Require all granted
</Directory>
<Directory "/var/www">
    AllowOverride None
    Require all granted
</Directory>
<Directory "/var/www/html">
    Options Indexes FollowSymLinks
    AllowOverride None
    Require all granted
</Directory>
<Directory "/var/www/cgi-bin">
    AllowOverride None
    Options None
    Require all granted
</Directory>




# 추가를 원한다면 ?
<Directory "/???/???">
    AllowOverride None
    Require all granted
</Directory>

 

 

<IfModule>

모듈을 로드하기 위해서는 LoadModule 모듈명 파일경로 형식으로 *.conf 파일에 추가합니다.

기존에는 /etc/httpd/conf.modules.d 폴더 안에 여러가지의 conf 파일들이 있고, 그 파일의 내용에는 각각 이름에 맞도록 모듈이 로딩되어있습니다. 또한, httpd.conf 파일에서는 모듈을 로딩하는 파일들을 Include conf.modules.d/*.conf 라고 상단에 정의하여 필요한 모듈을 전부 로딩하고있습니다.

 

이렇게 모듈을 로딩하도록 설정을 했지만, 이 모듈을 사용하기 위해서는 모듈이 필요로하는 속성값을 넣어주어야 합니다. 이런 경우에 사용하는 옵션이 <IfModule> 태그입니다.

 

아래의 예시를 보면 모듈별로 다양한 속성을 필요로하고 있다는 것을 알 수 있습니다.

<IfModule dir_module>
    DirectoryIndex index.html
</IfModule>
<IfModule log_config_module>
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
    LogFormat "%h %l %u %t \"%r\" %>s %b" common
    <IfModule logio_module>
      LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
    </IfModule>
</IfModule>
<IfModule alias_module>
    ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
</IfModule>
<IfModule mime_module>
    TypesConfig /etc/mime.types
    AddType application/x-compress .Z
    AddType application/x-gzip .gz .tgz
    AddType text/html .shtml
    AddOutputFilter INCLUDES .shtml
</IfModule>
<IfModule mime_magic_module>
    MIMEMagicFile conf/magic
</IfModule>
<IfModule jk_module>
    JkWorkersFile conf/workers.properties
    JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
    JkLogFile logs/mod_jk.log
    JkLogLevel info
    JkShmFile run/mod_jk.shm
    JkMount /* worker1
</IfModule>

 

 

Files

특정 확장자로 이루어진 파일에 별도의 제한을 걸어둘 수 있는 옵션입니다.

접근권한에 대한 정보를 담고있는 .htaccess 파일과 .htpasswd 파일은 보안이 중요하기 때문에 접근할 수 없도록 설정되어있습니다.

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

 

LIST