Как настроить виртуальные хосты Apache в Ubuntu с помощью Terraform
На этой странице
- Что мы рассмотрим?
- Проверка перед полетом
- Настройка лаборатории
- Проверка установки
- Заключение
Для размещения нескольких веб-сайтов администраторы обычно полагаются на метод «виртуального хостинга». Виртуальный хостинг размещает несколько веб-сайтов на одной машине. Это может быть достигнуто либо методом «на основе IP», либо методом «на основе имени». В хостинге на основе IP у нас есть разные IP-адреса для каждого веб-сайта. В случае хостинга на основе имени у нас есть несколько имен, работающих на каждом IP-адресе.
На сегодняшний день существует множество инструментов для автоматизации облачной инфраструктуры. Terraform — один из таких инструментов, который в последнее время приобрел огромную популярность в мире DevOps. Terraform — это инструмент с открытым исходным кодом, разработанный и поддерживаемый HashiCorp. Он использует собственный язык конфигурации Hashicorp — HCL для предоставления нескольких поставщиков облачных услуг. По сути, Terraform сравнит вашу текущую конфигурацию инфраструктуры с желаемым состоянием и изменит только те части инфраструктуры, которые необходимы для достижения желаемого состояния.
Что мы будем освещать?
В этом руководстве мы увидим, как мы можем разместить два виртуальных хоста в системе Ubuntu 22.04 с помощью Terraform. Мы будем использовать веб-сервер Apache для выполнения этой лабораторной работы.
Проверка перед полетом
Прежде чем продолжить, проверьте требования для выполнения этого руководства:
- Основы Terraform.
- Terraform должен быть установлен в вашей локальной системе.
- Учетная запись AWS, настроенная в вашей локальной системе.
- Основы настройки виртуального хоста с использованием веб-сервера Apache.
Настройка лаборатории
На нашем сервере Ubuntu 22.04 мы продолжим установку веб-сервера Apache, затем настроим виртуальные хосты, каждый из которых будет иметь свой файл index.html: \Веб-страница из: Виртуальный хост 1.\ для vhost1 и \Веб-страница из: Виртуальный хост 2.\ для vhost2.
Также для простоты мы сопоставили доменное имя двух vhosts (виртуальных хостов) с IP-адресом локального хоста (127.0.0.1). В этой лабораторной работе используется несколько файлов для создания четкой рабочей среды. Описание файлов такое:
- userdata.sh: это сценарий bash, который установит сервер EC2 и настроит веб-сервер для виртуальных хостов.
- sec-grp.tf: определяет ресурс для создания группы безопасности.
- vhost-template.tf: файл, содержащий фактическую используемую конфигурацию.
- main.tf: здесь объявляются ресурсы веб-сервера и остальная инфраструктура.
Также можно объединить несколько файлов, но это усложнит проверку кода. Теперь приступим к основным шагам:
Шаг 1. Давайте начнем с создания каталога, в котором мы будем размещать все файлы проекта:
$ mkdir virtual-hosts-terraform
Шаг 2. Чтобы настроить экземпляр EC2 для виртуального хостинга, мы будем использовать сценарий пользовательских данных. Это также автоматизирует нашу общую конфигурацию сервера:
$ 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. Этот файл содержит актуальную конфигурацию для каждого виртуального хоста. Первый раздел «
$ 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-имя экземпляра. Точно так же команда файла выполняет сценарий пользовательских данных.
Шаг 6. Теперь инициализируйте каталог проекта с помощью команды init, за которой следует команда apply:
$ terraform init
$ terraform apply
Проверка установки
Теперь подключитесь к вашему экземпляру по SSH и выполните команду:
$ curl www.vhost1.com
Приведенная выше команда должна возвращать сообщение со страницы индекса виртуального хоста1, аналогично приведенная ниже команда должна отображать сообщение с виртуального хоста2:
$ curl www.vhost2.com
Заключение
Наконец-то мы добрались, наш виртуальный хостинг работает как положено. Мы также можем выполнить это руководство с помощью Terraform, просто попробуйте.