如何使用 Terraform 在 Ubuntu EC2 实例上设置 Apache 虚拟主机
“为了托管多个网站,管理员通常在一台计算机上配置虚拟主机。在虚拟主机中,我们可以使用“基于IP”的主机或“基于名称的”主机。在“基于 IP”的托管中,我们为每个网站提供不同的 IP 地址。在“基于名称”托管的情况下,我们在每个 IP 地址上运行多个名称。 ”
我们将涵盖什么?
在本指南中,我们将了解如何在 Amazon EC2 Ubuntu 22.04 实例上配置虚拟主机。在本实验中,我们将使用基于名称的虚拟主机。我们将使用 Terraform 部署所需的基础设施。
实验室概况
在本实验中,我们将创建两个虚拟主机;域 1 和域 2。我们将在 Ubuntu 机器上安装 apache Web 服务器。每个虚拟主机都有一个不同的 index.html 文件,其内容为:“这是虚拟主机 1”(对于域 1)和“这是虚拟主机 2”(对于域 2)。
我们没有为每个主机注册域名,而是使用本地主机 IP 地址来映射域名。这可以通过修改“hosts”文件来完成。为了简化该基础设施的部署,我们将整体配置分为多个文件。通过这种方式,我们就能避免代码笨拙。这里使用的文件概要:
userdata.sh:包含在 Ubuntu 实例上安装和配置 Apache Web 服务器所需的脚本。
secgrp.tf:创建要与实例一起使用的安全组。此安全组将允许 SSH 和 HTTP 将流量传入实例。
domain_2.conf和domain_1.conf:包含虚拟主机配置。
main.tf:所有 .tf 文件的主要/主要入口点。
配置设置
步骤 1. 首先创建一个工作目录来保存所有 .tf 文件:
步骤2.创建userdata.sh文件:
现在将以下行粘贴到其中:
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.domain1.com >> /etc/hosts"
sudo sh -c "echo 127.0.0.1 www.domain2.com >> /etc/hosts"
sudo mkdir -p /var/www/domain_1/public_html
sudo mkdir -p /var/www/domain_2/public_html
sudo chown -R $USER:$USER /var/www/domain_1/public_html
sudo chown -R $USER:$USER /var/www/domain_2/public_html
sudo chmod -R 755 /var/www
sudo echo “This is Virtual Host 1.” > /var/www/domain_1/public_html/index.html
sudo echo “This is Virtual Host 2.” > /var/www/domain_2/public_html/index.html
sudo cp /home/ubuntu/domain_1.conf /etc/apache2/sites-available/domain_1.conf
sudo cp /home/ubuntu/domain_2.conf /etc/apache2/sites-available/domain_2.conf
sudo a2ensite domain_1.conf
sudo a2ensite domain_2.conf
sudo a2dissite 000-default.conf
sudo systemctl restart apache2
在上面的脚本中,我们安装了一个 apache Web 服务器并修改了主机的文件,将 localhost 地址映射到我们要配置的两个虚拟主机的域名。此外,我们还为新网站配置了 Web 服务器并禁用了默认服务器。
步骤 3. 创建 secgrp.tf 文件以允许来自任何地方的 SSH 和 HTTP 入口流量以及到任何地方的传出流量。
将以下行粘贴到其中:
name = "sec-grpg"
description = "Allow HTTP and SSH traffic via Terraform"
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. 对于虚拟主机配置,创建两个文件:domain_1.conf 和domain_2.conf。请注意每个文件中的文档根位置。
一、$nanodomain_1.conf
ServerAdmin admin@domain1.com
ServerName domain1
ServerAlias www.domain1.com
DocumentRoot /var/www/domain_1/public_html
ErrorLog ${APACHE_LOG_DIR}/error.log
</VirtualHost>
二. $纳米域_2.conf
ServerAdmin admin@domain2.com
ServerName domain2
ServerAlias www.domain2.com
DocumentRoot /var/www/domain_2/public_html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
步骤5.最后,创建main.tf以完成基础设施声明:
provider "aws" {
region ="us-east-1"
}
resource "aws_instance" "webserver" {
ami ="ami-09d56f8956ab235b3"
instance_type = "t2.micro"
key_name = "Name-of-your-Ec2-Key-pair"
vpc_security_group_ids = [aws_security_group.demo-sg.id]
associate_public_ip_address = true
provisioner "file" {
source = "domain_1.conf"
destination = "/home/ubuntu/domain_1.conf"
connection {
type = "ssh"
user = "ubuntu"
private_key = "${file("/Path/to//EC2-keyPair.pem")}"
host = "${self.public_dns}"
}
}
provisioner "file" {
source = "domain_2.conf"
destination = "/home/ubuntu/domain_2.conf"
connection {
type = "ssh"
user = "ubuntu"
private_key = "${file("/Path/to//EC2-keyPair.pem")}"
host = "${self.public_dns}"
}
}
user_data = "${file("userdata.sh")}"
tags = {
Name = "VirtualHosts"
}
}
output "IPAddress" {
value = "${aws_instance.webserver.public_ip}"
}
在上面的 .tf 文件中,我们使用文件配置程序将“domain.conf”文件从本地系统复制到 EC2 实例。该“domain.conf”将用作模板文件,用于制作特定于域的虚拟主机文件,即“domain_1.conf”和“domain_2.conf”。
步骤6.现在我们所有的配置文件都准备好了;现在是实际部署此配置的时候了。使用以下命令初始化项目目录:
最后,通过运行以下命令构建项目:
当询问时,在终端上输入“yes”。在您的 EC2 实例中,使用“curl”命令查看每个域地址显示的内容:
结论
虚拟主机是一种非常有效的技术,可以从单个服务器管理多个网站。在本实验中,我们了解了如何使用 Terraform 来部署简单的双主机基础设施。尝试通过实施 Terraform 模块来使此配置更具可扩展性。