如何使用 Terraform 在 Ubuntu 上配置 Apache 虚拟主机
在此页
- 我们将涵盖哪些内容?
- 飞行前检查
- 设置实验室
- 测试设置
- 结论
为了托管多个网站,管理员通常依赖“虚拟托管”技术。虚拟主机使用一台机器托管多个网站。它可以通过“基于 IP”的方法或“基于名称”的方法来实现。在“基于 IP”的托管中,我们为每个网站提供不同的 IP 地址。在“基于名称”的托管情况下,我们在每个 IP 地址上运行多个名称。
今天有许多工具可用于自动化基于云的基础设施。 Terraform 就是这样一种工具,最近在 DevOps 世界中大受欢迎。 Terraform 是由 HashiCorp 开发和维护的开源工具。它使用自己的 Hashicorp 配置语言 - HCL 来配置多个云服务提供商。基本上,Terraform 会将您当前的基础设施配置与所需状态进行比较,并且仅修改达到所需状态所需的基础设施部分。
我们将介绍什么?
在本教程中,我们将了解如何使用 Terraform 在 Ubuntu 22.04 系统上托管两个虚拟主机。我们将使用 Apache Web 服务器来执行此实验。
飞行前检查
在继续之前,请检查执行本指南的要求:
- Terraform 基础知识。
- Terraform 应该安装在您的本地系统上。
- 在您的本地系统上配置的 AWS 帐户。
- 使用 Apache 网络服务器设置虚拟主机的基础知识。
设置实验室
在我们的 Ubuntu 22.04 服务器上,我们将继续安装 Apache Web 服务器,然后我们将配置虚拟主机,每个主机都有不同的 index.html 文件:\Webpage from: Virtual Host 1.\ for vhost1 和 \Webpage from:虚拟主机 2.\ 对于 vhost2。
同样为了简单起见,我们将两个虚拟主机(虚拟主机)的域名映射到本地主机 IP 地址(127.0.0.1)。本实验使用多个文件来创建一个清晰的工作环境。这些文件的描述如下:
- userdata.sh:这是一个 bash 脚本,将设置 EC2 服务器并为虚拟主机配置 Web 服务器。
- 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
Step 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 文件中,声明一个 Web 服务器资源并设置其余的基础设施:
$ 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 执行本教程,试试吧。