[linux] 우분투 아파치 웹서버 설치와 가상 호스트 설정

아파치 웹서버는 세계에서 가장 많이 사용하는 웹서버 중 하나입니다. 대표적으로 워드프레스와 주요 웹 서비스들이 아파치로 구동되고 있습니다.

아파치는 리눅스 전용은 아니며 윈도우11과 같은 데스크탑 운영체제에서 설치해서 사용할 수 있는 크로스 플랫폼 웹 서버입니다.

또한 오픈소스로 소스가 공개되어 있기 때문에 다양한 커스터마이징 버전을 만들 수 있고, 보안 이슈에 대한 패치 또한 빠른편입니다.

아파치 웹서버 설치, HTTP, HTTPS 서비스를 위한 포트를 UFW 방화벽에서 개방, 멀티 웹사이트를 위한 가상 호스트 설정 방법까지 소개합니다.

아파치 웹서버 설치

기본적으로 우분투 22.04 LTS에서 아파치를 설치하는 과정을 소개합니다. apt 패키지 매니터를 사용해서 빠르고 간편하게 설치할 수 있습니다.

sudo apt update
sudo apt install apache2

설치는 별다른 설정 과정 없이 빠르고 간편하게 진행됩니다. 아파치 웹 데몬까지 자동으로 설정되어 설치 후 서비스까지 자동으로 시작됩니다.

아파치 웹서버 서비스가 실행중인지 다음 커맨드로 확인할 수 있습니다. "Active: active" 라고 표시되면 아파치 웹서버 서비스가 실행중인 것입니다.

ubuntu@ubuntu:~$ sudo systemctl status apache2

apache2.service - The Apache HTTP Server
     Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled)
     Active: active (running) since Thu 2024-03-21 06:34:29 UTC; 1 day 11h ago
       Docs: https://httpd.apache.org/docs/2.4/
    Process: 38048 ExecStart=/usr/sbin/apachectl start (code=exited, status=0/SUCCESS)
    Process: 51170 ExecReload=/usr/sbin/apachectl graceful (code=exited, status=0/SUCCESS)
   Main PID: 38056 (apache2)
      Tasks: 6 (limit: 4421)
     Memory: 10.3M
        CPU: 14.725s
     CGroup: /system.slice/apache2.service
             ├─38056 /usr/sbin/apache2 -k start
             ├─51203 /usr/sbin/apache2 -k start
             ├─51204 /usr/sbin/apache2 -k start

...

아파치 웹서버 관리

아파치 웹서버 환경 설정 파일을 수정했거나, 여러 변경 사항으로 인해 아파치 웹서비스를 자시 시작하려면 다음 커맨드를 사용합니다.

sudo systemctl restart apache2

웹서비스 점검이나 웹사이트 이전 등 웹서비스를 내려놓을 필요가 있을 때 아파치 웹서비스를 다음 커맨드로 정지할 수 있습니다.

sudo systemctl stop apache2

정지한 아파치 웹서비스는 다음 커맨드로 실행합니다.

sudo systemctl start apache2

또는 service 커맨드를 사용해 같은 기능을 실행할 수도 있습니다.

sudo service apache2 start
sudo service apache2 stop
sudo service apache2 restart

UFW 방화벽 설정으로 HTTP, HTTPS 포트 개방

외부에서 아파치 웹서버에 80포트, 또는 443포트로 연결하려면 해당 포트가 방화벽에서 접근허용되어 있어야 합니다.

우분투에서 주로 사용하는 UFW는 기본 설정이 모두 차단이기 때문에 꼭 방화벽 룰을 추가해서 포트 개방을 해야 합니다.

아파치 웹서버는 설치 과정에서 UFW가 인식할 수 있는 앱 등록을 함께 하기 때문에 UFW에서 각각 80, 443 포트를 개방하는 설정을 할 필요 없이 앱 이름으로 방화벽 설정을 할 수 있습니다.

먼저 아파치 설치 후 프로그램 이름으로 UFW 설정을 할 수 있는지 확인합니다. "ufw app list" 커맨드로 UFW에 등록된 프로그램 목록을 확인해서 Apache, Apache Full, Apache Secure가 있으면 됩니다.

ubuntu@ubuntu:~$ sudo ufw app list
Available applications:
  Apache
  Apache Full
  Apache Secure  

각 이름이 허용하는 포트는 다음과 같습니다.

  • 80포트: Apache
  • 443포트: Apache Secure
  • 80&443포트: Apache Full

다음 커맨드로 80&443 포트 모두를 개방합니다.

sudo ufw allow 'Apache Full'

룰 추가 후 룰이 적용되었는지 확인합니다. status 옵션으로 UFW 룰 목록을 출력해여 Apache 항목들이 추가되어 있는지 확인합니다.

ubuntu@ubuntu:~$ sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
Apache Full                ALLOW       Anywhere
Apache Full (v6)           ALLOW       Anywhere (v6)

아파치 웹서버 동작 확인

아파이 웹서버가 설치 완료되면 기본 웹 사이트 루트에 기본 페이지에 접근할 수 있게 됩니다.

아파치 웹서버가 설치되면 "/var/www/" 디렉토리 밑에 "html" 폴더가 생기며 그 안에 웹 사이트 시작 파일인 "index.html" 파일이 위치합니다. IP주소로 웹 사이트에 접근하면 이 파일이 표시됩니다.

"http://IP주소"를 입력해서 다음과 같은 "It works!" 우분투 아파치 웹페이지가 표시되면 됩니다.

아파치 It works! 기본 웹페이지

아파치 멀티(가상)호스트 설정

멀티호스트는 두 개 이상의 웹사이트를 하나의 아파치 웹 서비스에서 실행할 수 있도록 해주는 아파치 웹서버의 지원 기능입니다.

아파치 웹 서버를 설치하면 기본으로 하나의 웹 서비스, 즉 하나의 가상 호스트가 자동으로 구성되어 서비스 됩니다. 아파치 웹 서비스가 기본 구성된 서버의 IP로 접근하는 80포트, 443포트의 웹 접속은 모두 기본 설정된 웹 서비스로 가게 됩니다.

아파치의 기본 구성 웹 루트 디렉토리는 /var/www/html에 위치합니다. 앞서 "It works!" 페이지는 이 디렉토리 안의 기본 웹 페이지인 index.html이 표시된 것입니다. 이 디렉토리에 웹 페이지 파일을 추가하면 해당 파일이 웹 접근을 통해 표시되게 됩니다.

/var/www/html 디렉토리를 통해 서비스하는 웹 사이트의 아파치 구성은 /etc/apache2/sites-enabled/000-default.conf 파일을 통해 편집할 수 있습니다.

"/etc/apache2/sites-enabled" 디렉토리 목록을 보면 "000-default.conf" 파일이 링크 파일인 것을 확인할 수 있습니다. 뒤에서 다시 설명하지만 실제 설정 파일은 링크가 가리키는 "../sites-available/000-default.conf" 파일입니다.

기본 웹사이트가 디렉토리 하나와 설정 파일 하나로 서비스 된다는 것을 알았으므로 추가의 웹사이트를 위한 디렉토리와 설정 파일을 만들면 됩니다.

디렉토리 추가

새 웹 사이트용 디렉토리를 하나 만듭니다. 사용할 도메인이나 호스트 이름으로 만드는 것을 추천합니다.

sudo mkdir -p /var/www/mydomain.com

그리고 텍스트 편집기를 사용해 "mydomain.com" 폴더 안에 다음처럼 간단한 성공 메시지를 표시해주는 index.html 파일을 생성합니다.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>아파치 가상호스트 mydomain.com</title>
</head>
<body>
    <h1>mydomain.com 웹사이트 설정 성공!</h1>
</body>
</html>

"mydomain.com" 디렉토리의 소유권을 아파치 사용자인 "www-data"로 변경해야 합니다. 그래야 아파치 웹서버가 웹 서비스용 디렉토리를 핸들링 할 수 있게 됩니다.

sudo chown -R www-data: /var/www/mydomain.com

디렉토리 소유권 변경 결과
-----------------------
drwxr-xr-x  2 www-data www-data 4096 Mar 22 20:34 mydomain.com/

아파치 사용자 계정은 /etc/apache2 디렉토리 안의 "envvars" 파일에 정의되어 있습니다. 기본 설정 계정이 "www-data" 입니다.

소유권 변경 후 디렉토리에 index.html 파일을 생성하려고 하면 소유권 문제가 생기므로 먼저 index.html 파일을 생성하는 것이 좋습니다.

이제 가상호스트 구성 파일을 만들어야 합니다.

앞서 간단하게 소개한대로 가상호스트를 위한 구성 파일은 "/etc/apache2/sites-available" 디렉토리 안에 생성합니다.

표준적인 네이밍 규칙이 있으므로 텍스트 편집기로 다음과 같은 파일 이름(mydomain.com.conf)으로 설정 파일을 만듭니다. 우분투 내장 vi로 새 파일을 생성합니다.

/etc/apache2/sites-available/mydomain.com.conf

아파치 웹서버의 최소한의 구성 내용은 다음처럼 구성됩니다. 사용하는 도메인(mydomain.com)과 디렉토리 경로 부분만 수정하면 됩니다. 80포트를 통한 웹 서비스 구성 예이며 HTTPS 구성을 추가하려면 <VirtualHost *:443></VirtualHost> 태그 블록을 밑에 추가로 작성해주면 됩니다.

<VirtualHost *:80>
    ServerName mydomain.com
    ServerAlias www.mydomain.com
    ServerAdmin webmaster@mydomain.com
    DocumentRoot /var/www/mydomain.com

    <Directory /var/www/mydomain.com>
        Options -Indexes +FollowSymLinks
        AllowOverride All
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/mydomain.com-error.log
    CustomLog ${APACHE_LOG_DIR}/mydomain.com-access.log combined
</VirtualHost>

구성까지 완료되었지만 설정과 디렉토리가 연결되지 않았기 때문에 아파치 웹서버는 http://mydomain.com으로 들어오는 트래픽을 식별하지 못합니다. 디렉토리 연결이 되지 않으면 http://mydomain.com으로 들어오는 트래픽도 모두 기본 구성 웹사이트로 향하게 됩니다.

다음 커맨드를 사용해서 구성과 디렉토리가 연결되도록 심볼릭 링크를 만듭니다.

sudo a2ensite mydomain.com

링크가 성공적으로 만들어지면 /etc/apache2/sites-enabled 디렉토리에 다음처럼 "mydomain.com.conf" 파일의 심볼릭 링크가 생깁니다.

ubuntu@ubuntu:/etc/apache2/sites-enabled$ ll
total 8
drwxr-xr-x 2 root root 4096 Mar 22 20:56 ./
drwxr-xr-x 8 root root 4096 Mar 13 07:05 ../
lrwxrwxrwx 1 root root   35 Mar 13 07:05 000-default.conf -> ../sites-available/000-default.conf
lrwxrwxrwx 1 root root   36 Mar 22 20:56 mydomain.com.conf -> ../sites-available/mydomain.com.conf

심볼릭 링크를 만들면서 안내 메시지가 나오지만, 아파치 웹서버의 환경 설정을 다시 로딩해야 변경된 설정이 반영되면서 멀티 호스트가 동작합니다. 또는 아파치 웹서버를 다시 시작해도 됩니다.

sudo systemctl reload apache2

이제 웹 브라우저에서 http://mydomain.com 으로 접속하면 앞서 만든 index.html 페이지가 표시됩니다.

가상호스트 구성 파일 설정 주의사항

혼동을 피하기 위해 디렉토리 이름을 사용할 도메인으로 생성하고, 웹 루트 디렉토리를 생성한 도메인 이름인 디렉토리로 그대로 사용했습니다.

mydomain.com 디렉토리 안에 index.html 파일이 있지만, 도메인으로 웹 서비스, FTP 서비스, 서드도메인용 웹사이트 등을 구성해서 사용한다면 mydomain.com 디렉토리 안에 하위 디렉토리들을 여러 개 만들어서 여러 개의 서비스를 체계적으로 관리하는 것이 일반적입니다.

그래서 보통은 mydomain.com 밑에 public_html 디렉토리를 만들고 이 디렉토리를 아파치 가상 호스트 웹 루트로 매핑을 하게 됩니다. 하위 디렉토리를 생성해서 가상 호스트를 구성하게 되면 mydomain.com.conf 구성 파일의 두 군데를 다음처럼 수정해야 합니다.

DocumentRoot /var/www/mydomain.com/publich_html

<Directory /var/www/mydomain.com/public_html>
    Options -Indexes +FollowSymLinks
    AllowOverride All
</Directory>

도메인 이름으로 디렉토리를 생성하는 표준적인 방식을 설명했지만, 웹사이트를 위한 가상호스트 디렉토리 이름을 풀 도메인이 아닌 "newsite" 같은 일반 이름으로 생성해도 상관 없습니다. 아파치 구성 파일 이름 또한 생성한 디렉토리 이름, 또는 풀 도메인 이름이 아니어도 됩니다. 아파치 웹 서버는 sites-enabled 디렉토리의 심볼링 링크한 모든 구성 파일을 로딩합니다.

구성 파일에 문제가 있어서 아파치 웹서버가 재시작 되지 않으면 다음 커맨드를 사용해서 구성 파일에 오류가 있는지 확인할 수 있습니다. "Syntax OK" 라는 메시지가 나오면 구성 파일에 문법 오류가 없는 것입니다.

sudo apachectl configtest