自定义路由和负载均衡策略镜像acs/proxy 参考文档

自定义路由-使用手册

acs/proxy

自定义代理镜像,通过 FROM dockercloud/haproxy 的方式继承自镜像 dockercloud/haproxy,动态感知容器的状态,做到后端容器负载均衡代理和服务发现。特点是将 HAProxy 负载均衡软件的所有配置都参数化了,方便您自定义自己的需求和配置。

该镜像主要用于 Alibaba Cloud 容器服务的默认路由服务不能满足您需求的场景,方便您对 HAProxy 进行自定义配置。

文档中会提到 acs/proxy 和 HAProxy,均指代该镜像或者镜像中的软件 HAProxy。

动态负载均衡代理和服务发现的原理

  • 镜像 acs/proxy 通过容器自身环境变量确定负载均衡的全局(GLOBAL)和默认(DEFAULT)配置。
  • 镜像 acs/proxy 侦听集群中的事件,例如容器状态的变化,发生变化后重新获取集群中相关容器的信息,确定最新的负载均衡配置。
  • 镜像 acs/proxy 根据最新的负载均衡配置去重新加载(reload)该配置,使得该配置生效。

如何确定负载均衡的后端容器

  • 根据 acs/proxy 的环境变量 ADDITIONAL_SERVICES 来确定范围。

    • ADDITIONAL_SERVICES: "*" 表示范围为整个集群。
    • ADDITIONAL_SERVICES: "project_name1:service_name1,project_name2:service_name2" 表示范围为当前应用和指定应用的指定服务。
    • ADDITIONAL_SERVICES 不设置或者为空表示范围为当前应用的容器。
  • 根据每个容器的标签来确定是否加入 acs/proxy 的后端。
    • aliyun.proxy.VIRTUAL_HOST: "www.toolchainx.com" 表示加入后端,且域名为 www.toolchainx.com
    • aliyun.proxy.required: "true" 表示加入后端,且作为默认的后端。

如何在前端绑定负载均衡

使用自定义负载均衡标签,例如 aliyun.lb.port_80: 'tcp://proxy:80'

关于自定义负载均衡标签的使用方法,参见 lb 标签。

示例模板

 lb:
    image:  registry.aliyuncs.com/acs/proxy:0.5
    ports:
            -  '80:80'
    restart:  always
    labels:
        # addon 使得 proxy 镜像有订阅注册中心的能力,动态加载服务的路由
        aliyun.custom_addon:  "proxy"
        # 每台 vm 部署一个该镜像的容器
        aliyun.global:  "true"
        #  使用自定义负载均衡,前端绑定负载均衡
        aliyun.lb.port_80: tcp://proxy_test:80
    environment:
        #  支持加载路由的后端容器的范围,"*"表示整个集群,默认为应用内的服务
        ADDITIONAL_SERVICES:  "*"
appone:
    expose:  # 被代理的服务一定要使用 expose 或者 ports 告诉 proxy 容器暴露哪个端口
        -  80/tcp
    image:  'nginx:latest'
    labels:
        # 此处支持 http/https/ws/wss 协议
        # 必须使用您自己的域名而不是容器服务提供的测试域名
        aliyun.proxy.VIRTUAL_HOST:  "http://appone.example.com"
    restart:  always

配置说明

通过 acs/proxy 镜像的环境变量设置全局(GLOBAL)和默认(DEFAULT)配置

注意:您需要重新部署 HAProxy 服务才能使此处的配置变更生效。该部分的配置针对的是镜像 acs/proxy 所在服务的环境变量配置。

环境变量 默认值 描述
ADDITIONAL_SERVICES 需要进行负载均衡的附加服务列表 (比如:prj1:web,prj2:sql)。
服务发现将基于 com.docker.compose.[project|service] 容器标签。
该环境变量仅适用于 compose V2,且必须确保容器可以解析和访问依赖的服务所在的网络。
BALANCE roundrobin 要使用的负载均衡算法。
可能的取值包括 roundrobinstatic-rrsourceleastconn
更多详细信息,参见 HAProxy:balance
CA_CERT_FILE CA 证书文件的路径。
通过使用该环境变量,您可以直接从数据卷挂载 CA 证书文件,而不需要通过环境变量传递证书文件内容。如果您设置了该变量,系统会忽略 CA_CERT 环境变量。
可设置为 /cacerts/cert0.pem
CA_CERT HAProxy 用于验证客户端的 CA 证书。
该环境变量的格式与 DEFAULT_SSL_CERT 相同。
CERT_FOLDER 证书的路径。
通过使用该变量,您可以直接从数据卷挂载 CA 证书文件,而不需要通过环境变量传递证书文件的内容。如果您设置了该变量,系统会忽略所依赖服务的 DEFAULT_SSL_CERTSSL_CERT 环境变量。
可设置为 /certs/
DEFAULT_SSL_CERT 默认的 SSL 证书。
该 pem 文件包含私钥和公钥(其中,私钥在前,公钥在后),使用 \n(两个字符)作为行分隔符。内容应该写在同一行,参见 SSL Termination。
EXTRA_BIND_SETTINGS 额外设置,由逗号进行分隔的字符串(<port>:<setting>)。每一部分会被附加到配置文件中对应的端口绑定节点。
如果需要使用逗号,需要使用 \, 进行转义。
可设置为 443:accept-proxy, 80:name http
EXTRA_DEFAULT_SETTINGS 额外设置,由逗号进行分隔的字符串。每一部分会被附加到配置文件中的 DEFAULT 节点。
如果需要使用逗号,需要使用 \, 进行转义。
EXTRA_FRONTEND_SETTINGS_<PORT> 额外设置,由逗号进行分隔的字符串。每一部分会按照环境变量名称中指定的端口号被附加到前端节点。
如果需要使用逗号,需要使用 \, 进行转义。
可设置为 EXTRA_FRONTEND_SETTINGS_80=balance source, maxconn 2000
EXTRA_GLOBAL_SETTINGS 额外设置,由逗号进行分隔的字符串。每一部分会被附加到配置文件中的 GLOBAL 节点。
如果需要使用逗号,需要使用 \, 进行转义。
可设置为 tune.ssl.cachesize 20000, tune.ssl.default-dh-param 2048
EXTRA_ROUTE_SETTINGS 该字符串会在健康检查结束后被附加到每一个后端路由上。
依赖的服务中的设置会覆盖该设置。
可设置为 "send-proxy"
EXTRA_SSL_CERTS 多余证书的名称列表,由逗号分隔,例如 CERT1, CERT2, CERT3
您还需要将每一个证书指定为单独的环境变量,例如 CERT1="<cert-body1>", CERT2="<cert-body2>", CERT3="<cert-body3>"
HEALTH_CHECK check 在每一个路由上设置健康检查。
可设置为 "check inter 2000 rise 2 fall 3"。
更多详细信息,参见 HAProxy:check
HTTP_BASIC_AUTH HTTP 基本认证的身份信息列表,格式为 <user>:<pass>,由逗号分隔。该身份信息适用于所有后端路由。
如果需要使用逗号,需要使用 \, 进行转义。
注意:生产环境中,请不要使用该环境变量进行认证。
MAXCONN 4096 设置每个进程的最大同时连接数。
MODE http HAProxy 的负载均衡模式。
可能的值包括 httptcphealth
MONITOR_PORT 要添加 MONTIOR_URI 的端口号。
该变量同 MONTIOR_URI 配合使用。
可设置为 80
MONITOR_URI 为获取 HAProxy 的健康状态所需要拦截的具体 URI。
更多详细信息,参见 Monitor URI
可设置为 /ping
OPTION redispatch default 节点中的 HAProxy option 条目列表,由逗号分隔。
RSYSLOG_DESTINATION 127.0.0.1 HAProxy 日志将要发送到的 rsyslog 目的地址。
SKIP_FORWARDED_PROTO 如果设置了该环境变量,HAProxy 将不会添加 X-Forwarded-For http请求头。
当 HAProxy 与其它负载均衡一同使用时,可以使用该环境变量。
SSL_BIND_CIPHERS 设置 SSL 服务器所要使用的 SSL 密钥套件。
该环境变量设置了 HAProxy ssl-default-bind-ciphers 的配置。
SSL_BIND_OPTIONS no-sslv3 设置 SSL 服务器所使用的 SSL 绑定选项。
该环境变量设置了 HAProxy ssl-default-bind-options 的配置。
设置为默认值则只允许在 SSL 服务器上使用 TLSv1.0+。
STATS_AUTH stats:stats 访问 Haproxy stats 统计页面所需要的用户名和密码。
STATS_PORT 1936 HAProxy stats 统计页面暴露的端口号。如果开放了该端口,则可以通过 http://<host-ip>:<STATS_PORT>/ 访问 stats统计页面。
TIMEOUT connect 5000, client 50000, server 50000 default 节点中 HAProxy timeout 条目列表,由逗号分隔。

被代理的后端服务通过相应服务镜像的标签(LABEL)进行某一后端服务的配置

即通过将标签(LABEL)写到后端服务的镜像上来进行配置。该部分的配置写在被代理的服务的模版部分

此处的设置可以覆盖 HAProxy 的设置。HAProxy 的设置仅适用于依赖的服务。如果在阿里云容器服务上运行,当服务重新部署,加入或者退出 HAProxy 服务时,HAProxy 服务会自动进行更新来应用这些变更。

标签 描述
aliyun.proxy.APPSESSION 会话保持选项。
可设置为 JSESSIONID len 52 timeout 3h
更多详细信息,参见 HAProxy:appsession
aliyun.proxy.BALANCE 要使用的负载均衡算法。
可设置为 roundrobinstatic-rrsourceleastconn
更多详细信息,参见 HAProxy:balance
aliyun.proxy.COOKIE 会话保持选项。
可设置为 SRV insert indirect nocache
更多详细信息,参见 HAProxy:cookie
aliyun.proxy.DEFAULT_SSL_CERT SSL_CERT 类似。但是该变量将 pem 文件保存在 /certs/cert0.pem 下作为默认的 SSL 证书。
如果在依赖的服务或者HAProxy 中设置了多个 DEFAULT_SSL_CERT,会导致未定义的行为。
aliyun.proxy.EXCLUDE_PORTS 端口号,由逗号分隔(例如:3306, 3307)。
默认情况下,HAProxy 将应用服务暴露的所有端口添加到后端路由。您可以指定您不希望进行路由的端口,比如数据库端口。
aliyun.proxy.EXTRA_ROUTE_SETTINGS 该字符串会在健康检查结束后被附加到每一个后端路由上。
可设置为 "send-proxy"。
aliyun.proxy.EXTRA_SETTINGS 额外设置,由逗号分隔。
每一部分会被附加到配置文件中相关的后端节点或监听会话。
如果需要使用逗号,使用 \, 进行转义。
可设置为 balance source
aliyun.proxy.FORCE_SSL 如果设置了该环境变量且启用了 SSL termination,HAProxy 会将 HTTP 请求重定向为 HTTPS 请求。
aliyun.proxy.GZIP_COMPRESSION_TYPE 启用 gzip 压缩。
该环境变量的值为将要压缩的 MIME 类型列表。
可设置为 text/html text/plain text/css
aliyun.proxy.HEALTH_CHECK 在每一个后端路由上设置健康检查。
可设置为 "check inter 2000 rise 2 fall 3"。
更多详细信息,参见 HAProxy:check
aliyun.proxy.HSTS_MAX_AGE 启用 HSTS。
该环境变量的值为一个整数,代表 HSTS 的有效期,单位为秒。
可设置为 31536000
aliyun.proxy.HTTP_CHECK 启用 HTTP 协议来检查服务器的健康情况。
可设置为 "OPTIONS * HTTP/1.1rnHost: www"。
更多详细信息,参见 HAProxy:httpchk
aliyun.proxy.OPTION HAProxy option 条目列表,由逗号分隔。
此处设置的 option 会被添加到相关的后端节点或监听节点,并会覆盖 HAProxy 容器中的 OPTION 设置。
aliyun.proxy.SSL_CERT SSL 证书。该 pem 文件包含私钥和公钥(其中,私钥在前,公钥在后),使用 \n (两个字符)作为行分隔符。
aliyun.proxy.TCP_PORTS 由逗号分隔的端口(比如:9000, 9001, 2222/ssl)。
TCP_PORTS 中列出的端口将在 TCP 模式下被负载均衡。
/ssl 结尾的端口表示该端口需要 SSL termination。
aliyun.proxy.VIRTUAL_HOST_WEIGHT 虚拟主机的权重,同 aliyun.proxy.VIRTUAL_HOST 配合使用。
该值为一个整数,默认值为 0。
该设置会影响虚拟主机的 ACL 规则的顺序。 虚拟主机的权重越高,ACL 规则的优先级越高,即值越大,越先被路由到。
aliyun.proxy.VIRTUAL_HOST 指定虚拟主机和虚拟路径。
格式为 [scheme://]domain[:port][/path], ...
可以在 domainpath 部分使用通配符 *

有关以上内容的更多信息,参见 HAProxy 配置手册

虚拟主机和虚拟路径

您可以在 VIRTUAL_HOST 环境变量中同时指定虚拟主机和虚拟路径。该变量的值由 URL 组成,多个 URL 之前用逗号分隔,格式为 [scheme://]domain[:port][/path]

条目 默认值 描述
scheme http 可能的值包括 httphttpswss
domain 虚拟主机。可以使用通配符 *
port 80/433 虚拟主机的端口号。当 scheme 设置为 httpswss 时,默认的端口为 443
/path 虚拟路径。以 / 开头,可以使用通配符 *

匹配示例

虚拟主机 匹配 不匹配
http://domain.com domain.com www.domain.com
domain.com domain.com www.domain.com
domain.com:90 domain.com:90 domain.com
https://domain.com https://domain.com domain.com
https://domain.com:444 https://domain.com:444 https://domain.com
\*.domain.com www.domain.com domain.com
\*domain.com www.domain.comdomain.comanotherdomain.com www.abc.com
www.e\*e.com www.domain.comwww.exxe.com www.axxa.com
www.domain.\* www.domain.comwww.domain.org domain.com
\* any website with HTTP
https://\* any website with HTTPS
\*/path domain.com/pathdomain.org/path?u=user domain.com/path/
\*/path/ domain.com/path/domain.org/path/?u=user domain.com/pathdomain.com/path/abc
\*/path/\* domain.com/path/domain.org/path/abc domain.com/abc/path/
\*/\*/path/\* domain.com/path/domain.org/abc/path/domain.net/abc/path/123 domain.com/path
\*/\*.js domain.com/abc.jsdomain.org/path/abc.js domain.com/abc.css
\*/\*.do/ domain.com/abc.do/domain.org/path/abc.do/ domain.com/abc.do
\*/path/\*.php domain.com/path/abc.php domain/abc.phpdomain.com/root/abc.php
\*.domain.com/\*.jpg www.domain.com/abc.jpgabc.domain.com/123.jpg domain.com/abc.jpg
\*/path, \*/path/ domain.com/pathdomain.org/path/
domain.com:90https://domain.com domain.com:90https://domain.com

注意:

  • 基于 VIRTUAL_HOST 所生成的 ACL 规则的顺序是随机的。在 HAProxy 中,当范围较窄的规则(比如 web.domain.com)被放置在范围较宽的规则(比如 *.domain.com)之后时, 系统永远不会达到范围较窄的规则。因此,如果您所设置的虚拟主机包含相互重叠的范围时,您需要使用 VIRTUAL_HOST_WEIGHT 来手动设置 ACL 规则的顺序,为范围较窄的虚拟主机设置高于范围较宽的虚拟主机的权重。
  • 所有带有相同 VIRTUAL_HOST 环境变量设置的服务将被看做并合并为一个服务。这对于一些测试场景比较适用。

SSL termination

acs/proxy 支持证书的 SSL ternimation。您只需要为每一个需要使用 SSL ternimation 的应用设置 SSL_CERTVIRTUAL_HOST 即可。然后,HAProxy 会读取依赖环境中的证书并开启 SSL ternimation。

注意: 当环境变量的值中包含等号(=)时(这种情况在 SSL_CERT中很普遍),Docker 会跳过该环境变量。因此,您只能在 Docker 1.7.0 或更高版本上使用多 SSL ternimation。

在以下情况下会启用 SSL ternimation:

  • 至少设置了一个 SSL 证书。
  • 没有设置 VIRTUAL_HOST 或者设置为使用 HTTPS 协议。

您可以通过以下方法设置 SSL 证书:

  • acs/proxy 中设置 DEFAULT_SSL_CERT
  • 在依赖于 acs/proxy 的应用服务中设置 aliyun.proxy.SSL_CERT 和/或 DEFAULT_SSL_CERT

aliyun.proxy.SSL_CERTDEFAULT_SSL_CERT 的区别在于 SSL_CERT 指定的多个证书保存为 cert1.pem, cert2.pem, ...,而 DEFAULT_SSL_CERT 指定的证书通常保存为 cert0.pem。在这种情况下,当没有设置 SNI 匹配时,HAProxy 会将 cert0.pem 用作默认证书。然而,当提供了多个 DEFAULT_SSL_CERTIFICATE 时,仅有其中一个证书可以保存为 cert0.pem,其它的证书将被弃用。

PEM 文件

acs/proxy 或依赖的应用服务所指定的证书为一个 pem 文件。该文件包含私钥和公钥(其中,私钥必须放在公钥和其它许可证书的前面)。您可以运行下面的脚本生成一个自签名证书。

openssl req -x509 -newkey rsa:2048 -keyout key.pem -out ca.pem -days 1080 -nodes -subj '/CN=*/O=My Company Name LTD./C=US'
cp key.pem cert.pem
cat ca.pem >> cert.pem

您获取 pem 文件之后,可以运行下面的命令将文件转化为一行内容。

awk 1 ORS='\\n' cert.pem

拷贝转换后的内容并将其设置为 aliyun.proxy.SSL_CERTDEFAULT_SSL_CERT 的值。

亲和性和会话保持

您可以通过以下任一方法设置亲和性和会话保持。

  • 在您的应用服务中设置 aliyun.proxy.BALANCE=source。当设置了 source 负载均衡方法时, HAProxy 会对客户端 IP 地址进行哈希并确保同一个 IP 总是连接到同一个后端服务容器上。
  • 设置 aliyun.proxy.APPSESSION=<value>。使用应用会话来确定客户端应该连接到哪一个服务容器上。<value> 可以设置为 JSESSIONID len 52 timeout 3h
  • 设置 aliyun.proxy.COOKIE=<value>。使用应用 cookie 来确定客户端应该连接到哪一个后端服务容器上。<value> 可以设置为 SRV insert indirect nocache

更多详细信息,参见 HAProxy:appsessionHAProxy:cookie

TCP 负载均衡

默认情况下,acs/proxy 运行在 http 模式下。如果您希望依赖的服务运行在 tcp 模式下,您可以指定 TCP_PORTS 环境变量。该变量的值为以逗号分隔的端口号(9000, 9001)。

例如,如果您运行以下命令:

docker --name app-1 --expose 9000 --expose 9001 -e TCP_PORTS="9000, 9001" your_app
docker --name app-2 --expose 9000 --expose 9001 -e TCP_PORTS="9000, 9001" your_app
docker run --link app-1:app-1 --link app-2:app-2 -p 9000:9000, 9001:9001 acs/proxy

HAProxy 将分别在 9000 端口和 9001 端口上对 app-1app-2 进行负载均衡。

此外,如果您所暴露的端口多于 TCP_PORTS 中所设置的端口,剩余的端口将会使用 http 模式进行负载均衡。

例如,如果您运行以下命令:

docker --name app-1 --expose 80 --expose 22 -e TCP_PORTS=22 your_app
docker --name app-2 --expose 80 --expose 22 -e TCP_PORTS=22 your_app
docker run --link app-1:app-2 --link app-2:app-2 -p 80:80 -p 22:22 acs/proxy

HAProxy 会在 80 端口使用 http 模式进行负载均衡,在 22 端口使用 tcp 模式进行负载均衡。

通过这种方法,您可以同时使用 tcp 模式和 http 模式进行负载均衡。

如果您在 TCP_PORTS 中设置了以 /ssl 结尾的端口,比如 2222/ssl,HAProxy 会在 2222 端口上设置 SSL termination。

注意:

  • 您可以同时设置 VIRTUAL_HOSTTCP_PORTS,以便为 http 模式提供更多的管控。
  • tcp 端口上的负载均衡适用于所有的服务。因此,如果您依赖了两个或多个使用同一 TCP_PORTS 设置的不同服务,acs/proxy 会将这些服务看做同一个服务。

WebSocket 支持

您可以通过以下任一方法启用 websocket 支持:

  • 鉴于 Websocket 使用 HTTP 协议进行启动,您可以使用虚拟主机来指定使用 wswss 协议。比如,-e VIRTUAL_HOST="ws://ws.domain.com, wss://wss.domain.com"
  • 鉴于 Websocket 本身为 TCP 连接,因此您可以尝试使用本文档前面所介绍的 TCP 负载均衡。

使用场景示例

注意:

  • 一下示例中的acs/proxy镜像均是registry.aliyuncs.com/acs/proxy:0.5的简写形式,请做相应替换。

我的 webapp 容器暴露了 8080 端口(或任意其它端口),我希望 proxy 监听 80 端口

使用下面的命令:

docker run -d --expose 80 --name webapp dockercloud/hello-world
docker run -d --link webapp:webapp -p 80:80 acs/proxy

我的 webapp 容器暴露了 80 端口和 8083/8086 数据库端口,我希望 proxy 监听 80 端口并且不希望将数据库端口加入 acs/proxy

docker run -d -e EXCLUDE_PORTS=8803,8806 --expose 80 --expose 8033 --expose 8086 --name webapp dockercloud/hello-world
docker run -d --link webapp:webapp -p 80:80 acs/proxy

我的容器暴露了 8080 端口(或任意其它端口),我希望 acs/proxy 监听 8080 端口

使用下面的命令:

docker run -d --expose 8080 --name webapp your_app
docker run -d --link webapp:webapp -p 8080:80 acs/proxy

我希望 acs/proxy 处理 SSL 连接并将我的普通 HTTP 请求转发到端口 8080(或任意其它端口)

使用下面的命令:

docker run -d -e SSL_CERT="YOUR_CERT_TEXT" --name webapp dockercloud/hello-world
docker run -d --link webapp:webapp -p 443:443 -p 80:80 acs/proxy

或者

docker run -d --link webapp:webapp -p 443:443 -p 80:80 -e DEFAULT_SSL_CERT="YOUR_CERT_TEXT" acs/proxy

YOUR_CERT_TEXT 中的证书包含私钥和公钥(其中,私钥在前,公钥在后)。您需要在证书的行与行之间加上 \n。假设您的证书保存在 ~/cert.pem 中,您可以运行以下命令。

docker run -d --link webapp:webapp -p 443:443 -p 80:80 -e DEFAULT_SSL_CERT="$(awk 1 ORS='\\n' ~/cert.pem)" acs/proxy

我希望 acs/proxy 终结 SSL 连接并将 HTTP 请求重定向为 HTTPS 请求

使用下面的命令:

docker run -d -e FORCE_SSL=yes -e SSL_CERT="YOUR_CERT_TEXT" --name webapp dockercloud/hello-world
docker run -d --link webapp:webapp -p 443:443 acs/proxy

我希望从数据卷中加载我的 SSL 证书,而不是通过环境变量来传递证书内容

您可以使用 CERT_FOLDER 环境变量来指定证书挂载在容器的哪个文件夹中。使用以下命令。

docker run -d --name webapp dockercloud/hello-world
docker run -d --link webapp:webapp -e CERT_FOLDER="/certs/" -v $(pwd)/cert1.pem:/certs/cert1.pem -p 443:443 acs/proxy

我希望通过域名设置虚拟主机路由

可以通过 proxy 读取依赖的容器的环境变量(VIRTUAL_HOST)来配置虚拟主机。

示例:

docker run -d -e VIRTUAL_HOST="www.webapp1.com, www.webapp1.org" --name webapp1 dockercloud/hello-world
docker run -d -e VIRTUAL_HOST=www.webapp2.com --name webapp2 your/webapp2
docker run -d --link webapp1:webapp1 --link webapp2:webapp2 -p 80:80 acs/proxy

在上面的例子中,当您访问 http://www.webapp1.comhttp://www.webapp1.org 时,将显示运行于容器 webapp1 上的服务,http://www.webapp2.com 会连接到容器 webapp2

如果您使用下面的命令:

docker run -d -e VIRTUAL_HOST=www.webapp1.com --name webapp1 dockercloud/hello-world
docker run -d -e VIRTUAL_HOST=www.webapp2.com --name webapp2-1 dockercloud/hello-world
docker run -d -e VIRTUAL_HOST=www.webapp2.com --name webapp2-2 dockercloud/hello-world
docker run -d --link webapp1:webapp1 --link webapp2-1:webapp2-1 --link webapp2-2:webapp2-2 -p 80:80 acs/proxy

当您访问 http://www.webapp1.com 时,将显示运行于容器 webapp1 上的服务, http://www.webapp2.com 将基于轮询调度算法(或者任何其它 BALANCE 指定的算法)连接到容器 webapp2-1webapp2-2 上。

我希望我所有的 *.node.io 域名均指向我的服务

docker run -d -e VIRTUAL_HOST="*.node.io" --name webapp dockercloud/hello-world
docker run -d --link webapp:webapp -p 80:80 acs/proxy

我希望 web.domain.com 连接到一个服务, *.domain.com 连接到另外一个服务

docker run -d -e VIRTUAL_HOST="web.domain.com" -e VIRTUAL_HOST_WEIGHT=1 --name webapp dockercloud/hello-world
docker run -d -e VIRTUAL_HOST="*.domain.com" -e VIRTUAL_HOST_WEIGHT=0 --name app dockercloud/hello-world
docker run -d --link webapp:webapp --link app:app -p 80:80 acs/proxy

我希望所有到 /path 路径的请求均指向我的服务

docker run -d -e VIRTUAL_HOST="*/path, */path/*" --name webapp dockercloud/hello-world
docker run -d --link webapp:webapp -p 80:80 acs/proxy

我希望所有的静态 html 请求均指向我的服务

docker run -d -e VIRTUAL_HOST="*/*.htm, */*.html" --name webapp dockercloud/hello-world
docker run -d --link webapp:webapp -p 80:80 acs/proxy

我希望查看 HAProxy stats

docker run -d --link webapp:webapp -e STATS_AUTH="auth:auth" -e STATS_PORT=1936 -p 80:80 -p 1936:1936 acs/proxy

我希望将我的日志发送到 papertrailapp

用与您的 papertrailapp 账号相匹配的值替换 <subdomain><port>

docker run -d --name web1 dockercloud/hello-world
docker run -d --name web2 dockercloud/hello-world
docker run -it --env RSYSLOG_DESTINATION='<subdomain>.papertrailapp.com:<port>' -p 80:80 --link web1:web1 --link web2:web2 acs/proxy

使用虚拟主机的拓扑图

阿里云容器服务代理拓扑图

手动重新加载 HAProxy

在大多数情况下,当依赖的服务发生变化时,acs/proxy 会自动进行配置。但是如果需要的话,您也可以按照下面的方法手动重新加载 acs/proxy

docker exec <acs/proxy_container_id> /reload.sh

时间: 2024-10-04 10:58:58

自定义路由和负载均衡策略镜像acs/proxy 参考文档的相关文章

阿里云容器服务--自定义路由和负载均衡策略

简单示例 让我们先从一个简单的例子开始,我们会部署一个acs/proxy容器,容器前面配置一个slb实例,让大家可以访问,同时在后端挂上一个nginx,这里我们只展示nginx的首页. compose模板如下所示: lb: image: registry.aliyuncs.com/acs/proxy:0.5 ports: - '80:80' restart: always labels: # addon 使得proxy镜像有订阅注册中心的能力,动态加载服务的路由 aliyun.custom_ad

用eigrp做不等值路由的负载均衡

在eigrp中如何做到不等值路由的负载均衡 EIGRP Load Balancing 每个路由协议都支持等值路径的负载均衡.除此之外,IGRP和EIGRP也支持不等值路径的负载均衡,使用variance命令. Variance命令向路由器通告一个n值,n值使用variance命令指定.n值为1-128之间,默认为1. 网络拓扑 Variance 在上图中,router E有三个路径到网络X • E-B-A with a metric of 30 • E-C-A with a metric of

Ribbon负载均衡策略配置

在这里吐槽一句:网上很多文章真是神坑,你不看还好,看了只会问题越来越多,就连之前的问题都没有解决!!! 不多说了,Ribbon作为后端负载均衡器,比Nginx更注重的是请求分发而不是承担并发,可以直接感知后台动态变化来指定分发策略.它一共提供了7种负载均衡策略: 策略名 策略声明 策略描述 实现说明 BestAvailableRule public class BestAvailableRule extends ClientConfigEnabledRoundRobinRule 选择一个最小的并

简单测试Apache是如何完成负载均衡策略配置_Linux

随着访问量的不断提升,以及对响应速度要求的苛刻,进行负载均衡设置就显得尤为重要了.公司的系统在最初设计的时候就已经考虑到了负载均衡的规划,www静态服务器配置了两台,由于初期项目时间紧,并且访问量并不高,所以当时只用了一台,另一台在内网中,只是进行了同步,并为发挥出效用来.此次就是对负载均衡的一个简单测试. 先介绍一下apache mod_proxy_balancer的几个配置规则: 将Apache作为LoadBalance前置机分别有三种不同的部署方式,分别是: 1 )轮询均衡策略的配置 进入

Dubbo负载均衡策略

参考内容:http://www.roncoo.com/course/view/85d6008fe77c4199b0cdd2885eaeee53 负载均衡 (+) (#) 在集群负载均衡时,Dubbo提供了多种均衡策略,缺省为random随机调用. 可以自行扩展负载均衡策略,参见:负载均衡扩展 Random LoadBalance 随机,按权重设置随机概率. 在一个截面上碰撞的概率高,但调用量越大分布越均匀,而且按概率使用权重后也比较均匀,有利于动态调整提供者权重. 权重加倍 RoundRobin

多WAN口宽带路由器负载均衡策略

负载均衡策略多WAN口宽带路由器的最突出的技术就是"负载均衡",是多WAN口宽带路由器最重要的特征.分配各WAN口的数据流量是多WAN口宽带路由器要解决的问题,根据策略的不同,负载均衡的实现方式也不同.常见和流行的负载均衡策略有以下三种:会话( Session )方式系统以会话数目为计数单位,所有会话按平均的比例均分到所有启用的WAN口.在接入的线路带宽不同时会出现不均衡,导致一个WAN口可能出现拥塞,而另一个却还有盈余.Weight round robin 方式也是按会话,但会话的比

Apache服务器实现负载均衡策略配置详解

随着访问量的不断提高,以及对响应速度的要求,进行负载均衡设置就显得非常必要了.公司的系统在最初设计的时候就已经考虑到了负载均衡的规 划,www静态服务器配置了两台,由于初期项目时间紧,并且访问量并不高,所以当时只用了一台,另一台在内网中,只是进行了同步,并为发挥出效用来.此次 就是对负载均衡的一个简单测试. 先介绍一下apache mod_proxy_balancer的几个配置规则: 将Apache作为LoadBalance前置机分别有三种不同的部署方式,分别是: 1 )轮询均衡策略的配置 进入

几种软负载均衡策略分析

公司去年上了F5,好用是好用,但是费用太高昂了,所以最近一直在研究软负载均衡这一块儿,恰巧今年年初谷歌开源了seesaw,让自己可以绕过很多弯路.特此总结下之前了解的负载均衡策略. -Sunface 在分布式系统中,负载均衡是非常重要的环节,通过负载均衡将请求派发到网络中的一个或多个节点上进行处理.通常来说,负载均衡分为硬件负载均衡及软件负载均衡.硬件负载均衡,顾名思义,在服务器节点之间安装专门的硬件进行负载均衡的工作,F5便为其中的佼佼者.软件负载均衡则是通过在服务器上安装的特定的负载均衡软件

LVS-DR直接路由实现负载均衡示例

要求:通过使用LVS的直接路由来实现服务器的负载均衡 注:在做实验之前一定要先关闭每台主机的防火墙与SELinux 拓扑图 LVS服务器配置: 1> 开启转发功能 [root@localhost ~]# echo 1 > /proc/sys/net/ipv4/ip_forward 2> 安装lvs控制软件ipvsadm [root@localhost ~]# mount /dev/cdrom /mnt/cdrom mount: block device /dev/cdrom is wri