Giới thiệu

A Vùng chứa Linux là một nhóm các quá trình được phân lập từ phần còn lại của hệ thống thông qua việc sử dụng các tính năng bảo mật hạt nhân Linux, chẳng hạn như các không gian tên và các nhóm điều khiển. Nó là một cấu trúc tương tự như một máy ảo, nhưng nó nhẹ hơn nhiều; bạn không có chi phí của việc chạy thêm một hạt nhân, hoặc mô phỏng phần cứng. Điều này có nghĩa là bạn có thể dễ dàng tạo nhiều vùng chứa trên cùng một máy chủ. Sử dụng các thùng chứa Linux, bạn có thể chạy nhiều phiên bản của toàn bộ hệ điều hành, bị giới hạn, trên cùng một máy chủ, hoặc gói ứng dụng của bạn và các phụ thuộc của nó trong một vùng chứa mà không ảnh hưởng đến phần còn lại của hệ thống.

Ví dụ, hãy tưởng tượng rằng bạn có một máy chủ và bạn đã thiết lập một số dịch vụ, bao gồm các trang web, cho khách hàng của bạn. Trong một cài đặt truyền thống, mỗi trang web sẽ là một máy chủ ảo của cùng một cá thể của máy chủ web Apache hoặc Nginx. Nhưng với các thùng chứa Linux, mỗi trang web sẽ được cấu hình trong vùng chứa riêng của nó, với máy chủ web của riêng nó.

Chúng ta có thể sử dụng LXD để tạo và quản lý các vùng chứa này. LXD cung cấp một dịch vụ hypervisor để quản lý toàn bộ vòng đời của container.

Trong hướng dẫn này, bạn sẽ sử dụng LXD để cài đặt hai trang web dựa trên Nginx trên cùng một máy chủ, mỗi trang bị giới hạn trong vùng chứa riêng của nó. Sau đó, bạn sẽ cài đặt HAProxy trong một thùng chứa thứ ba sẽ hoạt động như một proxy ngược. Sau đó, bạn sẽ định tuyến lưu lượng truy cập đến vùng chứa HAProxy để làm cho cả hai trang web có thể truy cập từ Internet.

Điều kiện tiên quyết

Để hoàn thành hướng dẫn này, bạn sẽ cần những điều sau đây:

  • Một máy chủ Ubuntu 16.04, được cấu hình bằng cách làm theo hướng dẫn Thiết lập máy chủ ban đầu với Ubuntu 16.04, với người dùng không phải root sudo và tường lửa.
  • Hai tên miền đủ điều kiện (FQDN), với mỗi DNS A bản ghi trỏ đến địa chỉ IP của máy chủ của bạn. Để cấu hình, hãy làm theo hướng dẫn Cách thiết lập tên máy chủ với DigitalOcean.
  • Tùy chọn, thêm 20GB dung lượng lưu trữ khối trở lên bằng cách làm theo hướng dẫn Bắt đầu với lưu trữ khối DigitalOcean. Bạn có thể sử dụng điều này để lưu trữ tất cả dữ liệu liên quan đến vùng chứa.

Bước 1 - Thêm người dùng của bạn vào lxd Nhóm

Đăng nhập vào máy chủ bằng tài khoản người dùng không phải root. Chúng tôi sẽ sử dụng tài khoản không phải người dùng này để thực hiện tất cả các tác vụ quản lý vùng chứa. Để làm việc này, trước tiên bạn phải thêm người dùng này vào lxd nhóm. Làm điều này với lệnh sau:

sudo usermod --append --groups lxd sammy

Đăng xuất khỏi máy chủ và đăng nhập lại để phiên SSH mới của bạn sẽ được cập nhật với tư cách thành viên nhóm mới. Sau khi đăng nhập, bạn có thể bắt đầu cấu hình LXD.

Bước 2 - Cấu hình LXD

LXD cần phải được cấu hình đúng cách trước khi bạn có thể sử dụng nó. Quyết định cấu hình quan trọng nhất là loại lưu trữ phụ trợ để lưu trữ các thùng chứa. Chương trình phụ trợ lưu trữ được đề xuất cho LXD là hệ thống tệp ZFS, được lưu trữ trong tệp được preallocated hoặc bằng cách sử dụng Khối lưu trữ. Để sử dụng hỗ trợ ZFS trong LXD, hãy cài đặt zfsutils-linux gói:

sudo apt-get update

sudo apt-get install zfsutils-linux

Với cài đặt đó, bạn đã sẵn sàng để khởi tạo LXD. Trong quá trình khởi tạo, bạn sẽ được nhắc chỉ định chi tiết cho phần lưu trữ ZFS lưu trữ. Có hai phần tiếp theo, tùy thuộc vào việc bạn có muốn sử dụng tệp được phân bổ hoặc chặn lưu trữ hay không. Thực hiện theo các bước thích hợp cho trường hợp của bạn. Khi bạn đã chỉ định cơ chế lưu trữ, bạn sẽ định cấu hình các tùy chọn mạng cho vùng chứa của mình.

Tùy chọn 1 - Sử dụng Tệp được Preallocated

Làm theo các bước sau để định cấu hình LXD để sử dụng tệp preallocated để lưu trữ vùng chứa. Đầu tiên, thực hiện lệnh sau để bắt đầu quá trình khởi tạo LXD:

sudo lxd init

Bạn sẽ được nhắc cung cấp một số thông tin, như được hiển thị trong đầu ra sau. Chúng tôi sẽ chọn tất cả các giá trị mặc định, bao gồm kích thước được đề xuất cho tệp được phân bổ trước, được gọi là thiết bị vòng lặp:

OutputName of the storage backend to use (dir or zfs) [default=zfs]: zfs
Create a new ZFS pool (yes/no) [default=yes]? yes
Name of the new ZFS pool [default=lxd]: lxd
Would you like to use an existing block device (yes/no) [default=no]? no
Size in GB of the new loop device (1GB minimum) [default=15]: 15
Would you like LXD to be available over the network (yes/no) [default=no]? no
Do you want to configure the LXD bridge (yes/no) [default=yes]? yes
Warning: Stopping lxd.service, but it can still be activated by:
  lxd.socket
LXD has been successfully configured.

Kích thước được đề xuất được tính tự động từ không gian đĩa sẵn có của máy chủ của bạn.

Khi thiết bị được định cấu hình, bạn sẽ định cấu hình cài đặt mạng mà chúng tôi sẽ khám phá sau phần tùy chọn tiếp theo.

Tùy chọn 2 - Sử dụng bộ nhớ khối

Nếu bạn định sử dụng Block Storage, bạn sẽ cần phải tìm thiết bị trỏ đến khối lượng lưu trữ khối mà bạn đã tạo để xác định nó trong cấu hình của LXD. Đi đến Tập tab trong Ngăn điều khiển DigitalOceanl, xác định khối lượng của bạn, nhấp vào Hơn bật lên và sau đó nhấp vào Hướng dẫn cấu hình.

Định vị thiết bị bằng cách xem lệnh để định dạng âm lượng. Cụ thể, hãy tìm đường dẫn được chỉ định trong sudo mkfs.ext4 -F chỉ huy. Hình dưới đây cho thấy một ví dụ về khối lượng. Bạn chỉ cần phần được gạch dưới:

The config instructions show the device for the created block storage.

Trong trường hợp này, tên khối lượng là /dev/disk/by-id/scsi-0D0_Volume_volume-fra1-01, mặc dù bạn có thể khác nhau.

Một khi bạn xác định khối lượng, quay trở lại thiết bị đầu cuối của bạn và đưa ra lệnh sau để bắt đầu quá trình khởi tạo LXD.

sudo lxd init

Bạn sẽ được trình bày với hàng loạt câu hỏi. Trả lời các câu hỏi như được hiển thị trong kết quả sau:

OutputName of the storage backend to use (dir or zfs) [default=zfs]: zfs
Create a new ZFS pool (yes/no) [default=yes]? yes
Name of the new ZFS pool [default=lxd]: lxd

Khi bạn được nhắc về việc sử dụng thiết bị chặn hiện có, hãy chọn yes và cung cấp đường dẫn đến thiết bị của bạn:

Output of the "lxd init" commandWould you like to use an existing block device (yes/no) [default=no]? yes
Path to the existing block device: /dev/disk/by-id/scsi-0DO_Volume_volume-fra1-01

Sau đó, sử dụng giá trị mặc định cho các câu hỏi còn lại:

Output of the "lxd init" commandWould you like LXD to be available over the network (yes/no) [default=no]? no
Do you want to configure the LXD bridge (yes/no) [default=yes]? yes
Warning: Stopping lxd.service, but it can still be activated by:
  lxd.socket
LXD has been successfully configured.

Khi quá trình hoàn tất, bạn sẽ định cấu hình mạng.

Định cấu hình mạng

Quá trình khởi tạo sẽ giới thiệu cho chúng ta một loạt các màn hình như hình dưới đây cho phép chúng ta cấu hình cầu nối mạng cho các thùng chứa để chúng có thể nhận các địa chỉ IP riêng, giao tiếp với nhau và có quyền truy cập Internet.

LXD networking configuration

Sử dụng giá trị mặc định cho mỗi tùy chọn, nhưng khi được hỏi về mạng IPv6, hãy chọn Không, vì chúng ta sẽ không sử dụng nó trong hướng dẫn này.

Khi bạn đã hoàn thành cấu hình mạng, bạn đã sẵn sàng để tạo các vùng chứa của mình.

Bước 3 - Tạo vùng chứa

Chúng tôi đã định cấu hình thành công LXD. Chúng tôi đã chỉ định vị trí của phụ trợ lưu trữ và đã định cấu hình mạng mặc định cho bất kỳ vùng chứa mới được tạo nào. Chúng tôi sẵn sàng tạo và quản lý một số vùng chứa, chúng tôi sẽ thực hiện với lxc chỉ huy.

Hãy thử lệnh đầu tiên của chúng tôi, trong đó liệt kê các thùng chứa đã được cài đặt sẵn:

lxc list

Bạn sẽ thấy kết quả sau:

Output of the "lxd list" commandGenerating a client certificate. This may take a minute...
If this is your first time using LXD, you should also run: sudo lxd init
To start your first container, try: lxc launch ubuntu:16.04

+------+-------+------+------+------+-----------+
| NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS |
+------+-------+------+------+------+-----------+

Vì đây là lần đầu tiên lxc lệnh giao tiếp với trình quản lý siêu dữ liệu LXD, đầu ra cho chúng ta biết rằng lệnh này sẽ tự động tạo ra một chứng chỉ ứng dụng khách để liên lạc an toàn với LXD. Sau đó, nó hiển thị một số thông tin về cách khởi chạy vùng chứa. Cuối cùng, lệnh này hiển thị danh sách các vùng chứa trống, được mong đợi vì chúng tôi chưa tạo bất kỳ vùng chứa nào.

Hãy tạo ba thùng chứa. Chúng tôi sẽ tạo một cho mỗi máy chủ web và một vùng chứa thứ ba cho proxy ngược lại. Mục đích của proxy ngược lại là hướng các kết nối đến từ Internet đến đúng máy chủ web trong vùng chứa.

Chúng tôi sẽ sử dụng lxc launch lệnh để tạo và khởi động Ubuntu 16.04 (ubuntu:x) vùng chứa có tên web1. Các x trong ubuntu:x là một phím tắt cho chữ cái đầu tiên của Xenial, tên mã của Ubuntu 16.04. ubuntu: là định danh cho kho lưu trữ hình ảnh LXD được định cấu hình sẵn.

chú thích: Bạn có thể tìm danh sách đầy đủ tất cả các hình ảnh Ubuntu có sẵn bằng cách chạy lxc image list ubuntu: và các bản phân phối khác bằng cách chạy lxc image list images:.

Thực hiện các lệnh sau để tạo các vùng chứa:

lxc launch ubuntu:x web1

lxc launch ubuntu:x web2

lxc launch ubuntu:x haproxy

Vì đây là lần đầu tiên chúng tôi tạo một vùng chứa, lệnh đầu tiên tải xuống hình ảnh vùng chứa từ Internet và lưu trữ nó cục bộ. Hai thùng chứa tiếp theo sẽ được tạo nhanh hơn đáng kể.

Ở đây bạn có thể thấy kết quả mẫu từ việc tạo vùng chứa web1.

OutputCreating web1
Retrieving image: 100%
Starting web1

Bây giờ chúng ta đã tạo ra ba thùng chứa vani rỗng, hãy sử dụng lxc list lệnh để hiển thị thông tin về chúng:

lxc list

Đầu ra cho thấy một bảng có tên của mỗi vùng chứa, trạng thái hiện tại của nó, địa chỉ IP của nó, kiểu của nó và liệu có các ảnh chụp nhanh được chụp hay không.

Output

+---------+---------+-----------------------+------+------------+-----------+
|  NAME   |  STATE  |         IPV4          | IPV6 |    TYPE    | SNAPSHOTS |
+---------+---------+-----------------------+------+------------+-----------+
| haproxy | RUNNING | 10.10.10.10 (eth0)    |      | PERSISTENT | 0         |
+---------+---------+-----------------------+------+------------+-----------+
| web1    | RUNNING | 10.10.10.100 (eth0)   |      | PERSISTENT | 0         |
+---------+---------+-----------------------+------+------------+-----------+
| web2    | RUNNING | 10.10.10.200 (eth0)   |      | PERSISTENT | 0         |
+---------+---------+-----------------------+------+------------+-----------+

Lưu ý các tên vùng chứa và địa chỉ IPv4 tương ứng của chúng. Bạn sẽ cần chúng để định cấu hình dịch vụ của mình.

Bước 4 - Cấu hình các thùng chứa Nginx

Hãy kết nối với web1 chứa và cấu hình máy chủ web đầu tiên.

Để kết nối, chúng tôi sử dụng lxc exec lệnh, lấy tên của vùng chứa và các lệnh để thực thi. Thực hiện lệnh sau để kết nối với vùng chứa:

lxc exec web1 -- sudo --login --user ubuntu

Các -- chuỗi biểu thị rằng các tham số lệnh cho lxc nên dừng ở đó, và phần còn lại của dòng sẽ được truyền như lệnh được thực thi bên trong thùng chứa. Lệnh này là sudo --login --user ubuntu, cung cấp vỏ đăng nhập cho tài khoản được định cấu hình sẵn ubuntu bên trong thùng chứa.

Chú thích: Nếu bạn cần kết nối với các thùng chứa như nguồn gốc, bạn có thể sử dụng lệnh lxc exec web1 -- /bin/bash thay thế.

Khi bên trong container, dấu nhắc shell của chúng ta bây giờ trông giống như sau.

Outputubuntu@web1:~$

Điều này ubuntu người dùng trong vùng chứa đã được định cấu hình sẵn sudo truy cập và có thể chạy sudo lệnh mà không cần cung cấp mật khẩu. Vỏ này bị giới hạn bên trong phần giới hạn của thùng chứa. Bất cứ thứ gì mà chúng ta chạy trong trình bao này vẫn nằm trong vùng chứa và không thể thoát khỏi máy chủ lưu trữ.

Hãy cập nhật danh sách gói của cá thể Ubuntu bên trong thùng chứa và cài đặt Nginx:

sudo apt-get update

sudo apt-get install nginx

Hãy chỉnh sửa trang web mặc định cho trang web này và thêm một số văn bản làm rõ rằng trang web này được lưu trữ trong web1 thùng đựng hàng. Mở tập tin /var/www/html/index.nginx-debian.html:

sudo nano /var/www/html/index.nginx-debian.html

Thực hiện thay đổi sau đối với tệp:

Edited file /var/www/html/index.nginx-debian.html

<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx on LXD container web1!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx on LXD container web1!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
...

Chúng tôi đã chỉnh sửa tệp ở hai nơi và đã thêm văn bản cụ thể on LXD container web1. Lưu tệp và thoát khỏi trình chỉnh sửa của bạn.

Bây giờ đăng xuất khỏi vùng chứa và quay trở lại máy chủ lưu trữ:

logout

Lặp lại quy trình này cho web2 thùng đựng hàng. Đăng nhập, cài đặt Nginx, và sau đó chỉnh sửa tệp /var/www/html/index.nginx-debian.html đề cập đến web2. Sau đó thoát khỏi web2 thùng đựng hàng.

Hãy sử dụng curl để kiểm tra xem các máy chủ web trong các thùng chứa có hoạt động không. Chúng tôi cần địa chỉ IP của các vùng chứa web được hiển thị trước đó.

curl http://10.10.10.100/

Đầu ra phải là:

Output of "curl http://10.10.10.100/" command<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx on LXD container web1!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx on LXD container web1!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
...

Kiểm tra container thứ hai, sử dụng curl lệnh và địa chỉ IP của nó để xác minh nó cũng được thiết lập chính xác. Với cả hai thùng chứa được cấu hình, chúng ta có thể chuyển sang thiết lập HAProxy.

Bước 5 - Cấu hình thùng chứa HAProxy

Chúng tôi sẽ thiết lập HAProxy như một proxy ở phía trước của các container. Nếu bạn cần thêm thông tin về cách hoạt động của tính năng này, hãy xem lại hướng dẫn Giới thiệu về các khái niệm HAProxy và Load Balancing. Chúng tôi sẽ hướng lưu lượng truy cập đến từng vùng chứa dựa trên tên miền mà chúng tôi sử dụng. Chúng tôi sẽ sử dụng tên miềnexample.com trong ví dụ cấu hình sau, là miền đặc biệt dành riêng cho tài liệu như hướng dẫn này. Chúng tôi sẽ làm cho trang web đầu tiên có sẵn tại tên máy chủ example.comwww.example.com. Trang web thứ hai sẽ có tại www2.example.com. Thay thế tên miền của riêng bạn thay cho các tên miền này.

Đăng nhập vào haproxy thùng đựng hàng:

lxc exec haproxy -- sudo --login --user ubuntu

Cập nhật danh sách các gói cài đặt và cài đặt HAProxy:

sudo apt-get update

sudo apt-get install haproxy

Khi quá trình cài đặt hoàn tất, chúng ta có thể cấu hình HAProxy. Tệp cấu hình cho HAProxy được đặt tại /etc/haproxy/haproxy.cfg. Mở tệp bằng trình chỉnh sửa văn bản yêu thích của bạn.

sudo nano /etc/haproxy/haproxy.cfg

Trước tiên, chúng tôi sẽ thực hiện một số thay đổi đối với defaults phần. Chúng tôi sẽ thêm forwardfor để chúng tôi giữ lại IP nguồn thực của ứng dụng web và chúng tôi sẽ thêm http-server-close tùy chọn, cho phép sử dụng lại phiên và độ trễ thấp hơn.

/etc/haproxy/haproxy.conf

global
...
defaults
    log global
    mode    http
    option  httplog
    option  dontlognull
    option   forwardfor
    option   http-server-close
    timeout connect 5000
    timeout client  50000
    timeout server  50000
...

Tiếp theo, chúng tôi sẽ định cấu hình giao diện người dùng để trỏ đến hai vùng chứa phụ trợ của chúng tôi. Thêm mới frontend phần được gọi là www_frontend trông như thế này:

/etc/haproxy/haproxy.conf

frontend www_frontend
    bind *:80     # Bind to port 80 (www) on the container

    # It matches if the HTTP Host: field mentions any of the hostnames (after the '-i').
    acl host_web1 hdr(host) -i example.com www.example.com
    acl host_web2 hdr(host) -i web2.example.com

    # Redirect the connection to the proper server cluster, depending on the match.
    use_backend web1_cluster if host_web1
    use_backend web2_cluster if host_web2

Các acl lệnh khớp với tên máy chủ của máy chủ web và chuyển hướng các yêu cầu đến tương ứng backend phần.

Sau đó, chúng tôi xác định hai mới backend các phần, một cho mỗi máy chủ web và đặt tên cho chúng web1_clusterweb2_cluster tương ứng. Thêm mã sau vào tệp để xác định các phần phụ trợ:

/etc/haproxy/haproxy.conf

backend web1_cluster
    balance leastconn
    # We set the X-Client-IP HTTP header. This is useful if we want the web server to know the real client IP.
    http-request set-header X-Client-IP %[src]
    # This backend, named here "web1", directs to container "web1.lxd" (hostname).
    server web1 web1.lxd:80 check

backend web2_cluster
    balance leastconn
    http-request set-header X-Client-IP %[src]
    server web2 web2.lxd:80 check

Các balance tùy chọn biểu thị chiến lược cân bằng tải. Trong trường hợp này, chúng tôi chọn ít nhất số kết nối. Các http-request tùy chọn đặt tiêu đề HTTP với IP máy khách web thực. Nếu chúng tôi không đặt tiêu đề này, máy chủ web sẽ ghi lại địa chỉ IP HAProxy làm IP nguồn cho tất cả các kết nối, khiến việc phân tích lưu lượng truy cập của bạn trở nên khó khăn hơn ở đâu. Các server tùy chọn chỉ định tên tùy ý cho máy chủ (web1), tiếp theo là tên máy chủ và cổng của máy chủ ..

LXD cung cấp máy chủ DNS cho các vùng chứa, vì vậy web1.lxd giải quyết với IP được liên kết với web1 thùng đựng hàng. Các vùng chứa khác có tên máy chủ riêng của chúng, chẳng hạn như web2.lxdhaproxy.lxd.

Các check tham số cho HAPRoxy thực hiện kiểm tra sức khỏe trên máy chủ web để đảm bảo nó có sẵn.

Để kiểm tra xem cấu hình có hợp lệ hay không, hãy chạy lệnh sau:

/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -c

Đầu ra phải là

Output

Configuration file is valid

Hãy tải lại HAProxy để nó đọc cấu hình mới.

sudo systemctl reload haproxy

Bây giờ đăng xuất khỏi vùng chứa để quay trở lại máy chủ lưu trữ.

logout

Chúng tôi đã cấu hình HAProxy hoạt động như một proxy ngược mà chuyển tiếp bất kỳ kết nối nào mà nó nhận được trên cổng 80 đến máy chủ web thích hợp trong hai vùng chứa khác. Hãy kiểm tra haproxy thực sự quản lý để chuyển tiếp các yêu cầu tới vùng chứa web chính xác. Thực hiện lệnh này:

curl --verbose --header 'Host: web2.example.com' http://10.10.10.10

Điều này làm cho một yêu cầu để HAProxy và thiết lập một HTTP host tiêu đề, mà HAProxy nên sử dụng để chuyển hướng kết nối đến máy chủ web thích hợp.

Đầu ra phải là

Output of "curl --verbose --header 'Host: web2.example.com' http://10.10.10.10" command...
> GET / HTTP/1.1
> Host: web2.example.com
> User-Agent: curl/7.47.0
> Accept: */*
> 
...
< 
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx on LXD container web2!</title>
<style>
...

HAProxy đã hiểu đúng yêu cầu và chuyển tiếp nó đến web2 thùng đựng hàng. Ở đó, máy chủ web đã phục vụ trang chỉ mục mặc định mà chúng tôi đã chỉnh sửa trước đó và hiển thị văn bản on LXD container web2. Bây giờ chúng ta hãy định tuyến các yêu cầu bên ngoài cho HAProxy để thế giới có thể truy cập các trang web của chúng tôi.

Bước 6 - Chuyển tiếp kết nối đến hộp chứa HAProxy

Phần cuối cùng của câu đố là kết nối proxy ngược với Internet. Chúng tôi cần thiết lập máy chủ để chuyển tiếp bất kỳ kết nối nào mà máy chủ có thể nhận được từ Internet trên cổng 80 đến haproxy thùng đựng hàng.

HAProxy được cài đặt trong một thùng chứa, và, theo mặc định, là không thể truy cập từ Internet. Để giải quyết vấn đề này, chúng tôi sẽ tạo iptables quy tắc để chuyển tiếp kết nối.

Các iptables lệnh yêu cầu hai địa chỉ IP: địa chỉ IP công cộng của máy chủ (your_server_ip) và địa chỉ IP riêng của haproxy thùng đựng hàng (your_haproxy_ip), mà bạn có thể đạt được với lxc list chỉ huy.

Thực hiện lệnh này để tạo quy tắc:

sudo iptables -t nat -I PREROUTING -i eth0 -p TCP -d your_server_ip/32 --dport 80 -j DNAT --to-destination your_haproxy_ip:80

Đây là cách lệnh chia nhỏ:

  • -t nat chỉ định rằng chúng tôi đang sử dụng nat bàn.
  • -I PREROUTING xác định rằng chúng tôi đang thêm quy tắc vào chuỗi PREROUTING.
  • -i eth0 chỉ định giao diện eth0, là giao diện công khai mặc định trên các giọt.
  • -p TCP nói rằng chúng tôi đang sử dụng giao thức TCP.
  • -d your_server_ip/32 chỉ định địa chỉ IP đích cho quy tắc.
  • --dport 80: chỉ định cổng đích.
  • -j DNAT nói rằng chúng tôi muốn thực hiện một bước nhảy đến Destination NAT (DNAT).
  • --to-destination your_haproxy_ip:80 nói rằng chúng tôi muốn yêu cầu chuyển đến địa chỉ IP của vùng chứa với HAProxy.

Tìm hiểu thêm về IPTables trong Cách hoạt động của tường lửa Iptables và Các yếu tố cần thiết về IPtables: Các quy tắc và lệnh tường lửa phổ biến.

Cuối cùng, để lưu điều này iptables lệnh để nó được áp dụng lại sau khi khởi động lại, chúng tôi cài đặt iptables-persistent gói:

sudo apt-get install iptables-persistent

Khi cài đặt gói, bạn sẽ được nhắc lưu các quy tắc iptables hiện tại. Chấp nhận và lưu tất cả hiện tại iptables quy tắc.

Nếu bạn đã thiết lập hai FQDN, thì bạn sẽ có thể kết nối với mỗi trang web bằng trình duyệt web của bạn. Hãy dùng thử.

Để kiểm tra xem hai máy chủ Web có thực sự truy cập được từ Internet hay không, hãy truy cập mỗi máy chủ từ máy tính cục bộ của bạn bằng cách sử dụng curl lệnh như thế này:

curl --verbose --header 'Host: example.com' 'http://your_server_ip'

curl --verbose --header 'Host: web2.example.com' 'http://your_server_ip'

Các lệnh này tạo các kết nối HTTP đến địa chỉ IP công cộng của máy chủ và thêm một trường tiêu đề HTTP với --header tùy chọn mà HAProxy sẽ sử dụng để xử lý yêu cầu, giống như bạn đã làm trong Bước 5.

Đây là đầu ra của curl chỉ huy:

Output*   Trying your_server_ip...
* Connected to your_server_ip (your_server_ip) port 80 (#0)
> GET / HTTP/1.1
> Host: example.com
> User-Agent: curl/7.47.0
> Accept: */*
> 
< HTTP/1.1 200 OK
< Server: nginx/1.10.0 (Ubuntu)
...
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx on LXD container web1!</title>
<style>
    body {
...

Đây là đầu ra của giây curl chỉ huy:

Output*   Trying your_server_ip...
* Connected to your_server_ip (your_server_ip) port 80 (#0)
> GET / HTTP/1.1
> Host: web2.example.com
> User-Agent: curl/7.47.0
> Accept: */*
> 
< HTTP/1.1 200 OK
< Server: nginx/1.10.0 (Ubuntu)
...
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx on LXD container web2!</title>
<style>
    body {
...

Trong cả hai trường hợp, trang web chính xác được hiển thị.

Phần kết luận

Bạn đã thiết lập hai trang web, mỗi trang web trong vùng chứa của riêng mình, với lưu lượng truy cập HAProxy. Bạn có thể tái tạo quy trình này để định cấu hình nhiều trang web khác, mỗi trang bị giới hạn trong vùng chứa của chính nó.

Bạn cũng có thể thêm MySQL vào một vùng chứa mới và sau đó cài đặt CMS như WordPress để chạy từng trang web. Bạn cũng có thể sử dụng quy trình này để hỗ trợ các phiên bản phần mềm cũ hơn. Ví dụ: nếu cài đặt CMS yêu cầu phiên bản phần mềm cũ hơn như PHP5 thì bạn có thể cài đặt Ubuntu 14.04 trong vùng chứa (lxc launch ubuntu:t), thay vì cố gắng hạ cấp phiên bản trình quản lý gói có sẵn trên Ubuntu 16.04.

Cuối cùng, LXD cung cấp khả năng chụp nhanh các trạng thái đầy đủ của các thùng chứa, giúp dễ dàng tạo các bản sao lưu và các thùng chứa quay lại sau. Ngoài ra, nếu chúng ta cài đặt LXD trên hai máy chủ khác nhau, thì có thể kết nối chúng và di chuyển các thùng chứa giữa các máy chủ qua Internet.