使用LXD搭建Web网站 (3)

我们将使用HAProxy设置这些容器的代理。根据我们使用的域名将流量引导至每个容器。我们将在后面的配置示例中使用example.com。我们将在主机名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 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

我们已将HAProxy配置为充当反向代理,将其在80端口上接收的任何连接转发到其他两个容器中的相应Web服务器。让我们测试haproxy将请求转发到正确的Web容器。请执行以下命令:

curl --verbose --header 'Host: web2.example.com'

这会向HAProxy发出请求并设置HTTP host标头,HAProxy应使用该标头将连接重定向到相应的Web服务器。

输出结果应该是

... > 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正确转发请求并将其转发给web2容器。Web服务器提供了我们之前编辑的默认索引页面。现在让我们将外部请求路由到HAProxy,可以让全世界访问我们的网站。

第六步 - 将传入连接转发到HAProxy容器中

最后一个难题是将反向代理连接到网络。我们需要设置我们的服务器以将它从80端口上的网络接收的任何连接转发到haproxy容器中。

HAProxy安装在容器中,无法从Internet访问。为了解决这个问题,我们将创建一个iptables转发连接的规则。

iptables命令需要两个IP地址:服务器的公共IP地址(your_server_ip)和haproxy容器的私有IP地址(your_haproxy_ip),您可以使用lxc list命令获取该地址。

执行此命令以创建规则:

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

这是命令分解的方式:

-t nat指定我们正在使用该nat表。

-I PREROUTING 指定我们将规则添加到PREROUTING链。

-i eth0指定接口eth0,它是Droplets上的默认公共接口。

-p TCP表明我们正在使用TCP协议。

-d your_server_ip/32 指定规则的目标IP地址。

--dport 80:指定目标端口。

-j DNAT 表明我们想要跳转到目标NAT(DNAT)。

--to-destination your_haproxy_ip:80表明我们希望请求使用HAProxy转到容器的IP地址。

最后,要保存iptables命令以便在重新启动后重新应用它,我们将安装iptables-persistent软件包:

sudo apt-get install iptables-persistent

安装软件包时,系统将提示您保存所有当前iptables规则。如果您已设置了两个FQDN,那么您应该能够使用Web浏览器连接到每个网站。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsxsdw.html