웹 서버는 웹 페이지를 저장, 처리하고 웹사이트 방문자에게 전달합니다. 꽤 많은 오픈 소스 웹 서버 소프트웨어 옵션이 있지만, Apache HTTP 서버는 세계에서 가장 널리 사용되는 웹 서버로 간주됩니다. 이는 오픈 소스일 뿐만 아니라, 모듈식 아키텍처 덕분에 다양한 목적에 맞는 모듈을 추가하여 기능을 확장할 수 있기 때문입니다. 결과적으로 이 웹 서버는 매우 강력합니다.
만약 CentOS 7 시스템에 Apache를 설치하려는 경우, 이 튜토리얼이 도움이 될 것입니다. 또한, 가상 호스트를 생성하여 CentOS에서 실행되는 하나의 Apache HTTP 서버에서 여러 웹사이트를 서비스하는 방법도 배우게 됩니다.
이 튜토리얼은 Apache 설치에만 초점을 맞춘 상세한 가이드입니다. LAMP 스택에 대한 요약된 튜토리얼을 찾고 계신다면, CentOS 7에 Linux, Apache, MySQL, PHP (LAMP)를 설치하는 방법 가이드를 확인해 보시기 바랍니다. 이제 시작하겠습니다!
사전 요구 사항
이 튜토리얼은 실습형이므로 다음 사항이 준비되어 있어야 합니다:
- CentOS 7을 실행하는 서버. CloudSigma에서 몇 가지 간단한 단계를 따라 이 링크에서 생성할 수 있습니다..
- sudo 권한이 있는 non-root 사용자 구성을 서버에 완료해야 합니다. 그런 다음 이 사용자로 로그인합니다.
- 다음 튜토리얼의 단계를 따라 기본 방화벽을 구성합니다: CentOS 7에서 FirewallD로 방화벽 설정하기.
1단계: Apache HTTP 서버 설치
Apache는 CentOS 기본 리포지토리에 포함되어 있습니다. 따라서 yum 패키지 관리자를 사용하여 간편하게 설치할 수 있습니다. 사전 요구 사항 섹션에 따라 non-root 사용자로 로그인해야 합니다. 터미널에서 다음 명령을 실행하여 로컬 Apache httpd package 인덱스를 업데이트합니다:
|
1 |
sudo yum update httpd |
패키지가 업데이트되면 다음 명령을 입력하여 Apache를 설치합니다:
|
1 |
sudo yum install httpd |
설치를 확인하고 yum이 Apache 및 필요한 종속성을 설치할 때까지 기다립니다.
만약 CentOS 7에서 FirewallD로 방화벽 설정하기 튜토리얼의 단계를 따르고 80번 포트에 대해 방화벽을 활성화했다면 준비가 완료된 것입니다. Firewalld는 CentOS의 방화벽 관리자입니다. 그렇지 않은 경우, 다음 명령을 입력하여 firewalld의 http(80번 포트) 서비스를 활성화할 수 있습니다:
|
1 |
sudo firewall-cmd --permanent --add-service=http |
보안 HTTPS를 통해 트래픽을 서비스할 계획이라면, 다음 명령을 입력하여 firewalld의 https(443번 포트) 서비스를 활성화할 수 있습니다:
|
1 |
sudo firewall-cmd --permanent --add-service=https |
마지막으로 변경 사항을 적용하려면 firewalld를 다시 로드해야 합니다. 다시 로드하는 명령은 다음과 같습니다:
|
1 |
sudo firewall-cmd –reload |
이제 위의 명령을 실행했는지 여부에 따라 HTTP 또는 HTTPS를 통해 트래픽을 서비스하도록 Apache를 설치하고 구성했습니다.
2단계: Apache 웹 서버가 실행 중인지 확인
CentOS에서는 설치 후 Apache 프로세스가 자동으로 시작되지 않습니다. Apache를 수동으로 시작하려면 다음 명령을 입력합니다:
|
1 |
sudo systemctl start httpd |
서비스가 성공적으로 시작되었는지 확인하려면 다음 명령을 입력하여 상태를 확인합니다:
|
1 |
sudo systemctl status httpd |
서비스가 실행 중인 경우 아래 스크린샷과 유사한 출력이 표시됩니다. 활성(active) 상태를 확인하세요:

출력은 서비스가 성공적으로 시작되었고 실행 중임을 나타냅니다. Next, we must also test that Apache can serve a page to internet users. Apache comes with a default page that you can use to test if your server can be accessed over the internet.
서버의 공인 IP 주소를 아직 모른다면 찾아야 합니다. 이 IP 주소는 브라우저의 주소창에 입력하여 기본 Apache 웹 페이지를 요청할 때 사용됩니다. 다음 명령을 입력하여 호스트의 네트워크 주소를 표시할 수 있습니다:
|
1 |
hostname –I |
가져온 주소 목록에서 브라우저에 각각 입력하여 작동하는지 확인할 수 있습니다. 선택적으로, curl에서 IP 주소를 가져오려면 icanhazip.com을 사용합니다. 아래 명령은 다른 인터넷 위치에 있는 컴퓨터에서 본 공인 IP 주소를 출력합니다:
|
1 |
curl -4 icanhazip.com |
서버의 공인 IP 주소를 확인했으면, 이를 복사하여 브라우저의 주소창에 붙여넣으세요:
|
1 |
http://your_server_public_ip |
브라우저에 기본 CentOS 7 Apache 웹 페이지가 로드되어야 합니다:

기본 Apache 웹 페이지를 로드할 수 있었다면 서버가 올바르게 작동하고 있음을 의미합니다. 아래로 스크롤하면 Apache 파일 및 디렉터리 위치에 대한 몇 가지 기본 정보를 볼 수 있습니다. 서비스가 설치되고 올바르게 작동하면 다양한 systemctl 명령을 사용하여 서비스를 관리할 수 있습니다.
3단계: Apache 서비스 관리
이 섹션에서는 몇 가지 기본적인 Apache 관리 명령을 보여드리겠습니다. 웹 서버를 중지하는 명령은 다음과 같습니다:
|
1 |
sudo systemctl stop httpd |
웹 서버를 시작하는 명령은 다음과 같습니다:
|
1 |
sudo systemctl start httpd |
다음은 웹 서버를 재시작(중지 후 시작)하는 명령입니다:
|
1 |
sudo systemctl restart httpd |
그 다음으로 Apache 서비스를 다시 로드하는 명령을 보여드리겠습니다. 이 명령은 단순히 구성을 변경할 때 필요합니다. 다시 로드하면 Apache 프로세스가 재시작했을 때와 달리 연결을 끊지 않고 구성 변경 사항을 적용합니다:
|
1 |
sudo systemctl reload httpd |
기본 구성에 따라 Apache는 서버가 부팅될 때 자동으로 시작됩니다. 이 동작을 변경하려면 부팅 시 서비스가 시작되지 않도록 비활성화하는 명령은 다음과 같습니다:
|
1 |
sudo systemctl disable httpd |
부팅 시 서비스가 다시 시작되도록 활성화하려면 다음 명령을 입력하세요:
|
1 |
sudo systemctl enable httpd |
4단계: Apache 가상 호스트 설정
기본적으로 Apache는 단일 웹사이트를 호스팅하고 서비스하도록 구성되어 있습니다. 대부분의 경우 웹 서버가 여러 웹사이트를 서비스하고 호스팅하도록 설정하고 싶을 것입니다. 예를 들어, 하위 도메인이 있거나 기본 회사/조직 웹사이트를 위한 블로그 페이지를 설정하고 싶을 수 있습니다. 이때 Apache 가상 호스트가 사용됩니다. Apache 가상 호스트를 사용하면 웹 서버가 여러 웹사이트를 서비스하도록 구성할 수 있습니다. Apache 가상 호스트는 Nginx 서버.
의 서버 블록과 동일합니다. 이 튜토리얼에서는 example.com을 도메인으로 사용하여 가상 호스트를 만드는 방법을 보여드리겠습니다. 물론 example.com 도메인은 인터넷에서 작동하지 않으므로 실제 도메인으로 대체해야 합니다. 단계는 동일합니다.
CentOS에 Apache를 설치하면 /var/www/html 디렉터리에서 콘텐츠를 서비스하도록 구성된 가상 호스트 하나가 설치됩니다. 이 설계는 단일 사이트를 호스팅하는 경우 잘 작동합니다. 그러나 우리는 여러 사이트를 호스팅할 수 있기를 원합니다. 기본 /var/www/html 디렉터리는 그대로 두고 대신 /var/www 위치 내에 example.com 도메인을 위한 다른 디렉터리를 생성할 것입니다. 기본 디렉터리를 그대로 두는 이유는 클라이언트 요청이 가상 호스트로 구성한 다른 사이트와 일치하지 않을 때 이 디렉터리가 서비스되도록 하기 위함입니다. 또한 생성한 가상 호스트를 비활성화하려는 경우에도 기본 디렉터리가 트래픽을 계속 처리하게 됩니다.
먼저, /var/www 내에 도메인 이름을 위한 디렉터리를 생성합니다. 원하는 이름을 자유롭게 선택할 수 있습니다. 다만, 가상 호스트 conf 파일을 생성할 때 쉽게 기억할 수 있도록 도메인과 유사한 이름을 선택하는 것이 좋습니다. 다음 명령을 입력하여 example 디렉터리를 생성합니다:
|
1 |
sudo mkdir -p /var/www/example |
사이트의 로그 파일을 보관할 추가 폴더를 생성하려면 다음 명령을 입력하세요:
|
1 |
sudo mkdir -p /var/www/example/log |
웹사이트 디렉터리가 준비되었으면 다음 명령을 사용하여 $USER 환경 변수로 디렉터리의 소유권을 할당합니다:
|
1 |
sudo chown -R $USER:$USER /var/www/example |
웹 루트에 기본 권한이 있는지 확인하려면 다음 명령을 실행하세요:
|
1 |
sudo chmod -R 755 /var/www |
이제 다음 명령을 입력하여 index.html 페이지를 example 디렉터리 내에 nano를 사용하여 생성합니다:
|
1 |
sudo nano /var/www/example/index.html |
nano 편집기에서 다음 HTML 코드 스니펫을 추가합니다:
|
1 2 3 4 5 6 7 8 |
<html> <head> <title>Welcome to Example.com!</title> </head> <body> <h1>If you can see this message, it means <em>example.com</em> virtual host is working!</h1> </body> </html> |
완료되면 다음을 눌러 파일을 저장하고 Ctrl O 그런 다음 ENTER를 누릅니다. 이제 다음을 눌러 편집기를 닫을 수 있습니다: Ctrl X.
지금까지 가상 호스트를 테스트하기 위한 사이트 디렉터리와 기본 웹 페이지를 준비했습니다. 다음으로 가상 호스트 설정 파일을 생성해야 합니다. 가상 호스트 파일은 단일 Apache 서버에서 호스팅하려는 다양한 사이트의 설정을 지정합니다. 이 파일들은 설정된 도메인 이름 요청을 해당 특정 디렉터리로 안내합니다.
가상 호스트 파일은 다음 디렉터리에 저장됩니다: /etc/httpd/sites-available. 활성화된 가상 호스트 파일은 /etc/httpd/sites-available 디렉터리에서 /etc/httpd/sites-enabled 디렉터리로 심볼릭 링크가 설정됩니다. 이 두 디렉터리는 CentOS에서 기본적으로 생성되지 않으므로 직접 생성해야 합니다. 다음 명령을 입력하여 디렉터리를 생성하세요:
|
1 |
sudo mkdir /etc/httpd/sites-available /etc/httpd/sites-enabled |
디렉터리가 준비되면 Apache가 sites-enabled 디렉터리에서 가상 호스트를 찾도록 지시합니다. 이는 Apache의 메인 설정 파일을 수정하여 수행할 수 있습니다. 다음 명령을 입력하여 nano 편집기에서 파일을 엽니다:
|
1 |
sudo nano /etc/httpd/conf/httpd.conf |
Apache가 선택적 디렉터리에서 추가 설정 파일을 찾도록 지시하는 줄을 추가하려고 합니다. 파일의 맨 아래로 스크롤하여 끝에 다음 줄을 추가합니다:
|
1 |
IncludeOptional sites-enabled/*.conf |
다음을 눌러 파일을 저장하고 Ctrl O 그런 다음 ENTER를 누릅니다. 이제 다음을 눌러 편집기를 닫을 수 있습니다: Ctrl X. 다음 단계는 sites-available 디렉터리 내에 가상 호스트 파일을 생성하는 것입니다. 다음 명령을 입력하여 nano 편집기로 새 파일을 생성하고 엽니다:
|
1 |
sudo nano /etc/httpd/sites-available/example.conf |
열린 파일에 다음 설정 블록을 추가합니다. example.com 부분을 실제 도메인 이름으로 변경해야 하며, /var/www/example에서 다른 디렉터리 이름을 사용했다면 그에 맞게 업데이트해야 합니다:
|
1 2 3 4 5 6 7 |
<VirtualHost *:80> ServerName www.example.com ServerAlias example.com DocumentRoot /var/www/example ErrorLog /var/www/example/log/error.log CustomLog /var/www/example/log/requests.log combined </VirtualHost> |
보시다시피, 이 도메인에 대해 제공될 파일이 있는 도메인 이름과 문서 루트를 지정했습니다. 또한 에러 로그 위치도 지정하여 서버 트러블슈팅 시 도움이 되도록 했습니다.
가상 호스트 파일이 sites-available 디렉터리에 생성되면, 다음 단계는 sites-enabled 디렉터리에 대한 심볼릭 링크를 생성하여 파일을 활성화하는 것입니다. 다음 명령을 입력하여 심볼릭 링크를 생성하세요:
|
1 |
sudo ln -s /etc/httpd/sites-available/example.conf /etc/httpd/sites-enabled/example.conf |
여기까지 단계를 따라오셨다면, 이제 가상 호스트가 웹사이트 콘텐츠를 제공할 준비가 되었을 것입니다. 하지만 가상 호스트가 작동하기 전에 구성해야 할 확인 사항이 하나 더 있습니다. 다음으로 이에 대해 알아보겠습니다.
5단계: 가상 호스트를 허용하도록 SELinux 권한 조정
Linux 배포판( Fedora, RHEL 및 CentOS 등)에는 기본적으로 SELinux가 포함되어 있습니다. SELinux (Security Enhanced Linux)은 서버가 요청을 처리하는 방식과 사용자가 소켓, 네트워크 포트 및 필수 디렉터리와 상호 작용하는 방식을 제한하고 정의하는 Linux 시스템용 보안 아키텍처입니다.
기본적으로 SELinux는 기본 Apache 구성과 함께 작동합니다. 하지만 사용자 정의 로그 디렉터리를 포함하여 생성한 사용자 정의 가상 호스트의 경우, Apache 서비스를 재시작하려고 할 때 서비스 오류가 발생합니다. 해결 방법은 Apache 서비스가 필요한 파일에 쓸 수 있도록 SELinux 정책을 수정하는 것입니다.
SELinux는 CentOS를 매우 안전한 서버로 만들어 줍니다. 따라서 완전히 비활성화하는 것은 권장하지 않습니다. SELinux를 사용하면 다양한 방식으로 보안 수준을 맞춤 설정할 수 있으므로, 환경의 필요에 따라 정책을 업데이트하거나 설정하는 것이 좋습니다.
Apache 정책을 업데이트하는 데는 두 가지 옵션이 있습니다. 전역적으로 업데이트하거나 특정 디렉터리별로 업데이트하는 것입니다. 특정 디렉터리에 맞게 정책을 업데이트하는 것이 더 안전합니다. 따라서 이 옵션을 권장합니다.
-
Apache 정책을 전역적으로 업데이트하기
전역적으로 Apache 정책을 수정하여 SELinux가 모든 Apache 프로세스를 동일하게 처리하도록 지시할 수 있습니다. 이때 사용하는 것은 httpd_unified 불리언 값입니다. Apache 정책을 전역적으로 수정하면 각 디렉터리를 특정 방식으로 설정하는 것만큼 정밀하게 제어할 수는 없다는 점에 유의하세요. 하지만 유지 관리 측면에서는 더 편리합니다. Apache 정책을 전역적으로 업데이트하려면 다음 명령을 실행하세요:
|
1 |
sudo setsebool -P httpd_unified 1 |
이 명령의 값들이 수행하는 작업을 정의해 보겠습니다:
- setsebool – SELinux 불리언 값을 업데이트합니다.
- -P 태그 – 부팅 시 값을 업데이트하여 재부팅 후에도 이 변경 사항이 유지되도록 합니다.
- httpd_unified – SELinux가 모든 Apache 프로세스를 동일한 유형으로 처리하도록 지시하는 불리언 값입니다. 값 1을 사용하면 활성화됩니다.
-
디렉터리별 Apache 정책 조정
디렉터리를 더 세밀하게 제어하려면 디렉터리별로 Apache 정책을 조정하는 것이 올바른 방법입니다. 하지만 더 많은 유지 관리가 필요하다는 부담이 있습니다. 정책이 전역적이지 않기 때문입니다. 따라서 가상 호스트 conf 파일에 지정하는 새로운 로그 디렉터리에 대해 컨텍스트 유형을 수동으로 설정해야 합니다.
정책을 업데이트하기 전에, 먼저 다음 명령을 사용하여 SELinux가 /var/www/example/log 디렉터리에 할당한 컨텍스트 유형을 확인합니다:
|
1 |
sudo ls -dZ /var/www/example/log/ |
명령은 다음과 같이 출력되며, 이는 기본적으로 디렉터리의 SELinux 컨텍스트입니다:
|
1 |
drwxr-xr-x. root root unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/example/log/ |
httpd_sys_content_t은 현재 컨텍스트로, SELinux에 Apache 프로세스가 이 디렉터리에 생성된 파일만 읽을 수 있도록 허용됨을 알려줍니다. 가상 호스트 구성에서 Apache가 /var/www/example/log 디렉터리의 로그 파일에 쓸 수 있도록 하려면, Apache가 웹 애플리케이션 로그 파일을 생성하고 추가할 수 있도록 이 정책을 수정해야 합니다. 이를 허용하는 컨텍스트는 httpd_log_t입니다. 컨텍스트를 업데이트하는 명령은 다음과 같습니다:
|
1 |
sudo semanage fcontext -a -t httpd_log_t "/var/www/example/log(/.*)?" |
위 명령의 변경 사항을 적용하고 부팅 시에도 유지되도록 하려면 다음 명령을 실행하세요:
|
1 |
sudo restorecon -R -v /var/www/example/log |
이 명령이 수행하는 작업을 정의해 보겠습니다:
- restorecon – 변경 사항을 적용하고 재부팅 후에도 유지되도록 합니다.
- -R 플래그 – 명령을 재귀적으로 실행하여 기존 파일이 새 컨텍스트를 사용하도록 업데이트합니다.
- -v 플래그 – 명령이 실행된 후 컨텍스트 변경 사항을 출력합니다. 다음과 같이 출력됩니다:
|
1 2 |
출력: restorecon reset /var/www/example/log context unconfined_u:object_r:httpd_sys_content_t:s0->unconfined_u:object_r:httpd_log_t:s0 |
|
1 |
sudo ls -dZ /var/www/example/log/ |
|
1 |
drwxr-xr-x. root root unconfined_u:object_r:httpd_log_t:s0 /var/www/example.com/log |
6단계: 가상 호스트 구성 테스트
가상 호스트를 테스트하기 전에 Apache 서비스를 다시 시작해야 합니다. 이를 위한 명령은 다음과 같습니다:
|
1 |
sudo systemctl restart httpd |
다음으로, 다음 명령을 사용하여 로그 디렉터리의 내용을 나열합니다:
|
1 |
ls -lZ /var/www/example/log |
Apache가 로그 파일을 생성했음을 보여주는 다음과 같은 내용이 표시되어야 합니다:

지금까지의 단계를 따랐다면, 가상 호스트 파일에 정의된 도메인 이름으로 접속했을 때 Apache가 샘플 HTML 페이지를 제공할 수 있어야 합니다. 원한다면 4단계와 5단계를 반복하여 추가 도메인을 설정하고 해당 SELinux 권한을 적절하게 업데이트할 수 있습니다.
결론
이 튜토리얼에서는 Apache를 설치하고, Apache가 사용자 지정 로그 파일에 쓸 수 있도록 SELinux 정책을 업데이트하는 방법을 배웠으며, 마지막으로 구성이 올바르게 작동하는지 확인하기 위해 테스트했습니다. 이 배경지식을 바탕으로 더 풍부한 경험을 제공하는 더 나은 애플리케이션을 구축하고 서비스할 수 있을 것입니다.
전체 웹 스택을 탐색해보고 싶다면, 다음 튜토리얼을 확인해 보세요: CentOS 7에 LAMP 스택을 설치하는 방법.
즐거운 컴퓨팅 되세요!
댓글
아직 댓글이 없습니다. 첫 번째로 작성해 보세요.