Cách cấu hình máy chủ ảo Apache trên Ubuntu bằng Terraform

theanh

Administrator
Nhân viên
Để lưu trữ nhiều trang web, quản trị viên thường dựa vào kỹ thuật 'Lưu trữ ảo'. Lưu trữ ảo lưu trữ nhiều trang web bằng một máy duy nhất. Có thể đạt được điều này bằng phương pháp 'dựa trên IP' hoặc phương pháp 'dựa trên tên'. Trong lưu trữ 'dựa trên IP', chúng ta có các địa chỉ IP riêng biệt cho mỗi trang web. Trong trường hợp lưu trữ 'dựa trên tên', chúng ta có nhiều tên chạy trên mỗi địa chỉ IP.

Hiện nay có nhiều công cụ để tự động hóa cơ sở hạ tầng dựa trên đám mây. Terraform là một công cụ như vậy gần đây đã trở nên cực kỳ phổ biến trong thế giới DevOps. Terraform là một công cụ nguồn mở do HashiCorp phát triển và bảo trì. Công cụ này sử dụng Ngôn ngữ cấu hình Hashicorp - HCL để cung cấp nhiều nhà cung cấp dịch vụ đám mây. Về cơ bản, Terraform sẽ so sánh cấu hình cơ sở hạ tầng hiện tại của bạn với trạng thái mong muốn và chỉ sửa đổi những phần cơ sở hạ tầng cần thiết để đạt đến trạng thái mong muốn.

Chúng ta sẽ đề cập đến những gì?​

Trong hướng dẫn này, chúng ta sẽ xem cách lưu trữ hai máy chủ ảo trên hệ thống Ubuntu 22.04 bằng Terraform. Chúng tôi sẽ sử dụng máy chủ web Apache để thực hiện bài lab này.

Kiểm tra trước khi bay​

Trước khi tiến hành, hãy kiểm tra các yêu cầu để thực hiện hướng dẫn này:
  1. Cơ bản về Terraform.
  2. Terraform phải được cài đặt trên hệ thống cục bộ của bạn.
  3. Tài khoản AWS được định cấu hình trên hệ thống cục bộ của bạn.
  4. Cơ bản về thiết lập máy chủ ảo bằng máy chủ web Apache.

Thiết lập bài lab​

Trên máy chủ Ubuntu 22.04 của chúng tôi, chúng tôi sẽ tiến hành cài đặt máy chủ web Apache, sau đó chúng tôi sẽ định cấu hình máy chủ ảo, trong đó mỗi máy chủ ảo có một tệp index.html khác nhau: "Trang web từ: Máy chủ ảo 1." cho vhost1 và "Trang web từ: Máy chủ ảo 2." đối với vhost2.

Ngoài ra, để đơn giản hóa mọi thứ, chúng tôi đã ánh xạ tên miền cho hai vhost (máy chủ ảo) thành địa chỉ IP của máy chủ cục bộ (127.0.0.1). Phòng thí nghiệm này sử dụng nhiều tệp để tạo ra một môi trường làm việc rõ ràng. Mô tả về các tệp như sau:
  1. userdata.sh: Đây là một tập lệnh bash sẽ thiết lập máy chủ EC2 và cấu hình máy chủ web cho các máy chủ ảo.
  2. sec-grp.tf: Nó định nghĩa một tài nguyên để tạo nhóm bảo mật.
  3. vhost-template.tf: Tệp chứa cấu hình thực tế sẽ được sử dụng.
  4. main.tf: Tại đây, tài nguyên máy chủ web và phần còn lại của cơ sở hạ tầng được khai báo.
Bạn cũng có thể hợp nhất nhiều tệp nhưng điều đó sẽ gây ra nhiều phức tạp hơn khi xem xét mã. Bây giờ chúng ta hãy tiến hành các bước chính:

Bước 1. Bắt đầu bằng cách tạo một thư mục nơi chúng ta sẽ đặt tất cả các tệp dự án:
Mã:
$ mkdir virtual-hosts-terraform
Bước 2. Để thiết lập phiên bản EC2 cho dịch vụ lưu trữ ảo, chúng ta sẽ sử dụng một tập lệnh userdata. Điều này cũng sẽ tự động hóa cấu hình máy chủ chung của chúng tôi:
Mã:
$ vi userdata.sh
Mã:
#!/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 "Trang web từ: Máy chủ ảo 1." > /var/www/vhost_1/public_html/index.html

sudo echo "Trang web từ: Máy chủ ảo 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
Bước 3. Tiếp theo, chúng ta sẽ cấu hình tài nguyên nhóm bảo mật để thiết lập các quy tắc lưu lượng truy cập đến và đi. Cho phép lưu lượng truy cập SSH và HTTP đến từ mọi phía và lưu lượng truy cập ra (đi) đến mọi nơi:
Mã:
$ vi sec-grp.tf
Mã:
resource "aws_security_group" "ec2-sg" {

 name = "ec2-grp"

 description = "Đặt quy tắc Ingress và Egress "


 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"]

 }


 thoát {

 từ_cảng = 0

 đến_cảng = 0

 giao thức = "-1"

 cidr_blocks = ["0.0.0.0/0"]

 }

}
Bước 4. Tệp này chứa cấu hình thực tế cho mỗi máy chủ ảo. Phần ‘<VirtualHost>’ đầu tiên chứa mục nhập cho vhost1. Tương tự, mục nhập thứ hai tương ứng với vhost2vhost2. Bạn có thể thêm nhiều mục vhost hơn tại đây:
Mã:
$ vi vhost-template.conf
Mã:
 ServerAdmin [emailprotected]

 ServerName vhost1

 ServerAlias www.vhost1.com

 DocumentRoot /var/www/vhost_1/public_html


 ErrorLog ${APACHE_LOG_DIR}/error.log








 ServerAdmin [emailprotected]

 ServerName vhost2

 ServerAlias www.vhost2.com

 DocumentRoot /var/www/vhost_2/public_html


 ErrorLog ${APACHE_LOG_DIR}/error.log
Bước 5. Trong tệp main.tf, hãy khai báo tài nguyên máy chủ web và thiết lập phần còn lại của cơ sở hạ tầng:
Mã:
$ vi main.tf
Mã:
provider "aws" {

 region ="us-east-1"

}


resource "aws_instance" "webserver" {

 ami ="ami-09d56f8956ab235b3"

 instance_type = "t2.micro"

 key_name = "[B]Name-of-EC2-Key-Pair[/b]"

 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("[B]/Path/to/EC2-Key-Pair[/b]")}"

 host = "${self.public_dns}"

 }

 }



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



 tags = {

 Name = "VirtualHostTutorial"

 }

}

 


output "IPAddress" {

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

}
File provisioner được sử dụng để tải tệp 'vhost-template.conf' lên phiên bản EC2. Khối đầu ra in tên DNS công khai của phiên bản. Tương tự như vậy, lệnh 'file' thực thi tập lệnh userdata.



Bước 6. Bây giờ khởi tạo thư mục dự án bằng lệnh 'init' theo sau là lệnh 'apply':
Mã:
$ terraform init
Mã:
$ terraform apply







Kiểm tra thiết lập​

Bây giờ hãy SSH vào phiên bản của bạn và chạy lệnh:
Mã:
$ curl www.vhost1.com
Lệnh trên sẽ trả về thông báo từ trang chỉ mục virtual host1, tương tự như lệnh bên dưới sẽ hiển thị thông báo từ virtual host2:
Mã:
$ curl www.vhost2.com

Kết luận​

Cuối cùng chúng ta cũng đã thành công, dịch vụ lưu trữ ảo của chúng ta đang hoạt động như mong đợi. Chúng ta cũng có thể thực hiện hướng dẫn này bằng Terraform, hãy thử xem nhé.
 
Back
Bên trên