웹사이트 검색

Terraform을 사용하여 Ubuntu에서 Apache 가상 호스트를 구성하는 방법


이 페이지에서

  1. 무엇을 다룰 것인가?
  2. 비행 전 확인\n
  3. 실험실 설정\n
  4. 설정 테스트
  5. 결론

여러 웹사이트를 호스팅하기 위해 관리자는 일반적으로 '가상 호스팅' 기술에 의존합니다. 가상 호스팅은 단일 시스템을 사용하여 여러 웹사이트를 호스팅합니다. 이는 'IP 기반' 방법 또는 '이름 기반' 접근 방식으로 달성할 수 있습니다. 'IP 기반' 호스팅에서는 각 웹 사이트에 고유한 IP 주소가 있습니다. '이름 기반' 호스팅의 경우 각 IP 주소에서 실행되는 여러 이름이 있습니다.

오늘날 클라우드 기반 인프라를 자동화하는 데 사용할 수 있는 많은 도구가 있습니다. Terraform은 최근 DevOps 세계에서 엄청난 인기를 얻은 도구 중 하나입니다. Terraform은 HashiCorp에서 개발 및 유지 관리하는 오픈 소스 도구입니다. 자체 Hashicorp 구성 언어인 HCL을 사용하여 여러 클라우드 서비스 공급자를 프로비저닝합니다. 기본적으로 Terraform은 현재 인프라 구성을 원하는 상태와 비교하고 원하는 상태에 도달하는 데 필요한 인프라 부분만 수정합니다.

우리는 무엇을 다룰 것인가?

이 자습서에서는 Terraform을 사용하여 Ubuntu 22.04 시스템에서 두 개의 가상 호스트를 호스팅하는 방법을 살펴봅니다. Apache 웹 서버를 사용하여 이 실습을 수행합니다.

비행 전 확인

계속 진행하기 전에 이 가이드를 수행하기 위한 요구 사항을 확인하세요.

  1. Terraform의 기초.
  2. Terraform이 로컬 시스템에 설치되어 있어야 합니다.\n
  3. 로컬 시스템에 구성된 AWS 계정.
  4. Apache 웹 서버를 사용하여 가상 호스트를 설정하는 기본 사항입니다.\n

실험실 설정

Ubuntu 22.04 서버에서 Apache 웹 서버를 설치하여 진행한 다음 각각 다른 index.html 파일이 있는 가상 호스트를 구성합니다. vhost2용 가상 호스트 2."

또한 간단하게 유지하기 위해 두 가상 호스트(가상 호스트)의 도메인 이름을 로컬 호스트 IP 주소(127.0.0.1)에 매핑했습니다. 이 실습에서는 여러 파일을 사용하여 명확한 작업 환경을 만듭니다. 파일에 대한 설명은 다음과 같습니다.

  1. userdata.sh: EC2 서버를 설정하고 가상 호스트용 웹 서버를 구성하는 bash 스크립트입니다.\n
  2. sec-grp.tf: 보안 그룹 생성을 위한 리소스를 정의합니다.\n
  3. vhost-template.tf: 사용할 실제 구성이 포함된 파일입니다.\n
  4. main.tf: 여기에서 웹 서버 리소스와 나머지 인프라가 선언됩니다.\n

여러 파일을 병합하는 것도 가능하지만 코드 검토가 더 복잡해집니다. 이제 주요 단계로 진행하겠습니다.

1단계. 모든 프로젝트 파일을 저장할 디렉토리를 생성하는 것부터 시작하겠습니다.

$ mkdir virtual-hosts-terraform

2단계. 가상 호스팅을 위한 EC2 인스턴스를 설정하기 위해 userdata 스크립트를 사용합니다. 이렇게 하면 공통 서버 구성도 자동화됩니다.

$ vi userdata.sh
#!/bin/bash

sudo apt-get update

sudo apt-get upgrade -y

sudo apt-get install apache2 -y

sudo systemctl restart apache2

sudo sh -c "echo 127.0.0.1 www.vhost1.com >> /etc/hosts"

sudo sh -c "echo 127.0.0.1 www.vhost2.com >> /etc/hosts"

sudo mkdir -p /var/www/vhost_1/public_html

sudo mkdir -p /var/www/vhost_2/public_html

sudo chown -R $USER:$USER /var/www/vhost_1/public_html

sudo chown -R $USER:$USER /var/www/vhost_2/public_html

sudo chmod -R 755 /var/www

sudo echo "Webpage from: Virtual Host 1." > /var/www/vhost_1/public_html/index.html

sudo echo "Webpage from: Virtual Host 2." > /var/www/vhost_2/public_html/index.html

sudo cp /home/ubuntu/vhosts.conf /etc/apache2/sites-available/vhosts.conf

sudo a2ensite vhosts.conf

sudo a2dissite 000-default.conf

sudo systemctl restart apache2

3단계. 다음으로 수신 및 발신 트래픽 규칙을 설정하기 위해 보안 그룹 리소스를 구성합니다. 사방에서 들어오는 SSH 및 HTTP 트래픽과 모든 곳으로의 송신(발신)을 허용합니다.

$ vi sec-grp.tf
resource "aws_security_group" "ec2-sg" {

  name = "ec2-grp"

  description = "Set Ingress and Egress Rules "


  ingress {

    from_port   = 80

    to_port     = 80

    protocol    = "tcp"

    cidr_blocks = ["0.0.0.0/0"]

  }


  ingress {

    from_port   = 22

    to_port     = 22

    protocol    = "tcp"

    cidr_blocks = ["0.0.0.0/0"]

  }


  egress {

    from_port   = 0

    to_port     = 0

    protocol    = "-1"

    cidr_blocks = ["0.0.0.0/0"]

  }

}

4단계. 이 파일에는 각 가상 호스트에 대한 실제 구성이 포함되어 있습니다. 첫 번째 '' 섹션에는 vhost1에 대한 항목이 포함되어 있습니다. 마찬가지로 두 번째는 vhost2vhost2에 해당합니다. 여기에 더 많은 vhost 항목을 추가할 수 있습니다.

$ vi vhost-template.conf

<VirtualHost *:80>


    ServerAdmin

    ServerName vhost2

    ServerAlias www.vhost2.com

    DocumentRoot /var/www/vhost_2/public_html


    ErrorLog ${APACHE_LOG_DIR}/error.log


</VirtualHost>

5단계. main.tf 파일에서 웹 서버 리소스를 선언하고 나머지 인프라를 설정합니다.

$ vi main.tf
provider "aws" {

  region ="us-east-1"

}


resource "aws_instance" "webserver" {

  ami ="ami-09d56f8956ab235b3"

  instance_type = "t2.micro"

  key_name = "Name-of-EC2-Key-Pair"

  vpc_security_group_ids = [aws_security_group.demo-sg.id]

  associate_public_ip_address = true

      

     provisioner "file" {

        source      = "vhost-template.conf"

        destination = "/home/ubuntu/vhosts.conf"

        

        connection {

      type        = "ssh"

      user        = "ubuntu"

      private_key = "${file("/Path/to/EC2-Key-Pair")}"

      host        = "${self.public_dns}"

    }

      }



user_data = "${file("userdata.sh")}"

 

  tags = {

    Name = "VirtualHostTutorial"

  }

}

     


output "IPAddress" {

  value = "${aws_instance.webserver.public_dns}"

}

파일 프로비저너는 vhost-template.conf 파일을 EC2 인스턴스에 업로드하는 데 사용됩니다. 출력 블록은 인스턴스의 공개 DNS 이름을 인쇄합니다. 마찬가지로 file 명령은 userdata 스크립트를 실행합니다.

6단계. 이제 init 명령과 적용 명령을 사용하여 프로젝트 디렉토리를 초기화합니다.

$ terraform init
$ terraform apply

설정 테스트

이제 SSH를 통해 인스턴스에 연결하고 다음 명령을 실행합니다.

$ curl www.vhost1.com

위의 명령은 가상 호스트 1 인덱스 페이지에서 메시지를 반환해야 하며, 마찬가지로 아래 명령은 가상 호스트 2에서 메시지를 표시해야 합니다.

$ curl www.vhost2.com

결론

드디어 해냈고 가상 호스팅이 예상대로 작동하고 있습니다. Terraform을 사용하여 이 자습서를 수행할 수도 있습니다. 그냥 사용해 보세요.