我们将使用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 checkbalance选项表示负载均衡策略。在这种情况下,我们选择最少数量的连接。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浏览器连接到每个网站。