요즘에야 워낙 배포가 자동으로 되다 보니 엔지니어가 아파치 config까지 건들 일이 그렇게 많을거라고 생각하지는 않지만... 그래도 뭐랄까... 웹서버는 너무나도 쉽가 가져다가 쓰면서 정작 웹서버 설정 파일이 어떤 구조로 짜여 있는지도 모르고 있었던 거 같다. 컴통 시간에 정확히 웹 서버가 뭘 하는지에 대해서는 잘 이해했으니깐, 그 구현체 중 하나인 아파치 config 파일이 어떻게 되어 있는지 한 번 알아보고자 한다.
사실 이런 포스팅을 하게 된 계기 중 하나도, 너무 무작정 따라하고만 살지는 않았는가 하는 생각에서 비롯된 것이다. ubuntu web server 구글에 검색하면, 아파치 설치하고 각종 설정까지 다 끝내는 코드들이 수만 개는 족히 나오지만, 그 어느 블로그에서도 각 명령어가 대체 무슨 역할을 하는 것인지, 이 설정 지시문은 어떤 역할을 하는 것인지 전혀 설명해주지 않았다.
그래서 여기서는 아파치 설치를 해서 서버 올리기까지 해 보되, 각각이 뭘 뜻하는지 한번 자세하게 알아보고 기록할 것이다.
,,,라고 하고 글을 쓰려고 했는데, 우분투 공식 홈페이지에 아파치 설치에 대한 설명이 괘나 상세하게 나와 있어서, 그 내용을 중심으로 작성할 것이다.
sudo apt install apache2
로 아파치를 설치한다.
아파치 웹 서버를 설정하기 위해서는 설정 파일에 directives(지시문)을 작성하여 넣으면 된다. 근데 이제 설정 파일이 하나가 아니라, 여러 개로 쪼개져서 만들어져 있어서, 필요한 설정을 필요한 곳에 넣어야 한다.
설정 파일은 /etc/apache2/
안에 위와 같은 디렉토리 구조를 가지고 만들어져 있는데, 각 설정 파일의 역할은 이렇다:
위에서 적용을 하고 싶으면 심링크를 걸어주면 된다고 했는데, 이걸 수작업으로 할 필요는 없고 이걸 쉽게 할 수 있는 명령어도 존재한다. (a2ensite
, a2dissite
)
근데 이제 이런 구성이 꼭 필수적인 것은 아니고 그냥 편의상 기본적으로 나누어져 있는 것이다. 이런 계층 구조로 잘 만들어 놓았으므로 통상 이렇게 잘 사용한다. 설정을 적용하고자 할 때에는 서버를 restart한다.
<VirtualHost>
and</VirtualHost>
are used to enclose a group of directives that will apply only to a particular virtual host. Any directive that is allowed in a virtual host context may be used. When the server receives a request for a document on a particular virtual host, it uses the configuration directives enclosed in the<VirtualHost>
section.
그러니깐 VirtualHost 지시문 뒤에 주어진 패턴을 통해서 호스트를 매칭하는데, 매칭이 되면 그 블록 안에 있는 지시문을 이용한다는 것이다.
예를 들어서 기본으로 하나 주어지는 VirtualHost는 이렇게 돼 있다.
<VirtualHost *:80>
# The ServerName directive sets the request scheme, hostname and port that
# the server uses to identify itself. This is used when creating
# redirection URLs. In the context of virtual hosts, the ServerName
# specifies what hostname must appear in the request's Host: header to
# match this virtual host. For the default virtual host (this file) this
# value is not decisive as it is used as a last resort host regardless.
# However, you must set it for any further virtual host explicitly.
#ServerName www.example.com
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
# Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
# error, crit, alert, emerg.
# It is also possible to configure the loglevel for particular
# modules, e.g.
#LogLevel info ssl:warn
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
# For most configuration files from conf-available/, which are
# enabled or disabled at a global level, it is possible to
# include a line for only one particular virtual host. For example the
# following line enables the CGI configuration for this host only
# after it has been globally disabled with "a2disconf".
#Include conf-available/serve-cgi-bin.conf
</VirtualHost>
이렇게 주어지면 이 서버에 80포트로 오는 HTTP 리퀘스트에 대해서 서버는 다 이 설정을 사용할 것이다. 설정이란 것도 보면 참 간단하다.
사실 이외에도 정말 많지만 나머지를 찾아보는 것은 여러분의 몫으로 남겨 두겠다.
그냥 아무 생각 없이 블로그에서 하라는 대로 복붙하고 넘어갔던 설정 파일 하나에도 이렇게 많은 철학과 시스템과 원리가 숨어 있고, 서버를 만든 프로그래머들은 거기서 그치지 않고 우리에게 매뉴얼과 도큐멘트를 하사해 주셨다. 그럼 나와 같은 미련한 중생들은 나보다 어쩌면 더 이걸 잘 모를 지도 모르는 블로거들의 글을 찾아보고 배울 것이 아니라, 어디서든 공식 문서를 참고하고 또 참고해야 할 것이라고 본다.
https://httpd.apache.org/docs/2.4
https://ubuntu.com/server/docs/web-servers-apache