专栏名称: 腾讯云加社区
目录
相关文章推荐
北美留学生观察  ·  日本县城高中,挤满中国中产娃... ·  6 小时前  
北美留学生观察  ·  藤校进入9万美元时代!扩招、涨价、割中产娃韭菜… ·  2 天前  
BioArt  ·  Cell | ... ·  3 天前  
51好读  ›  专栏  ›  腾讯云加社区

使用LXD搭建Web网站

腾讯云加社区  · 掘金  ·  · 2018-08-07 03:33

正文

阅读 76

使用LXD搭建Web网站

欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~

本文由 独木桥先生 发表于 云+社区专栏

介绍

Linux的容器 是Linux的一组进程,通过使用Linux内核功能与系统隔离。它是一个类似于虚拟机的构造,但它的更轻量级。您可以在同一台服务器上轻松创建多个容器。使用Linux容器,您可以在同一服务器上运行多个实例,或者将应用程序及其依赖项捆绑到容器中,而不会影响系统的其余部分。

假设您有一台服务器,并且已为您的客户设置了多项服务,按照Web应用来说,每个Web站点都是Apache或NginxWeb服务器的同一实例的虚拟主机。但是对于Linux容器,每个网站都在其自己的容器中配置,并具有自己的Web服务器。我们可以使用 LXD 来创建和管理这些容器。LXD提供管生命周期的容器管理。

在本教程中,您将使用LXD在同一服务器上安装两个基于Nginx的网站,每个网站都限制在自己的容器中。然后,您将在第三个容器中安装HAProxy,该容器将充当反向代理。然后,您将网站路由到HAProxy容器,以便从Internet访问这两个网站。

准备

要完成本教程,您需要以下内容:

  • 一台已经设置好可以使用 sudo 命令的非root账号的Ubuntu 服务器 ,并且已开启防火墙。没有服务器的同学可以在 这里购买 ,不过我个人更推荐您使用 免费 的腾讯云 开发者实验室 进行试验,学会安装后在 购买服务器
  • 两个域名 ,如果你没有域名,建议您先去这里 注册一个域名 ,您需要将域名解析到您的服务器,您可以使用 腾讯云云解析 进行快速设置。
  • 20GB以上存储空间,建议您使用腾讯云的 云硬盘 进行扩容。

第一步 - 将您的用户添加到lxd组

使用非root用户帐户登录服务器。我们将使用此帐户执行所有容器管理任务。为此,您必须先将此用户添加到lxd组。使用以下命令执行此操作:

sudo usermod --append --groups lxd sammy
复制代码

注销服务器并重新登录,以便使用新的组成员身份更新新的SSH会话。登录后,您可以开始配置LXD。

第二步 - 配置LXD

需要先配置LXD才能使用,最重要的配置取决于存储容器的后端类型。LXD的推荐存储后端是ZFS文件系统,请安装 zfsutils-linux 包:

sudo apt-get update
sudo apt-get install zfsutils-linux
复制代码

安装完成后,您就可以初始化LXD了。在初始化期间,系统将提示您指定ZFS存储后端。接下来有两个部分,具体取决于您是要使用预分配文件还是块存储。按照适合您情况的步骤进行操作。指定存储机制后,您将为容器配置网络选项。

使用预分配的文件

请按照以下步骤配置LXD以使用预分配的文件来存储容器。首先,执行以下命令以启动LXD初始化:

sudo lxd init
复制代码

系统将提示您提供信息,如以下输出所示。我们将选择默认值,包括预分配文件的建议大小。

Name 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.
复制代码

建议的大小将根据服务器的可用磁盘空间自动计算。配置设备后,您将配置网络设置。

配置网络

初始化过程将为我们提供一个GUI,如下图所示,让我们为容器配置网络桥接,以便它们可以获取私有IP地址,相互通信以及访问网络。

img

使用每个选项的默认值,但当被问及IPv6网络时,请选择 ,因为国内环境暂时不允许。

完成网络配置后,您就可以创建容器了。

第三步 - 创建容器

我们已成功配置LXD。我们指定了存储后端的位置,并为任何新创建的容器配置了默认网络。我们将准备创建和管理一些容器,我们将使用lxc命令。

让我们尝试我们的第一个命令,它列出了可用的已安装容器:

lxc list
复制代码

您将看到以下输出:

Generating 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 |
+------+-------+------+------+------+-----------+
复制代码

由于这是 lxc 命令第一次与LXD管理程序通信,因此输出让我们知道该命令会自动创建客户端证书与LXD进行安全通信。然后,它显示了有关如何启动容器的一些信息。最后,该命令显示了一个空的容器列表,这很正常,我们尚未创建任何容器。

让我们来创建三个容器。我们将创建两个web容器,并为反向代理创建第三个容器。反向代理的目的是将来自网络的传入连接定向到容器中的正确Web服务器。

我们将使用 lxc launch 命令创建并启动名为web1的Ubuntu 16.04( ubuntu:x )容器。 ubuntu:x 是预先配置的LXD镜像存储库的标识符

注意 :您可以通过运行 lxc image list images: 来运行镜像, lxc image list ubuntu: 命令找到所有可用Ubuntu映像的完整列表。

执行以下命令以创建容器:

lxc launch ubuntu:x web1
lxc launch ubuntu:x web2
lxc launch ubuntu:x haproxy
复制代码

因为这是我们第一次创建容器,所以第一个命令从网络下载容器映像。接下来的两个容器创建速度要快得多。

在这里,您可以看到创建容器 web1 的示例输出结果。

Creating web1
Retrieving image: 100%
Starting web1
复制代码

现在我们已经创建了三个空的vanilla容器,让我们使用 lxc list 命令来显示有关它们的信息:

lxc list
复制代码

输出结果显示为一个表,其中包含每个容器的名称,其当前状态,IP地址,类型以及是否存在快照。

+---------+---------+-----------------------+------+------------+-----------+
|  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         |
+---------+---------+-----------------------+------+------------+-----------+
复制代码

记下容器名称及其对应的IPv4地址。您需要它们来配置您的服务。

第四步 - 配置Nginx容器

让我们连接到 web1 容器并配置第一个Web服务器。

要进行连接,我们使用 lxc exec 命令,该命令需要容器的名称和要执行的命令。执行以下命令以连接到容器:

lxc exec web1 -- sudo --login --user ubuntu
复制代码

-- 字符串表示该命令参数 lxc 应该停在那里,如在容器内将要执行的命令的行的其余部分将被传递。该命令是 sudo --login --user ubuntu ,它为容器内的预配置帐户ubuntu提供登录shell 。

注意: 如果需要以 root 身份连接到容器,则可以使用 lxc exec web1 --/bin/bash 命令。

进入容器后,我们的shell提示现在如下所示。

ubuntu@web1:~$
复制代码

容器中的这个 ubuntu 用户具有 sudo 访问权限,并且可以在不提供密码的情况下运行 sudo 命令。这个shell限制在容器的范围内。我们在此shell中运行的任何内容都保留在容器中,无法转义到主机服务器。

让我们更新容器内Ubuntu实例的包列表并安装Nginx:

sudo apt-get update
sudo apt-get install nginx
复制代码

让我们编辑此站点的默认网页,并添加一些文本,清楚地表明该站点是在web1容器中托管的。打开文件 /var/www/html/index.nginx-debian.html

sudo nano /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>
...
复制代码

我们在两个地方编辑了文件,并在on LXD container web1上专门添加了文本。保存文件并退出编辑器。

现在注销容器并返回主机服务器:

logout
复制代码

web2 容器重复此步骤。登录,安装Nginx,然后编辑文件 /var/www/html/index.nginx-debian.html 以及使用 web2 。然后退出 web2 容器。

让我们使用 curl 来测试容器中的Web服务器是否正常工作。我们需要先前显示的Web容器的IP地址。

curl http://10.10.10.100/
复制代码

输出结果应该是:

<!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>
...
复制代码

同样测试第二个容器,使用 curl 命令及其IP地址验证它是否也正确设置。配置好两个容器后,我们可以继续设置HAProxy。

第五步 - 配置HAProxy容器

我们将使用HAProxy设置这些容器的代理。根据我们使用的域名将流量引导至每个容器。我们将在后面的配置示例中使用 example.com 。我们将在主机名 example.com www.example.com 上提供第一个网站。第二个网站使用 www2.example.com 。或用您自己的域名代替这些域名。

登录 haproxy 容器:

lxc exec haproxy -- sudo --login --user ubuntu
复制代码

更新安装包列表并安装HAProxy:

sudo apt-get update
sudo apt-get install haproxy
复制代码

安装完成后,我们需要配置HAProxy。HAProxy的配置文件位于 /etc/haproxy/haproxy.cfg 中。使用您喜欢的文本编辑器打开文件。

sudo nano /etc/haproxy/haproxy.cfg
复制代码

首先,我们将对 defaults 部分进行一些修改。我们将添加 forwardfor 选项,以便保留Web客户端的真实源IP,并且我们将添加 http-server-close 选项,从而实现会话重用和更低的延迟。

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
...
复制代码

接下来,我们将配置前端指向我们的两个后端容器。添加一个新的 frontend 部分名为 www_frontend ,如下所示:

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
复制代码

使用 acl 命令与Web服务器的主机名匹配,并将请求重定向到相应的 backend 部分。

然后我们定义两个新的 backend 部分,每个部分分别用于每个Web服务器,分别命名它们为 web1_cluster web2_cluster 。将以下代码添加到文件中以定义backend:

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
复制代码

balance 选项表示负载均衡策略。在这种情况下,我们选择最少数量的连接。 http-request 选项使用真实Web客户端IP设置HTTP标头。如果我们没有设置此标头,则Web服务器会将HAProxy IP地址记录为所有连接的源IP,从而使分析流量来源的位置。 server 选项指定server( web1 )的任意名称,并跟着服务器的主机名和端口。

LXD为容器提供DNS服务器,因此 web1.lxd 解析为与 web1 容器关联的IP。其他容器有自己的主机名,例如 web2.lxd haproxy.lxd

check 参数告诉HAPRoxy在Web服务器上执行运行状况。要测试配置是否有效,请运行以下命令:

/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -c
复制代码

输出结果应该是

Configuration file is valid
复制代码

让我们重新加载HAProxy,以便它读取新配置。

sudo systemctl reload haproxy
复制代码

现在注销容器以便返回主机。

logout






请到「今天看啥」查看全文