diff --git a/.travis.yml b/.travis.yml
index a55e7c8c75..b9c2eca32a 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -30,5 +30,5 @@ script:
# enable kubernetes/ingress in
# coveralls.io and add cover task
- make fmt lint vet test
- - make controllers controllers-images
+ #- make controllers controllers-images
#- make test-e2e
diff --git a/controllers/gce/backends/backends_test.go b/controllers/gce/backends/backends_test.go
index 538c0ce0a9..951cbb1cd9 100644
--- a/controllers/gce/backends/backends_test.go
+++ b/controllers/gce/backends/backends_test.go
@@ -32,7 +32,7 @@ const defaultZone = "zone-a"
func newBackendPool(f BackendServices, fakeIGs instances.InstanceGroups, syncWithCloud bool) BackendPool {
namer := &utils.Namer{}
nodePool := instances.NewNodePool(fakeIGs)
- nodePool.Init(&instances.FakeZoneLister{Items:[]string{defaultZone}})
+ nodePool.Init(&instances.FakeZoneLister{Zones: []string{defaultZone}})
healthChecks := healthchecks.NewHealthChecker(healthchecks.NewFakeHealthChecks(), "/", namer)
healthChecks.Init(&healthchecks.FakeHealthCheckGetter{DefaultHealthCheck: nil})
return NewBackendPool(
diff --git a/controllers/nginx/.gitignore b/controllers/nginx/.gitignore
index 47f069f7a5..f7fc6d3ef7 100644
--- a/controllers/nginx/.gitignore
+++ b/controllers/nginx/.gitignore
@@ -1 +1,2 @@
-nginx-ingress-controller
+rootfs/nginx-ingress-controller
+*/**/.coverprofile
\ No newline at end of file
diff --git a/controllers/nginx/Changelog.md b/controllers/nginx/Changelog.md
index 0bb7aeec39..60fd919fe6 100644
--- a/controllers/nginx/Changelog.md
+++ b/controllers/nginx/Changelog.md
@@ -1,5 +1,33 @@
Changelog
+### 0.9
+
+- [X] [#1498](https://github.com/kubernetes/contrib/pull/1498) Refactoring of template handling
+- [X] [#1571](https://github.com/kubernetes/contrib/pull/1571) use POD_NAMESPACE as a namespace in cli parameters
+- [X] [#1591](https://github.com/kubernetes/contrib/pull/1591) Always listen on port 443, even without ingress rules
+- [X] [#1596](https://github.com/kubernetes/contrib/pull/1596) Adapt nginx hash sizes to the number of ingress
+- [X] [#1653](https://github.com/kubernetes/contrib/pull/1653) Update image version
+- [X] [#1672](https://github.com/kubernetes/contrib/pull/1672) Add firewall rules and ing class clarifications
+- [X] [#1711](https://github.com/kubernetes/contrib/pull/1711) Add function helpers to nginx template
+- [X] [#1743](https://github.com/kubernetes/contrib/pull/1743) Allow customisation of the nginx proxy_buffer_size directive via ConfigMap
+- [X] [#1749](https://github.com/kubernetes/contrib/pull/1749) Readiness probe that works behind a CP lb
+- [X] [#1751](https://github.com/kubernetes/contrib/pull/1751) Add the name of the upstream in the log
+- [X] [#1758](https://github.com/kubernetes/contrib/pull/1758) Update nginx to 1.11.4
+- [X] [#1759](https://github.com/kubernetes/contrib/pull/1759) Add support for default backend in Ingress rule
+- [X] [#1762](https://github.com/kubernetes/contrib/pull/1762) Add cloud detection
+- [X] [#1766](https://github.com/kubernetes/contrib/pull/1766) Clarify the controller uses endpoints and not services
+- [X] [#1767](https://github.com/kubernetes/contrib/pull/1767) Update godeps
+- [X] [#1772](https://github.com/kubernetes/contrib/pull/1772) Avoid replacing nginx.conf file if the new configuration is invalid
+- [X] [#1773](https://github.com/kubernetes/contrib/pull/1773) Add annotation to add CORS support
+- [X] [#1786](https://github.com/kubernetes/contrib/pull/1786) Add docs about go template
+- [X] [#1796](https://github.com/kubernetes/contrib/pull/1796) Add external authentication support using auth_request
+- [X] [#1802](https://github.com/kubernetes/contrib/pull/1802) Initialize proxy_upstream_name variable
+- [X] [#1806](https://github.com/kubernetes/contrib/pull/1806) Add docs about the log format
+- [X] [#1808](https://github.com/kubernetes/contrib/pull/1808) WebSocket documentation
+- [X] [#1847](https://github.com/kubernetes/contrib/pull/1847) Change structure of packages
+- [X] Add annotation for custom upstream timeouts
+- [X] Mutual TLS auth (https://github.com/kubernetes/contrib/issues/1870)
+
### 0.8.3
- [X] [#1450](https://github.com/kubernetes/contrib/pull/1450) Check for errors in nginx template
diff --git a/controllers/nginx/Makefile b/controllers/nginx/Makefile
index c5eca4838b..4d701a7742 100644
--- a/controllers/nginx/Makefile
+++ b/controllers/nginx/Makefile
@@ -1,25 +1,52 @@
all: push
+BUILDTAGS=
+
# 0.0 shouldn't clobber any release builds
-TAG = 0.8.3
-PREFIX = gcr.io/google_containers/nginx-ingress-controller
+RELEASE?=0.0
+PREFIX?=gcr.io/google_containers/nginx-ingress-controller
+GOOS?=linux
REPO_INFO=$(shell git config --get remote.origin.url)
-ifndef VERSION
- VERSION := git-$(shell git rev-parse --short HEAD)
+ifndef COMMIT
+ COMMIT := git-$(shell git rev-parse --short HEAD)
endif
-controller: controller.go clean
- CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -ldflags \
- "-s -w -X main.version=${VERSION} -X main.gitRepo=${REPO_INFO}" \
- -o nginx-ingress-controller
+PKG=k8s.io/ingress/controllers/nginx
+
+build: clean
+ CGO_ENABLED=0 GOOS=${GOOS} go build -a -installsuffix cgo \
+ -ldflags "-s -w -X ${PKG}/pkg/version.RELEASE=${RELEASE} -X ${PKG}/pkg/version.COMMIT=${COMMIT} -X ${PKG}/pkg/version.REPO=${REPO_INFO}" \
+ -o rootfs/nginx-ingress-controller ${PKG}/pkg/cmd/controller
+
+container:
+ docker build -t $(PREFIX):$(RELEASE) rootfs
+
+push:
+ gcloud docker push $(PREFIX):$(RELEASE)
+
+fmt:
+ @echo "+ $@"
+ @go list -f '{{if len .TestGoFiles}}"gofmt -s -l {{.Dir}}"{{end}}' $(shell go list ${PKG}/... | grep -v vendor) | xargs -L 1 sh -c
+
+lint:
+ @echo "+ $@"
+ @go list -f '{{if len .TestGoFiles}}"golint {{.Dir}}/..."{{end}}' $(shell go list ${PKG}/... | grep -v vendor) | xargs -L 1 sh -c
+
+test: fmt lint vet
+ @echo "+ $@"
+ @go test -v -race -tags "$(BUILDTAGS) cgo" $(shell go list ${PKG}/... | grep -v vendor)
-container: controller
- docker build -t $(PREFIX):$(TAG) .
+cover:
+ @echo "+ $@"
+ @go list -f '{{if len .TestGoFiles}}"go test -coverprofile={{.Dir}}/.coverprofile {{.ImportPath}}"{{end}}' $(shell go list ${PKG}/... | grep -v vendor) | xargs -L 1 sh -c
+ gover
+ goveralls -coverprofile=gover.coverprofile -service travis-ci -repotoken ${COVERALLS_TOKEN}
-push: container
- gcloud docker push $(PREFIX):$(TAG)
+vet:
+ @echo "+ $@"
+ @go vet $(shell go list ${PKG}/... | grep -v vendor)
clean:
rm -f nginx-ingress-controller
diff --git a/controllers/nginx/README.md b/controllers/nginx/README.md
index 67b70912a9..43127725d8 100644
--- a/controllers/nginx/README.md
+++ b/controllers/nginx/README.md
@@ -1,462 +1,2 @@
-# Nginx Ingress Controller
-
-This is an nginx Ingress controller that uses [ConfigMap](https://github.com/kubernetes/kubernetes/blob/master/docs/design/configmap.md) to store the nginx configuration. See [Ingress controller documentation](../README.md) for details on how it works.
-
-## Contents
-* [Conventions](#conventions)
-* [Requirements](#what-it-provides)
-* [Dry running](#dry-running-the-ingress-controller)
-* [Deployment](#deployment)
-* [HTTP](#http)
-* [HTTPS](#https)
- * [Default SSL Certificate](#default-ssl-certificate)
- * [HTTPS enforcement](#server-side-https-enforcement)
- * [HSTS](#http-strict-transport-security)
- * [Kube-Lego](#automated-certificate-management-with-kube-lego)
-* [TCP Services](#exposing-tcp-services)
-* [UDP Services](#exposing-udp-services)
-* [Proxy Protocol](#proxy-protocol)
-* [NGINX customization](configuration.md)
-* [NGINX status page](#nginx-status-page)
-* [Running multiple ingress controllers](#running-multiple-ingress-controllers)
-* [Running on Cloudproviders](#running-on-cloudproviders)
-* [Disabling NGINX ingress controller](#disabling-nginx-ingress-controller)
-* [Log format](#log-format)
-* [Local cluster](#local-cluster)
-* [Debug & Troubleshooting](#troubleshooting)
-* [Why endpoints and not services?](#why-endpoints-and-not-services)
-* [Limitations](#limitations)
-* [NGINX Notes](#nginx-notes)
-
-## Conventions
-
-Anytime we reference a tls secret, we mean (x509, pem encoded, RSA 2048, etc). You can generate such a certificate with:
-`openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout $(KEY) -out $(CERT) -subj "/CN=$(HOST)/O=$(HOST)"`
-and create the secret via `kubectl create secret tls --key file --cert file`
-
-
-
-## Requirements
-- Default backend [404-server](https://github.com/kubernetes/contrib/tree/master/404-server)
-
-
-## Dry running the Ingress controller
-
-Before deploying the controller to production you might want to run it outside the cluster and observe it.
-
-```console
-$ make controller
-$ mkdir /etc/nginx-ssl
-$ ./nginx-ingress-controller --running-in-cluster=false --default-backend-service=kube-system/default-http-backend
-```
-
-## Deployment
-
-First create a default backend:
-```
-$ kubectl create -f examples/default-backend.yaml
-$ kubectl expose rc default-http-backend --port=80 --target-port=8080 --name=default-http-backend
-```
-
-Loadbalancers are created via a ReplicationController or Daemonset:
-
-```
-$ kubectl create -f examples/default/rc-default.yaml
-```
-
-## HTTP
-
-First we need to deploy some application to publish. To keep this simple we will use the [echoheaders app](https://github.com/kubernetes/contrib/blob/master/ingress/echoheaders/echo-app.yaml) that just returns information about the http request as output
-```
-kubectl run echoheaders --image=gcr.io/google_containers/echoserver:1.4 --replicas=1 --port=8080
-```
-
-Now we expose the same application in two different services (so we can create different Ingress rules)
-```
-kubectl expose deployment echoheaders --port=80 --target-port=8080 --name=echoheaders-x
-kubectl expose deployment echoheaders --port=80 --target-port=8080 --name=echoheaders-y
-```
-
-Next we create a couple of Ingress rules
-```
-kubectl create -f examples/ingress.yaml
-```
-
-we check that ingress rules are defined:
-```
-$ kubectl get ing
-NAME RULE BACKEND ADDRESS
-echomap -
- foo.bar.com
- /foo echoheaders-x:80
- bar.baz.com
- /bar echoheaders-y:80
- /foo echoheaders-x:80
-```
-
-Before the deploy of the Ingress controller we need a default backend [404-server](https://github.com/kubernetes/contrib/tree/master/404-server)
-```
-kubectl create -f examples/default-backend.yaml
-kubectl expose rc default-http-backend --port=80 --target-port=8080 --name=default-http-backend
-```
-
-Check NGINX it is running with the defined Ingress rules:
-
-```
-$ LBIP=$(kubectl get node `kubectl get po -l name=nginx-ingress-lb --template '{{range .items}}{{.spec.nodeName}}{{end}}'` --template '{{range $i, $n := .status.addresses}}{{if eq $n.type "ExternalIP"}}{{$n.address}}{{end}}{{end}}')
-$ curl $LBIP/foo -H 'Host: foo.bar.com'
-```
-
-## HTTPS
-
-You can secure an Ingress by specifying a secret that contains a TLS private key and certificate. Currently the Ingress only supports a single TLS port, 443, and assumes TLS termination. This controller supports SNI. The TLS secret must contain keys named tls.crt and tls.key that contain the certificate and private key to use for TLS, eg:
-
-```
-apiVersion: v1
-data:
- tls.crt: base64 encoded cert
- tls.key: base64 encoded key
-kind: Secret
-metadata:
- name: testsecret
- namespace: default
-type: Opaque
-```
-
-Referencing this secret in an Ingress will tell the Ingress controller to secure the channel from the client to the loadbalancer using TLS:
-
-```
-apiVersion: extensions/v1beta1
-kind: Ingress
-metadata:
- name: no-rules-map
-spec:
- tls:
- secretName: testsecret
- backend:
- serviceName: s1
- servicePort: 80
-```
-Please follow [test.sh](https://github.com/bprashanth/Ingress/blob/master/examples/sni/nginx/test.sh) as a guide on how to generate secrets containing SSL certificates. The name of the secret can be different than the name of the certificate.
-
-Check the [example](examples/tls/README.md)
-
-### Default SSL Certificate
-
-NGINX provides the option [server name](http://nginx.org/en/docs/http/server_names.html) as a catch-all in case of requests that do not match one of the configured server names. This configuration works without issues for HTTP traffic. In case of HTTPS NGINX requires a certificate. For this reason the Ingress controller provides the flag `--default-ssl-certificate`. The secret behind this flag contains the default certificate to be used in the mentioned case.
-If this flag is not provided NGINX will use a self signed certificate.
-
-Running without the flag `--default-ssl-certificate`:
-
-```
-$ curl -v https://10.2.78.7:443 -k
-* Rebuilt URL to: https://10.2.78.7:443/
-* Trying 10.2.78.4...
-* Connected to 10.2.78.7 (10.2.78.7) port 443 (#0)
-* ALPN, offering http/1.1
-* Cipher selection: ALL:!EXPORT:!EXPORT40:!EXPORT56:!aNULL:!LOW:!RC4:@STRENGTH
-* successfully set certificate verify locations:
-* CAfile: /etc/ssl/certs/ca-certificates.crt
- CApath: /etc/ssl/certs
-* TLSv1.2 (OUT), TLS header, Certificate Status (22):
-* TLSv1.2 (OUT), TLS handshake, Client hello (1):
-* TLSv1.2 (IN), TLS handshake, Server hello (2):
-* TLSv1.2 (IN), TLS handshake, Certificate (11):
-* TLSv1.2 (IN), TLS handshake, Server key exchange (12):
-* TLSv1.2 (IN), TLS handshake, Server finished (14):
-* TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
-* TLSv1.2 (OUT), TLS change cipher, Client hello (1):
-* TLSv1.2 (OUT), TLS handshake, Finished (20):
-* TLSv1.2 (IN), TLS change cipher, Client hello (1):
-* TLSv1.2 (IN), TLS handshake, Finished (20):
-* SSL connection using TLSv1.2 / ECDHE-RSA-AES128-GCM-SHA256
-* ALPN, server accepted to use http/1.1
-* Server certificate:
-* subject: CN=foo.bar.com
-* start date: Apr 13 00:50:56 2016 GMT
-* expire date: Apr 13 00:50:56 2017 GMT
-* issuer: CN=foo.bar.com
-* SSL certificate verify result: self signed certificate (18), continuing anyway.
-> GET / HTTP/1.1
-> Host: 10.2.78.7
-> User-Agent: curl/7.47.1
-> Accept: */*
->
-< HTTP/1.1 404 Not Found
-< Server: nginx/1.11.1
-< Date: Thu, 21 Jul 2016 15:38:46 GMT
-< Content-Type: text/html
-< Transfer-Encoding: chunked
-< Connection: keep-alive
-< Strict-Transport-Security: max-age=15724800; includeSubDomains; preload
-<
-The page you're looking for could not be found.
-
-* Connection #0 to host 10.2.78.7 left intact
-```
-
-Specifying `--default-ssl-certificate=default/foo-tls`:
-
-```
-core@localhost ~ $ curl -v https://10.2.78.7:443 -k
-* Rebuilt URL to: https://10.2.78.7:443/
-* Trying 10.2.78.7...
-* Connected to 10.2.78.7 (10.2.78.7) port 443 (#0)
-* ALPN, offering http/1.1
-* Cipher selection: ALL:!EXPORT:!EXPORT40:!EXPORT56:!aNULL:!LOW:!RC4:@STRENGTH
-* successfully set certificate verify locations:
-* CAfile: /etc/ssl/certs/ca-certificates.crt
- CApath: /etc/ssl/certs
-* TLSv1.2 (OUT), TLS header, Certificate Status (22):
-* TLSv1.2 (OUT), TLS handshake, Client hello (1):
-* TLSv1.2 (IN), TLS handshake, Server hello (2):
-* TLSv1.2 (IN), TLS handshake, Certificate (11):
-* TLSv1.2 (IN), TLS handshake, Server key exchange (12):
-* TLSv1.2 (IN), TLS handshake, Server finished (14):
-* TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
-* TLSv1.2 (OUT), TLS change cipher, Client hello (1):
-* TLSv1.2 (OUT), TLS handshake, Finished (20):
-* TLSv1.2 (IN), TLS change cipher, Client hello (1):
-* TLSv1.2 (IN), TLS handshake, Finished (20):
-* SSL connection using TLSv1.2 / ECDHE-RSA-AES128-GCM-SHA256
-* ALPN, server accepted to use http/1.1
-* Server certificate:
-* subject: CN=foo.bar.com
-* start date: Apr 13 00:50:56 2016 GMT
-* expire date: Apr 13 00:50:56 2017 GMT
-* issuer: CN=foo.bar.com
-* SSL certificate verify result: self signed certificate (18), continuing anyway.
-> GET / HTTP/1.1
-> Host: 10.2.78.7
-> User-Agent: curl/7.47.1
-> Accept: */*
->
-< HTTP/1.1 404 Not Found
-< Server: nginx/1.11.1
-< Date: Mon, 18 Jul 2016 21:02:59 GMT
-< Content-Type: text/html
-< Transfer-Encoding: chunked
-< Connection: keep-alive
-< Strict-Transport-Security: max-age=15724800; includeSubDomains; preload
-<
-The page you're looking for could not be found.
-
-* Connection #0 to host 10.2.78.7 left intact
-```
-
-
-### Server-side HTTPS enforcement
-
-By default the controller redirects (301) to HTTPS if TLS is enabled for that ingress . If you want to disable that behaviour globally, you can use `ssl-redirect: "false"` in the NGINX config map.
-
-To configure this feature for specific ingress resources, you can use the `ingress.kubernetes.io/ssl-redirect: "false"` annotation in the particular resource.
-
-
-### HTTP Strict Transport Security
-
-HTTP Strict Transport Security (HSTS) is an opt-in security enhancement specified through the use of a special response header. Once a supported browser receives this header that browser will prevent any communications from being sent over HTTP to the specified domain and will instead send all communications over HTTPS.
-
-By default the controller redirects (301) to HTTPS if there is a TLS Ingress rule.
-
-To disable this behavior use `hsts=false` in the NGINX config map.
-
-
-### Automated Certificate Management with Kube-Lego
-
-[Kube-Lego] automatically requests missing certificates or expired from
-[Let's Encrypt] by monitoring ingress resources and its referenced secrets. To
-enable this for an ingress resource you have to add an annotation:
-
-```
-kubectl annotate ing ingress-demo kubernetes.io/tls-acme="true"
-```
-
-To setup Kube-Lego you can take a look at this [full example]. The first
-version to fully support Kube-Lego is nginx Ingress controller 0.8.
-
-[full example]:https://github.com/jetstack/kube-lego/tree/master/examples
-[Kube-Lego]:https://github.com/jetstack/kube-lego
-[Let's Encrypt]:https://letsencrypt.org
-
-## Exposing TCP services
-
-Ingress does not support TCP services (yet). For this reason this Ingress controller uses the flag `--tcp-services-configmap` to point to an existing config map where the key is the external port to use and the value is `:`
-It is possible to use a number or the name of the port.
-
-The next example shows how to expose the service `example-go` running in the namespace `default` in the port `8080` using the port `9000`
-```
-apiVersion: v1
-kind: ConfigMap
-metadata:
- name: tcp-configmap-example
-data:
- 9000: "default/example-go:8080"
-```
-
-Please check the [tcp services](examples/tcp/README.md) example
-
-## Exposing UDP services
-
-Since 1.9.13 NGINX provides [UDP Load Balancing](https://www.nginx.com/blog/announcing-udp-load-balancing/).
-
-Ingress does not support UDP services (yet). For this reason this Ingress controller uses the flag `--udp-services-configmap` to point to an existing config map where the key is the external port to use and the value is `:`
-It is possible to use a number or the name of the port.
-
-The next example shows how to expose the service `kube-dns` running in the namespace `kube-system` in the port `53` using the port `53`
-```
-apiVersion: v1
-kind: ConfigMap
-metadata:
- name: udp-configmap-example
-data:
- 53: "kube-system/kube-dns:53"
-```
-
-
-Please check the [udp services](examples/udp/README.md) example
-
-## Proxy Protocol
-
-If you are using a L4 proxy to forward the traffic to the NGINX pods and terminate HTTP/HTTPS there, you will lose the remote endpoint's IP addresses. To prevent this you could use the [Proxy Protocol](http://www.haproxy.org/download/1.5/doc/proxy-protocol.txt) for forwarding traffic, this will send the connection details before forwarding the actual TCP connection itself.
-
-Amongst others [ELBs in AWS](http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/enable-proxy-protocol.html) and [HAProxy](http://www.haproxy.org/) support Proxy Protocol.
-
-Please check the [proxy-protocol](examples/proxy-protocol/) example
-
-
-### Custom errors
-
-In case of an error in a request the body of the response is obtained from the `default backend`. Each request to the default backend includes two headers:
-- `X-Code` indicates the HTTP code
-- `X-Format` the value of the `Accept` header
-
-Using this two headers is possible to use a custom backend service like [this one](https://github.com/aledbf/contrib/tree/nginx-debug-server/Ingress/images/nginx-error-server) that inspect each request and returns a custom error page with the format expected by the client. Please check the example [custom-errors](examples/custom-errors/README.md)
-
-### NGINX status page
-
-The ngx_http_stub_status_module module provides access to basic status information. This is the default module active in the url `/nginx_status`.
-This controller provides an alternative to this module using [nginx-module-vts](https://github.com/vozlt/nginx-module-vts) third party module.
-To use this module just provide a config map with the key `enable-vts-status=true`. The URL is exposed in the port 8080.
-Please check the example `example/rc-default.yaml`
-
-![nginx-module-vts screenshot](https://cloud.githubusercontent.com/assets/3648408/10876811/77a67b70-8183-11e5-9924-6a6d0c5dc73a.png "screenshot with filter")
-
-To extract the information in JSON format the module provides a custom URL: `/nginx_status/format/json`
-
-### Running multiple ingress controllers
-
-If you're running multiple ingress controllers, or running on a cloudprovider that natively handles
-ingress, you need to specify the annotation `kubernetes.io/ingress.class: "nginx"` in all ingresses
-that you would like this controller to claim. Not specifying the annotation will lead to multiple
-ingress controllers claiming the same ingress. Specifying the wrong value will result in all ingress
-controllers ignoring the ingress. Multiple ingress controllers running in the same cluster was not
-supported in Kubernetes versions < 1.3.
-
-### Running on Cloudproviders
-
-If you're running this ingress controller on a cloudprovider, you should assume the provider also has a native
-Ingress controller and specify the ingress.class annotation as indicated in this section.
-In addition to this, you will need to add a firewall rule for each port this controller is listening on, i.e :80 and :443.
-
-### Disabling NGINX ingress controller
-
-Setting the annotation `kubernetes.io/ingress.class` to any value other than "nginx" or the empty string, will force the NGINX Ingress controller to ignore your Ingress. Do this if you wish to use one of the other Ingress controllers at the same time as the NGINX controller.
-
-### Log format
-
-The default configuration uses a custom logging format to add additional information about upstreams
-
-```
- log_format upstreaminfo '{{ if $cfg.useProxyProtocol }}$proxy_protocol_addr{{ else }}$remote_addr{{ end }} - '
- '[$proxy_add_x_forwarded_for] - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" '
- '$request_length $request_time [$proxy_upstream_name] $upstream_addr $upstream_response_length $upstream_response_time $upstream_status';
-```
-
-Sources:
- - [upstream variables](http://nginx.org/en/docs/http/ngx_http_upstream_module.html#variables)
- - [embedded variables](http://nginx.org/en/docs/http/ngx_http_core_module.html#variables)
-
-Description:
-- `$proxy_protocol_addr`: if PROXY protocol is enabled
-- `$remote_addr`: if PROXY protocol is disabled (default)
-- `$proxy_add_x_forwarded_for`: the `X-Forwarded-For` client request header field with the $remote_addr variable appended to it, separated by a comma
-- `$remote_user`: user name supplied with the Basic authentication
-- `$time_local`: local time in the Common Log Format
-- `$request`: full original request line
-- `$status`: response status
-- `$body_bytes_sent`: number of bytes sent to a client, not counting the response header
-- `$http_referer`: value of the Referer header
-- `$http_user_agent`: value of User-Agent header
-- `$request_length`: request length (including request line, header, and request body)
-- `$request_time`: time elapsed since the first bytes were read from the client
-- `$proxy_upstream_name`: name of the upstream. The format is `upstream---`
-- `$upstream_addr`: keeps the IP address and port, or the path to the UNIX-domain socket of the upstream server. If several servers were contacted during request processing, their addresses are separated by commas
-- `$upstream_response_length`: keeps the length of the response obtained from the upstream server
-- `$upstream_response_time`: keeps time spent on receiving the response from the upstream server; the time is kept in seconds with millisecond resolution
-- `$upstream_status`: keeps status code of the response obtained from the upstream server
-
-### Local cluster
-
-Using [`hack/local-up-cluster.sh`](https://github.com/kubernetes/kubernetes/blob/master/hack/local-up-cluster.sh) is possible to start a local kubernetes cluster consisting of a master and a single node. Please read [running-locally.md](https://github.com/kubernetes/kubernetes/blob/master/docs/devel/running-locally.md) for more details.
-
-Use of `hostNetwork: true` in the ingress controller is required to falls back at localhost:8080 for the apiserver if every other client creation check fails (eg: service account not present, kubeconfig doesn't exist, no master env vars...)
-
-
-### Debug & Troubleshooting
-
-Using the flag `--v=XX` it is possible to increase the level of logging.
-In particular:
-- `--v=2` shows details using `diff` about the changes in the configuration in nginx
-
-```
-I0316 12:24:37.581267 1 utils.go:148] NGINX configuration diff a//etc/nginx/nginx.conf b//etc/nginx/nginx.conf
-I0316 12:24:37.581356 1 utils.go:149] --- /tmp/922554809 2016-03-16 12:24:37.000000000 +0000
-+++ /tmp/079811012 2016-03-16 12:24:37.000000000 +0000
-@@ -235,7 +235,6 @@
-
- upstream default-echoheadersx {
- least_conn;
-- server 10.2.112.124:5000;
- server 10.2.208.50:5000;
-
- }
-I0316 12:24:37.610073 1 command.go:69] change in configuration detected. Reloading...
-```
-
-- `--v=3` shows details about the service, Ingress rule, endpoint changes and it dumps the nginx configuration in JSON format
-- `--v=5` configures NGINX in [debug mode](http://nginx.org/en/docs/debugging_log.html)
-
-
-
-*These issues were encountered in past versions of Kubernetes:*
-
-[1.2.0-alpha7 deployment](https://github.com/kubernetes/kubernetes/blob/master/docs/getting-started-guides/docker.md):
-
-* make setup-files.sh file in hypercube does not provide 10.0.0.1 IP to make-ca-certs, resulting in CA certs that are issued to the external cluster IP address rather then 10.0.0.1 -> this results in nginx-third-party-lb appearing to get stuck at "Utils.go:177 - Waiting for default/default-http-backend" in the docker logs. Kubernetes will eventually kill the container before nginx-third-party-lb times out with a message indicating that the CA certificate issuer is invalid (wrong ip), to verify this add zeros to the end of initialDelaySeconds and timeoutSeconds and reload the RC, and docker will log this error before kubernetes kills the container.
- * To fix the above, setup-files.sh must be patched before the cluster is inited (refer to https://github.com/kubernetes/kubernetes/pull/21504)
-
-
-### Limitations
-
-- Ingress rules for TLS require the definition of the field `host`
-
-
-### Why endpoints and not services
-
-The NGINX ingress controller does not uses [Services](http://kubernetes.io/docs/user-guide/services) to route traffic to the pods. Instead it uses the Endpoints API in order to bypass [kube-proxy](http://kubernetes.io/docs/admin/kube-proxy/) to allow NGINX features like session affinity and custom load balancing algorithms. It also removes some overhead, such as conntrack entries for iptables DNAT.
-
-
-### NGINX notes
-
-Since `gcr.io/google_containers/nginx-slim:0.8` NGINX contains the next patches:
-- Dynamic TLS record size [nginx__dynamic_tls_records.patch](https://blog.cloudflare.com/optimizing-tls-over-tcp-to-reduce-latency/)
-NGINX provides the parameter `ssl_buffer_size` to adjust the size of the buffer. Default value in NGINX is 16KB. The ingress controller changes the default to 4KB. This improves the [TLS Time To First Byte (TTTFB)](https://www.igvita.com/2013/12/16/optimizing-nginx-tls-time-to-first-byte/) but the size is fixed. This patches adapts the size of the buffer to the content is being served helping to improve the perceived latency.
-
-- Add SPDY support back to Nginx with HTTP/2 [nginx_1_9_15_http2_spdy.patch](https://github.com/cloudflare/sslconfig/pull/36)
-At the same NGINX introduced HTTP/2 support for SPDY was removed. This patch add support for SPDY without compromising HTTP/2 support using the Application-Layer Protocol Negotiation (ALPN) or Next Protocol Negotiation (NPN) Transport Layer Security (TLS) extension to negotiate what protocol the server and client support
-```
-openssl s_client -servername www.my-site.com -connect www.my-site.com:443 -nextprotoneg ''
-CONNECTED(00000003)
-Protocols advertised by server: h2, spdy/3.1, http/1.1
-```
+# Nginx Ingress Controller
diff --git a/controllers/nginx/configuration.md b/controllers/nginx/configuration.md
index b361fc459b..8a65d1949a 100644
--- a/controllers/nginx/configuration.md
+++ b/controllers/nginx/configuration.md
@@ -21,8 +21,8 @@
there are 3 ways to customize nginx
1. config map: create a stand alone config map, use this if you want a different global configuration
-2. annoations: [annotate the ingress](#annotations), use this if you want a specific configuration for the site defined in the ingress rule
-3. custom template: when is required a specific setting like [open_file_cache](http://nginx.org/en/docs/http/ngx_http_core_module.html#open_file_cache), custom [log_format](http://nginx.org/en/docs/http/ngx_http_log_module.html#log_format), adjust [listen](http://nginx.org/en/docs/http/ngx_http_core_module.html#listen) options as `rcvbuf` or when is not possible to change an through the config map
+2. annotations: [annotate the ingress](#annotations), use this if you want a specific configuration for the site defined in the Ingress rule
+3. custom template: when more specific settings are required, like [open_file_cache](http://nginx.org/en/docs/http/ngx_http_core_module.html#open_file_cache), custom [log_format](http://nginx.org/en/docs/http/ngx_http_log_module.html#log_format), adjust [listen](http://nginx.org/en/docs/http/ngx_http_core_module.html#listen) options as `rcvbuf` or when is not possible to change an through the config map
#### Custom NGINX configuration
diff --git a/controllers/nginx/controller.go b/controllers/nginx/controller.go
deleted file mode 100644
index 2e9cdf305d..0000000000
--- a/controllers/nginx/controller.go
+++ /dev/null
@@ -1,1244 +0,0 @@
-/*
-Copyright 2015 The Kubernetes Authors.
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package main
-
-import (
- "encoding/json"
- "fmt"
- "reflect"
- "sort"
- "strconv"
- "strings"
- "sync"
- "time"
-
- "github.com/golang/glog"
-
- "k8s.io/kubernetes/pkg/api"
- podutil "k8s.io/kubernetes/pkg/api/pod"
- "k8s.io/kubernetes/pkg/apis/extensions"
- "k8s.io/kubernetes/pkg/client/cache"
- "k8s.io/kubernetes/pkg/client/record"
- client "k8s.io/kubernetes/pkg/client/unversioned"
- "k8s.io/kubernetes/pkg/controller/framework"
- "k8s.io/kubernetes/pkg/labels"
- "k8s.io/kubernetes/pkg/runtime"
- "k8s.io/kubernetes/pkg/util/intstr"
- "k8s.io/kubernetes/pkg/watch"
-
- "k8s.io/contrib/ingress/controllers/nginx/nginx"
- "k8s.io/contrib/ingress/controllers/nginx/nginx/auth"
- "k8s.io/contrib/ingress/controllers/nginx/nginx/authreq"
- "k8s.io/contrib/ingress/controllers/nginx/nginx/config"
- "k8s.io/contrib/ingress/controllers/nginx/nginx/cors"
- "k8s.io/contrib/ingress/controllers/nginx/nginx/healthcheck"
- "k8s.io/contrib/ingress/controllers/nginx/nginx/ingress"
- "k8s.io/contrib/ingress/controllers/nginx/nginx/ipwhitelist"
- "k8s.io/contrib/ingress/controllers/nginx/nginx/ratelimit"
- "k8s.io/contrib/ingress/controllers/nginx/nginx/rewrite"
- "k8s.io/contrib/ingress/controllers/nginx/nginx/secureupstream"
-)
-
-const (
- defUpstreamName = "upstream-default-backend"
- defServerName = "_"
- namedPortAnnotation = "ingress.kubernetes.io/named-ports"
- podStoreSyncedPollPeriod = 1 * time.Second
- rootLocation = "/"
-)
-
-var (
- keyFunc = framework.DeletionHandlingMetaNamespaceKeyFunc
-)
-
-type namedPortMapping map[string]string
-
-// getPort returns the port defined in a named port
-func (npm namedPortMapping) getPort(name string) (string, bool) {
- val, ok := npm.getPortMappings()[name]
- return val, ok
-}
-
-// getPortMappings returns the map containing the
-// mapping of named port names and the port number
-func (npm namedPortMapping) getPortMappings() map[string]string {
- data := npm[namedPortAnnotation]
- var mapping map[string]string
- if data == "" {
- return mapping
- }
- if err := json.Unmarshal([]byte(data), &mapping); err != nil {
- glog.Errorf("unexpected error reading annotations: %v", err)
- }
-
- return mapping
-}
-
-// loadBalancerController watches the kubernetes api and adds/removes services
-// from the loadbalancer
-type loadBalancerController struct {
- client *client.Client
-
- ingController *framework.Controller
- endpController *framework.Controller
- svcController *framework.Controller
- secrController *framework.Controller
- mapController *framework.Controller
-
- ingLister StoreToIngressLister
- svcLister cache.StoreToServiceLister
- endpLister cache.StoreToEndpointsLister
- secrLister StoreToSecretsLister
- mapLister StoreToConfigmapLister
-
- nginx *nginx.Manager
- podInfo *podInfo
-
- defaultSvc string
-
- nxgConfigMap string
- tcpConfigMap string
- udpConfigMap string
-
- defSSLCertificate string
- defHealthzURL string
-
- recorder record.EventRecorder
-
- syncQueue *taskQueue
-
- // taskQueue used to update the status of the Ingress rules.
- // this avoids a sync execution in the ResourceEventHandlerFuncs
- ingQueue *taskQueue
-
- // stopLock is used to enforce only a single call to Stop is active.
- // Needed because we allow stopping through an http endpoint and
- // allowing concurrent stoppers leads to stack traces.
- stopLock sync.Mutex
- shutdown bool
- stopCh chan struct{}
-}
-
-// newLoadBalancerController creates a controller for nginx loadbalancer
-func newLoadBalancerController(kubeClient *client.Client, resyncPeriod time.Duration,
- defaultSvc, namespace, nxgConfigMapName, tcpConfigMapName, udpConfigMapName,
- defSSLCertificate, defHealthzURL string, runtimeInfo *podInfo) (*loadBalancerController, error) {
-
- eventBroadcaster := record.NewBroadcaster()
- eventBroadcaster.StartLogging(glog.Infof)
- eventBroadcaster.StartRecordingToSink(kubeClient.Events(namespace))
-
- lbc := loadBalancerController{
- client: kubeClient,
- stopCh: make(chan struct{}),
- podInfo: runtimeInfo,
- nginx: nginx.NewManager(kubeClient),
- nxgConfigMap: nxgConfigMapName,
- tcpConfigMap: tcpConfigMapName,
- udpConfigMap: udpConfigMapName,
- defSSLCertificate: defSSLCertificate,
- defaultSvc: defaultSvc,
- defHealthzURL: defHealthzURL,
- recorder: eventBroadcaster.NewRecorder(api.EventSource{
- Component: "nginx-ingress-controller",
- }),
- }
-
- lbc.syncQueue = NewTaskQueue(lbc.sync)
- lbc.ingQueue = NewTaskQueue(lbc.updateIngressStatus)
-
- ingEventHandler := framework.ResourceEventHandlerFuncs{
- AddFunc: func(obj interface{}) {
- addIng := obj.(*extensions.Ingress)
- if !isNGINXIngress(addIng) {
- glog.Infof("Ignoring add for ingress %v based on annotation %v", addIng.Name, ingressClassKey)
- return
- }
- lbc.recorder.Eventf(addIng, api.EventTypeNormal, "CREATE", fmt.Sprintf("%s/%s", addIng.Namespace, addIng.Name))
- lbc.ingQueue.enqueue(obj)
- lbc.syncQueue.enqueue(obj)
- },
- DeleteFunc: func(obj interface{}) {
- delIng := obj.(*extensions.Ingress)
- if !isNGINXIngress(delIng) {
- glog.Infof("Ignoring add for ingress %v based on annotation %v", delIng.Name, ingressClassKey)
- return
- }
- lbc.recorder.Eventf(delIng, api.EventTypeNormal, "DELETE", fmt.Sprintf("%s/%s", delIng.Namespace, delIng.Name))
- lbc.syncQueue.enqueue(obj)
- },
- UpdateFunc: func(old, cur interface{}) {
- curIng := cur.(*extensions.Ingress)
- if !isNGINXIngress(curIng) {
- return
- }
- if !reflect.DeepEqual(old, cur) {
- upIng := cur.(*extensions.Ingress)
- lbc.recorder.Eventf(upIng, api.EventTypeNormal, "UPDATE", fmt.Sprintf("%s/%s", upIng.Namespace, upIng.Name))
- lbc.ingQueue.enqueue(cur)
- lbc.syncQueue.enqueue(cur)
- }
- },
- }
-
- secrEventHandler := framework.ResourceEventHandlerFuncs{
- AddFunc: func(obj interface{}) {
- addSecr := obj.(*api.Secret)
- if lbc.secrReferenced(addSecr.Namespace, addSecr.Name) {
- lbc.recorder.Eventf(addSecr, api.EventTypeNormal, "CREATE", fmt.Sprintf("%s/%s", addSecr.Namespace, addSecr.Name))
- lbc.syncQueue.enqueue(obj)
- }
- },
- DeleteFunc: func(obj interface{}) {
- delSecr := obj.(*api.Secret)
- if lbc.secrReferenced(delSecr.Namespace, delSecr.Name) {
- lbc.recorder.Eventf(delSecr, api.EventTypeNormal, "DELETE", fmt.Sprintf("%s/%s", delSecr.Namespace, delSecr.Name))
- lbc.syncQueue.enqueue(obj)
- }
- },
- UpdateFunc: func(old, cur interface{}) {
- if !reflect.DeepEqual(old, cur) {
- upSecr := cur.(*api.Secret)
- if lbc.secrReferenced(upSecr.Namespace, upSecr.Name) {
- lbc.recorder.Eventf(upSecr, api.EventTypeNormal, "UPDATE", fmt.Sprintf("%s/%s", upSecr.Namespace, upSecr.Name))
- lbc.syncQueue.enqueue(cur)
- }
- }
- },
- }
-
- eventHandler := framework.ResourceEventHandlerFuncs{
- AddFunc: func(obj interface{}) {
- lbc.syncQueue.enqueue(obj)
- },
- DeleteFunc: func(obj interface{}) {
- lbc.syncQueue.enqueue(obj)
- },
- UpdateFunc: func(old, cur interface{}) {
- if !reflect.DeepEqual(old, cur) {
- lbc.syncQueue.enqueue(cur)
- }
- },
- }
-
- mapEventHandler := framework.ResourceEventHandlerFuncs{
- UpdateFunc: func(old, cur interface{}) {
- if !reflect.DeepEqual(old, cur) {
- upCmap := cur.(*api.ConfigMap)
- mapKey := fmt.Sprintf("%s/%s", upCmap.Namespace, upCmap.Name)
- // updates to configuration configmaps can trigger an update
- if mapKey == lbc.nxgConfigMap || mapKey == lbc.tcpConfigMap || mapKey == lbc.udpConfigMap {
- lbc.recorder.Eventf(upCmap, api.EventTypeNormal, "UPDATE", mapKey)
- lbc.syncQueue.enqueue(cur)
- }
- }
- },
- }
-
- lbc.ingLister.Store, lbc.ingController = framework.NewInformer(
- &cache.ListWatch{
- ListFunc: ingressListFunc(lbc.client, namespace),
- WatchFunc: ingressWatchFunc(lbc.client, namespace),
- },
- &extensions.Ingress{}, resyncPeriod, ingEventHandler)
-
- lbc.endpLister.Store, lbc.endpController = framework.NewInformer(
- &cache.ListWatch{
- ListFunc: endpointsListFunc(lbc.client, namespace),
- WatchFunc: endpointsWatchFunc(lbc.client, namespace),
- },
- &api.Endpoints{}, resyncPeriod, eventHandler)
-
- lbc.svcLister.Store, lbc.svcController = framework.NewInformer(
- &cache.ListWatch{
- ListFunc: serviceListFunc(lbc.client, namespace),
- WatchFunc: serviceWatchFunc(lbc.client, namespace),
- },
- &api.Service{}, resyncPeriod, framework.ResourceEventHandlerFuncs{})
-
- lbc.secrLister.Store, lbc.secrController = framework.NewInformer(
- &cache.ListWatch{
- ListFunc: secretsListFunc(lbc.client, namespace),
- WatchFunc: secretsWatchFunc(lbc.client, namespace),
- },
- &api.Secret{}, resyncPeriod, secrEventHandler)
-
- lbc.mapLister.Store, lbc.mapController = framework.NewInformer(
- &cache.ListWatch{
- ListFunc: mapListFunc(lbc.client, namespace),
- WatchFunc: mapWatchFunc(lbc.client, namespace),
- },
- &api.ConfigMap{}, resyncPeriod, mapEventHandler)
-
- return &lbc, nil
-}
-
-func ingressListFunc(c *client.Client, ns string) func(api.ListOptions) (runtime.Object, error) {
- return func(opts api.ListOptions) (runtime.Object, error) {
- return c.Extensions().Ingress(ns).List(opts)
- }
-}
-
-func ingressWatchFunc(c *client.Client, ns string) func(options api.ListOptions) (watch.Interface, error) {
- return func(options api.ListOptions) (watch.Interface, error) {
- return c.Extensions().Ingress(ns).Watch(options)
- }
-}
-
-func serviceListFunc(c *client.Client, ns string) func(api.ListOptions) (runtime.Object, error) {
- return func(opts api.ListOptions) (runtime.Object, error) {
- return c.Services(ns).List(opts)
- }
-}
-
-func serviceWatchFunc(c *client.Client, ns string) func(options api.ListOptions) (watch.Interface, error) {
- return func(options api.ListOptions) (watch.Interface, error) {
- return c.Services(ns).Watch(options)
- }
-}
-
-func endpointsListFunc(c *client.Client, ns string) func(api.ListOptions) (runtime.Object, error) {
- return func(opts api.ListOptions) (runtime.Object, error) {
- return c.Endpoints(ns).List(opts)
- }
-}
-
-func endpointsWatchFunc(c *client.Client, ns string) func(options api.ListOptions) (watch.Interface, error) {
- return func(options api.ListOptions) (watch.Interface, error) {
- return c.Endpoints(ns).Watch(options)
- }
-}
-
-func secretsListFunc(c *client.Client, ns string) func(api.ListOptions) (runtime.Object, error) {
- return func(opts api.ListOptions) (runtime.Object, error) {
- return c.Secrets(ns).List(opts)
- }
-}
-
-func secretsWatchFunc(c *client.Client, ns string) func(options api.ListOptions) (watch.Interface, error) {
- return func(options api.ListOptions) (watch.Interface, error) {
- return c.Secrets(ns).Watch(options)
- }
-}
-
-func mapListFunc(c *client.Client, ns string) func(api.ListOptions) (runtime.Object, error) {
- return func(opts api.ListOptions) (runtime.Object, error) {
- return c.ConfigMaps(ns).List(opts)
- }
-}
-
-func mapWatchFunc(c *client.Client, ns string) func(options api.ListOptions) (watch.Interface, error) {
- return func(options api.ListOptions) (watch.Interface, error) {
- return c.ConfigMaps(ns).Watch(options)
- }
-}
-
-func (lbc *loadBalancerController) controllersInSync() bool {
- return lbc.ingController.HasSynced() &&
- lbc.svcController.HasSynced() &&
- lbc.endpController.HasSynced() &&
- lbc.secrController.HasSynced() &&
- lbc.mapController.HasSynced()
-}
-
-func (lbc *loadBalancerController) getConfigMap(ns, name string) (*api.ConfigMap, error) {
- // TODO: check why lbc.mapLister.Store.GetByKey(mapKey) is not stable (random content)
- return lbc.client.ConfigMaps(ns).Get(name)
-}
-
-func (lbc *loadBalancerController) getTCPConfigMap(ns, name string) (*api.ConfigMap, error) {
- return lbc.getConfigMap(ns, name)
-}
-
-func (lbc *loadBalancerController) getUDPConfigMap(ns, name string) (*api.ConfigMap, error) {
- return lbc.getConfigMap(ns, name)
-}
-
-// checkSvcForUpdate verifies if one of the running pods for a service contains
-// named port. If the annotation in the service does not exists or is not equals
-// to the port mapping obtained from the pod the service must be updated to reflect
-// the current state
-func (lbc *loadBalancerController) checkSvcForUpdate(svc *api.Service) (map[string]string, error) {
- // get the pods associated with the service
- // TODO: switch this to a watch
- pods, err := lbc.client.Pods(svc.Namespace).List(api.ListOptions{
- LabelSelector: labels.Set(svc.Spec.Selector).AsSelector(),
- })
-
- namedPorts := map[string]string{}
- if err != nil {
- return namedPorts, fmt.Errorf("error searching service pods %v/%v: %v", svc.Namespace, svc.Name, err)
- }
-
- if len(pods.Items) == 0 {
- return namedPorts, nil
- }
-
- // we need to check only one pod searching for named ports
- pod := &pods.Items[0]
- glog.V(4).Infof("checking pod %v/%v for named port information", pod.Namespace, pod.Name)
- for i := range svc.Spec.Ports {
- servicePort := &svc.Spec.Ports[i]
-
- _, err := strconv.Atoi(servicePort.TargetPort.StrVal)
- if err != nil {
- portNum, err := podutil.FindPort(pod, servicePort)
- if err != nil {
- glog.V(4).Infof("failed to find port for service %s/%s: %v", svc.Namespace, svc.Name, err)
- continue
- }
-
- if servicePort.TargetPort.StrVal == "" {
- continue
- }
-
- namedPorts[servicePort.TargetPort.StrVal] = fmt.Sprintf("%v", portNum)
- }
- }
-
- if svc.ObjectMeta.Annotations == nil {
- svc.ObjectMeta.Annotations = map[string]string{}
- }
-
- curNamedPort := svc.ObjectMeta.Annotations[namedPortAnnotation]
- if len(namedPorts) > 0 && !reflect.DeepEqual(curNamedPort, namedPorts) {
- data, _ := json.Marshal(namedPorts)
-
- newSvc, err := lbc.client.Services(svc.Namespace).Get(svc.Name)
- if err != nil {
- return namedPorts, fmt.Errorf("error getting service %v/%v: %v", svc.Namespace, svc.Name, err)
- }
-
- if newSvc.ObjectMeta.Annotations == nil {
- newSvc.ObjectMeta.Annotations = map[string]string{}
- }
-
- newSvc.ObjectMeta.Annotations[namedPortAnnotation] = string(data)
- glog.Infof("updating service %v with new named port mappings", svc.Name)
- _, err = lbc.client.Services(svc.Namespace).Update(newSvc)
- if err != nil {
- return namedPorts, fmt.Errorf("error syncing service %v/%v: %v", svc.Namespace, svc.Name, err)
- }
-
- return newSvc.ObjectMeta.Annotations, nil
- }
-
- return namedPorts, nil
-}
-
-func (lbc *loadBalancerController) sync(key string) error {
- if !lbc.controllersInSync() {
- time.Sleep(podStoreSyncedPollPeriod)
- return fmt.Errorf("deferring sync till endpoints controller has synced")
- }
-
- // by default no custom configuration configmap
- cfg := &api.ConfigMap{}
-
- if lbc.nxgConfigMap != "" {
- // Search for custom configmap (defined in main args)
- var err error
- ns, name, _ := parseNsName(lbc.nxgConfigMap)
- cfg, err = lbc.getConfigMap(ns, name)
- if err != nil {
- return fmt.Errorf("unexpected error searching configmap %v: %v", lbc.nxgConfigMap, err)
- }
- }
-
- ngxConfig := lbc.nginx.ReadConfig(cfg)
- ngxConfig.HealthzURL = lbc.defHealthzURL
-
- ings := lbc.ingLister.Store.List()
- upstreams, servers := lbc.getUpstreamServers(ngxConfig, ings)
-
- return lbc.nginx.CheckAndReload(ngxConfig, ingress.Configuration{
- Upstreams: upstreams,
- Servers: servers,
- TCPUpstreams: lbc.getTCPServices(),
- UDPUpstreams: lbc.getUDPServices(),
- })
-}
-
-func (lbc *loadBalancerController) updateIngressStatus(key string) error {
- if !lbc.controllersInSync() {
- time.Sleep(podStoreSyncedPollPeriod)
- return fmt.Errorf("deferring sync till endpoints controller has synced")
- }
-
- obj, ingExists, err := lbc.ingLister.Store.GetByKey(key)
- if err != nil {
- return err
- }
-
- if !ingExists {
- // TODO: what's the correct behavior here?
- return nil
- }
-
- ing := obj.(*extensions.Ingress)
-
- ingClient := lbc.client.Extensions().Ingress(ing.Namespace)
-
- currIng, err := ingClient.Get(ing.Name)
- if err != nil {
- return fmt.Errorf("unexpected error searching Ingress %v/%v: %v", ing.Namespace, ing.Name, err)
- }
-
- lbIPs := ing.Status.LoadBalancer.Ingress
- if !lbc.isStatusIPDefined(lbIPs) {
- glog.Infof("Updating loadbalancer %v/%v with IP %v", ing.Namespace, ing.Name, lbc.podInfo.NodeIP)
- currIng.Status.LoadBalancer.Ingress = append(currIng.Status.LoadBalancer.Ingress, api.LoadBalancerIngress{
- IP: lbc.podInfo.NodeIP,
- })
- if _, err := ingClient.UpdateStatus(currIng); err != nil {
- lbc.recorder.Eventf(currIng, api.EventTypeWarning, "UPDATE", "error: %v", err)
- return err
- }
-
- lbc.recorder.Eventf(currIng, api.EventTypeNormal, "CREATE", "ip: %v", lbc.podInfo.NodeIP)
- }
-
- return nil
-}
-
-func (lbc *loadBalancerController) isStatusIPDefined(lbings []api.LoadBalancerIngress) bool {
- for _, lbing := range lbings {
- if lbing.IP == lbc.podInfo.NodeIP {
- return true
- }
- }
-
- return false
-}
-
-func (lbc *loadBalancerController) getTCPServices() []*ingress.Location {
- if lbc.tcpConfigMap == "" {
- // no configmap for TCP services
- return []*ingress.Location{}
- }
-
- ns, name, err := parseNsName(lbc.tcpConfigMap)
- if err != nil {
- glog.Warningf("%v", err)
- return []*ingress.Location{}
- }
- tcpMap, err := lbc.getTCPConfigMap(ns, name)
- if err != nil {
- glog.V(3).Infof("no configured tcp services found: %v", err)
- return []*ingress.Location{}
- }
-
- return lbc.getStreamServices(tcpMap.Data, api.ProtocolTCP)
-}
-
-func (lbc *loadBalancerController) getUDPServices() []*ingress.Location {
- if lbc.udpConfigMap == "" {
- // no configmap for TCP services
- return []*ingress.Location{}
- }
-
- ns, name, err := parseNsName(lbc.udpConfigMap)
- if err != nil {
- glog.Warningf("%v", err)
- return []*ingress.Location{}
- }
- tcpMap, err := lbc.getUDPConfigMap(ns, name)
- if err != nil {
- glog.V(3).Infof("no configured tcp services found: %v", err)
- return []*ingress.Location{}
- }
-
- return lbc.getStreamServices(tcpMap.Data, api.ProtocolUDP)
-}
-
-func (lbc *loadBalancerController) getStreamServices(data map[string]string, proto api.Protocol) []*ingress.Location {
- var svcs []*ingress.Location
- // k -> port to expose in nginx
- // v -> /:
- for k, v := range data {
- port, err := strconv.Atoi(k)
- if err != nil {
- glog.Warningf("%v is not valid as a TCP port", k)
- continue
- }
-
- // this ports are required for NGINX
- if k == "80" || k == "443" || k == "8181" {
- glog.Warningf("port %v cannot be used for TCP or UDP services. Is reserved for NGINX", k)
- continue
- }
-
- nsSvcPort := strings.Split(v, ":")
- if len(nsSvcPort) != 2 {
- glog.Warningf("invalid format (namespace/name:port) '%v'", k)
- continue
- }
-
- nsName := nsSvcPort[0]
- svcPort := nsSvcPort[1]
-
- svcNs, svcName, err := parseNsName(nsName)
- if err != nil {
- glog.Warningf("%v", err)
- continue
- }
-
- svcObj, svcExists, err := lbc.svcLister.Store.GetByKey(nsName)
- if err != nil {
- glog.Warningf("error getting service %v: %v", nsName, err)
- continue
- }
-
- if !svcExists {
- glog.Warningf("service %v was not found", nsName)
- continue
- }
-
- svc := svcObj.(*api.Service)
-
- var endps []ingress.UpstreamServer
- targetPort, err := strconv.Atoi(svcPort)
- if err != nil {
- for _, sp := range svc.Spec.Ports {
- if sp.Name == svcPort {
- endps = lbc.getEndpoints(svc, sp.TargetPort, proto, &healthcheck.Upstream{})
- break
- }
- }
- } else {
- // we need to use the TargetPort (where the endpoints are running)
- for _, sp := range svc.Spec.Ports {
- if sp.Port == int32(targetPort) {
- endps = lbc.getEndpoints(svc, sp.TargetPort, proto, &healthcheck.Upstream{})
- break
- }
- }
- }
-
- // tcp upstreams cannot contain empty upstreams and there is no
- // default backend equivalent for TCP
- if len(endps) == 0 {
- glog.Warningf("service %v/%v does not have any active endpoints", svcNs, svcName)
- continue
- }
-
- svcs = append(svcs, &ingress.Location{
- Path: k,
- Upstream: ingress.Upstream{
- Name: fmt.Sprintf("%v-%v-%v", svcNs, svcName, port),
- Backends: endps,
- },
- })
- }
-
- return svcs
-}
-
-// getDefaultUpstream returns an NGINX upstream associated with the
-// default backend service. In case of error retrieving information
-// configure the upstream to return http code 503.
-func (lbc *loadBalancerController) getDefaultUpstream() *ingress.Upstream {
- upstream := &ingress.Upstream{
- Name: defUpstreamName,
- }
- svcKey := lbc.defaultSvc
- svcObj, svcExists, err := lbc.svcLister.Store.GetByKey(svcKey)
- if err != nil {
- glog.Warningf("unexpected error searching the default backend %v: %v", lbc.defaultSvc, err)
- upstream.Backends = append(upstream.Backends, nginx.NewDefaultServer())
- return upstream
- }
-
- if !svcExists {
- glog.Warningf("service %v does not exists", svcKey)
- upstream.Backends = append(upstream.Backends, nginx.NewDefaultServer())
- return upstream
- }
-
- svc := svcObj.(*api.Service)
-
- endps := lbc.getEndpoints(svc, svc.Spec.Ports[0].TargetPort, api.ProtocolTCP, &healthcheck.Upstream{})
- if len(endps) == 0 {
- glog.Warningf("service %v does not have any active endpoints", svcKey)
- endps = []ingress.UpstreamServer{nginx.NewDefaultServer()}
- } else {
- upstream.Backends = append(upstream.Backends, endps...)
- }
-
- return upstream
-}
-
-// getUpstreamServers returns a list of Upstream and Server to be used in NGINX.
-// An upstream can be used in multiple servers if the namespace, service name and port are the same
-func (lbc *loadBalancerController) getUpstreamServers(ngxCfg config.Configuration, data []interface{}) ([]*ingress.Upstream, []*ingress.Server) {
- upstreams := lbc.createUpstreams(ngxCfg, data)
- servers := lbc.createServers(data, upstreams)
-
- for _, ingIf := range data {
- ing := ingIf.(*extensions.Ingress)
-
- nginxAuth, err := auth.ParseAnnotations(lbc.client, ing, auth.DefAuthDirectory)
- glog.V(3).Infof("nginx auth %v", nginxAuth)
- if err != nil {
- glog.V(3).Infof("error reading authentication in Ingress %v/%v: %v", ing.GetNamespace(), ing.GetName(), err)
- }
-
- rl, err := ratelimit.ParseAnnotations(ing)
- glog.V(3).Infof("nginx rate limit %v", rl)
- if err != nil {
- glog.V(3).Infof("error reading rate limit annotation in Ingress %v/%v: %v", ing.GetNamespace(), ing.GetName(), err)
- }
-
- secUpstream, err := secureupstream.ParseAnnotations(ing)
- if err != nil {
- glog.V(3).Infof("error reading secure upstream in Ingress %v/%v: %v", ing.GetNamespace(), ing.GetName(), err)
- }
-
- locRew, err := rewrite.ParseAnnotations(ngxCfg, ing)
- if err != nil {
- glog.V(3).Infof("error parsing rewrite annotations for Ingress rule %v/%v: %v", ing.GetNamespace(), ing.GetName(), err)
- }
-
- wl, err := ipwhitelist.ParseAnnotations(ngxCfg.WhitelistSourceRange, ing)
- glog.V(3).Infof("nginx white list %v", wl)
- if err != nil {
- glog.V(3).Infof("error reading white list annotation in Ingress %v/%v: %v", ing.GetNamespace(), ing.GetName(), err)
- }
-
- eCORS, err := cors.ParseAnnotations(ing)
- if err != nil {
- glog.V(3).Infof("error reading CORS annotation in Ingress %v/%v: %v", ing.GetNamespace(), ing.GetName(), err)
- }
-
- ra, err := authreq.ParseAnnotations(ing)
- glog.V(3).Infof("nginx auth request %v", ra)
- if err != nil {
- glog.V(3).Infof("error reading auth request annotation in Ingress %v/%v: %v", ing.GetNamespace(), ing.GetName(), err)
- }
-
- for _, rule := range ing.Spec.Rules {
- host := rule.Host
- if host == "" {
- host = defServerName
- }
- server := servers[host]
- if server == nil {
- server = servers[defServerName]
- }
-
- if rule.HTTP == nil && host != defServerName {
- // no rules, host is not default server.
- // check if Ingress rules contains Backend and replace default backend
- defBackend := fmt.Sprintf("default-backend-%v-%v-%v", ing.GetNamespace(), ing.Spec.Backend.ServiceName, ing.Spec.Backend.ServicePort.String())
- ups := upstreams[defBackend]
- for _, loc := range server.Locations {
- loc.Upstream = *ups
- }
- continue
- }
-
- for _, path := range rule.HTTP.Paths {
- upsName := fmt.Sprintf("%v-%v-%v", ing.GetNamespace(), path.Backend.ServiceName, path.Backend.ServicePort.String())
- ups := upstreams[upsName]
-
- // we need to check if the upstream contains the default backend
- if isDefaultUpstream(ups) && ing.Spec.Backend != nil {
- defBackend := fmt.Sprintf("default-backend-%v-%v-%v", ing.GetNamespace(), ing.Spec.Backend.ServiceName, ing.Spec.Backend.ServicePort.String())
- if defUps, ok := upstreams[defBackend]; ok {
- ups = defUps
- }
- }
-
- nginxPath := path.Path
- // if there's no path defined we assume /
- // in NGINX / == /*
- if nginxPath == "" {
- lbc.recorder.Eventf(ing, api.EventTypeWarning, "MAPPING",
- "Ingress rule '%v/%v' contains no path definition. Assuming /",
- ing.GetNamespace(), ing.GetName())
- nginxPath = rootLocation
- }
-
- // Validate that there is no previous rule for the same host and path.
- addLoc := true
- for _, loc := range server.Locations {
- if loc.Path == rootLocation && nginxPath == rootLocation && loc.IsDefBackend {
- loc.Upstream = *ups
- loc.Auth = *nginxAuth
- loc.RateLimit = *rl
- loc.Redirect = *locRew
- loc.SecureUpstream = secUpstream
- loc.Whitelist = *wl
- loc.IsDefBackend = false
- loc.Upstream = *ups
- loc.EnableCORS = eCORS
- loc.ExternalAuthURL = ra
-
- addLoc = false
- continue
- }
-
- if loc.Path == nginxPath {
- lbc.recorder.Eventf(ing, api.EventTypeWarning, "MAPPING",
- "Path '%v' already defined in another Ingress rule", nginxPath)
- addLoc = false
- break
- }
- }
-
- if addLoc {
- server.Locations = append(server.Locations, &ingress.Location{
- Path: nginxPath,
- Upstream: *ups,
- Auth: *nginxAuth,
- RateLimit: *rl,
- Redirect: *locRew,
- SecureUpstream: secUpstream,
- Whitelist: *wl,
- EnableCORS: eCORS,
- ExternalAuthURL: ra,
- })
- }
- }
- }
- }
-
- // TODO: find a way to make this more readable
- // The structs must be ordered to always generate the same file
- // if the content does not change.
- aUpstreams := make([]*ingress.Upstream, 0, len(upstreams))
- for _, value := range upstreams {
- if len(value.Backends) == 0 {
- glog.Warningf("upstream %v does not have any active endpoints. Using default backend", value.Name)
- value.Backends = append(value.Backends, nginx.NewDefaultServer())
- }
- sort.Sort(ingress.UpstreamServerByAddrPort(value.Backends))
- aUpstreams = append(aUpstreams, value)
- }
- sort.Sort(ingress.UpstreamByNameServers(aUpstreams))
-
- aServers := make([]*ingress.Server, 0, len(servers))
- for _, value := range servers {
- sort.Sort(ingress.LocationByPath(value.Locations))
- aServers = append(aServers, value)
- }
- sort.Sort(ingress.ServerByName(aServers))
-
- return aUpstreams, aServers
-}
-
-// createUpstreams creates the NGINX upstreams for each service referenced in
-// Ingress rules. The servers inside the upstream are endpoints.
-func (lbc *loadBalancerController) createUpstreams(ngxCfg config.Configuration, data []interface{}) map[string]*ingress.Upstream {
- upstreams := make(map[string]*ingress.Upstream)
- upstreams[defUpstreamName] = lbc.getDefaultUpstream()
-
- for _, ingIf := range data {
- ing := ingIf.(*extensions.Ingress)
-
- hz := healthcheck.ParseAnnotations(ngxCfg, ing)
-
- var defBackend string
- if ing.Spec.Backend != nil {
- defBackend = fmt.Sprintf("default-backend-%v-%v-%v", ing.GetNamespace(), ing.Spec.Backend.ServiceName, ing.Spec.Backend.ServicePort.String())
- glog.V(3).Infof("creating upstream %v", defBackend)
- upstreams[defBackend] = nginx.NewUpstream(defBackend)
-
- svcKey := fmt.Sprintf("%v/%v", ing.GetNamespace(), ing.Spec.Backend.ServiceName)
- endps, err := lbc.getSvcEndpoints(svcKey, ing.Spec.Backend.ServicePort.String(), hz)
- upstreams[defBackend].Backends = append(upstreams[defBackend].Backends, endps...)
- if err != nil {
- glog.Warningf("error creating upstream %v: %v", defBackend, err)
- }
- }
-
- for _, rule := range ing.Spec.Rules {
- if rule.IngressRuleValue.HTTP == nil {
- continue
- }
-
- for _, path := range rule.HTTP.Paths {
- name := fmt.Sprintf("%v-%v-%v", ing.GetNamespace(), path.Backend.ServiceName, path.Backend.ServicePort.String())
- if _, ok := upstreams[name]; ok {
- continue
- }
-
- glog.V(3).Infof("creating upstream %v", name)
- upstreams[name] = nginx.NewUpstream(name)
-
- svcKey := fmt.Sprintf("%v/%v", ing.GetNamespace(), path.Backend.ServiceName)
- endp, err := lbc.getSvcEndpoints(svcKey, path.Backend.ServicePort.String(), hz)
- if err != nil {
- glog.Warningf("error obtaining service endpoints: %v", err)
- continue
- }
- upstreams[name].Backends = endp
- }
- }
- }
-
- return upstreams
-}
-
-func (lbc *loadBalancerController) getSvcEndpoints(svcKey, backendPort string,
- hz *healthcheck.Upstream) ([]ingress.UpstreamServer, error) {
- svcObj, svcExists, err := lbc.svcLister.Store.GetByKey(svcKey)
-
- var upstreams []ingress.UpstreamServer
- if err != nil {
- return upstreams, fmt.Errorf("error getting service %v from the cache: %v", svcKey, err)
- }
-
- if !svcExists {
- err = fmt.Errorf("service %v does not exists", svcKey)
- return upstreams, err
- }
-
- svc := svcObj.(*api.Service)
- glog.V(3).Infof("obtaining port information for service %v", svcKey)
- for _, servicePort := range svc.Spec.Ports {
- // targetPort could be a string, use the name or the port (int)
- if strconv.Itoa(int(servicePort.Port)) == backendPort ||
- servicePort.TargetPort.String() == backendPort ||
- servicePort.Name == backendPort {
-
- endps := lbc.getEndpoints(svc, servicePort.TargetPort, api.ProtocolTCP, hz)
- if len(endps) == 0 {
- glog.Warningf("service %v does not have any active endpoints", svcKey)
- }
-
- upstreams = append(upstreams, endps...)
- break
- }
- }
-
- return upstreams, nil
-}
-
-func (lbc *loadBalancerController) createServers(data []interface{}, upstreams map[string]*ingress.Upstream) map[string]*ingress.Server {
- servers := make(map[string]*ingress.Server)
-
- pems := lbc.getPemsFromIngress(data)
-
- var ngxCert ingress.SSLCert
- var err error
-
- if lbc.defSSLCertificate == "" {
- // use system certificated generated at image build time
- cert, key := getFakeSSLCert()
- ngxCert, err = lbc.nginx.AddOrUpdateCertAndKey("system-snake-oil-certificate", cert, key)
- } else {
- ngxCert, err = lbc.getPemCertificate(lbc.defSSLCertificate)
- }
-
- locs := []*ingress.Location{}
- locs = append(locs, &ingress.Location{
- Path: rootLocation,
- IsDefBackend: true,
- Upstream: *lbc.getDefaultUpstream(),
- })
- servers[defServerName] = &ingress.Server{Name: defServerName, Locations: locs}
-
- if err == nil {
- pems[defServerName] = ngxCert
- servers[defServerName].SSL = true
- servers[defServerName].SSLCertificate = ngxCert.PemFileName
- servers[defServerName].SSLCertificateKey = ngxCert.PemFileName
- servers[defServerName].SSLPemChecksum = ngxCert.PemSHA
- } else {
- glog.Warningf("unexpected error reading default SSL certificate: %v", err)
- }
-
- for _, ingIf := range data {
- ing := ingIf.(*extensions.Ingress)
-
- for _, rule := range ing.Spec.Rules {
- host := rule.Host
- if host == "" {
- host = defServerName
- }
-
- if _, ok := servers[host]; ok {
- glog.V(3).Infof("rule %v/%v uses a host already defined. Skipping server creation", ing.GetNamespace(), ing.GetName())
- } else {
- locs := []*ingress.Location{}
- loc := &ingress.Location{
- Path: rootLocation,
- IsDefBackend: true,
- Upstream: *lbc.getDefaultUpstream(),
- }
-
- if ing.Spec.Backend != nil {
- defUpstream := fmt.Sprintf("default-backend-%v-%v-%v", ing.GetNamespace(), ing.Spec.Backend.ServiceName, ing.Spec.Backend.ServicePort.String())
- if backendUpstream, ok := upstreams[defUpstream]; ok {
- if host == "" || host == defServerName {
- lbc.recorder.Eventf(ing, api.EventTypeWarning, "MAPPING", "error: rules with Spec.Backend are allowed with hostnames")
- } else {
- loc.Upstream = *backendUpstream
- }
- }
- }
-
- locs = append(locs, loc)
- servers[host] = &ingress.Server{Name: host, Locations: locs}
- }
-
- if ngxCert, ok := pems[host]; ok {
- server := servers[host]
- server.SSL = true
- server.SSLCertificate = ngxCert.PemFileName
- server.SSLCertificateKey = ngxCert.PemFileName
- server.SSLPemChecksum = ngxCert.PemSHA
- }
- }
- }
-
- return servers
-}
-
-func (lbc *loadBalancerController) getPemsFromIngress(data []interface{}) map[string]ingress.SSLCert {
- pems := make(map[string]ingress.SSLCert)
-
- for _, ingIf := range data {
- ing := ingIf.(*extensions.Ingress)
- for _, tls := range ing.Spec.TLS {
- secretName := tls.SecretName
- secretKey := fmt.Sprintf("%s/%s", ing.Namespace, secretName)
-
- ngxCert, err := lbc.getPemCertificate(secretKey)
- if err != nil {
- glog.Warningf("%v", err)
- continue
- }
-
- for _, host := range tls.Hosts {
- if isHostValid(host, ngxCert.CN) {
- pems[host] = ngxCert
- } else {
- glog.Warningf("SSL Certificate stored in secret %v is not valid for the host %v defined in the Ingress rule %v", secretName, host, ing.Name)
- }
- }
- }
- }
-
- return pems
-}
-
-func (lbc *loadBalancerController) getPemCertificate(secretName string) (ingress.SSLCert, error) {
- secretInterface, exists, err := lbc.secrLister.Store.GetByKey(secretName)
- if err != nil {
- return ingress.SSLCert{}, fmt.Errorf("Error retriveing secret %v: %v", secretName, err)
- }
- if !exists {
- return ingress.SSLCert{}, fmt.Errorf("Secret %v does not exists", secretName)
- }
-
- secret := secretInterface.(*api.Secret)
- cert, ok := secret.Data[api.TLSCertKey]
- if !ok {
- return ingress.SSLCert{}, fmt.Errorf("Secret %v has no private key", secretName)
- }
- key, ok := secret.Data[api.TLSPrivateKeyKey]
- if !ok {
- return ingress.SSLCert{}, fmt.Errorf("Secret %v has no cert", secretName)
- }
-
- nsSecName := strings.Replace(secretName, "/", "-", -1)
- return lbc.nginx.AddOrUpdateCertAndKey(nsSecName, string(cert), string(key))
-}
-
-// check if secret is referenced in this controller's config
-func (lbc *loadBalancerController) secrReferenced(namespace string, name string) bool {
- for _, ingIf := range lbc.ingLister.Store.List() {
- ing := ingIf.(*extensions.Ingress)
- if ing.Namespace != namespace {
- continue
- }
- for _, tls := range ing.Spec.TLS {
- if tls.SecretName == name {
- return true
- }
- }
- }
- return false
-}
-
-// getEndpoints returns a list of : for a given service/target port combination.
-func (lbc *loadBalancerController) getEndpoints(
- s *api.Service,
- servicePort intstr.IntOrString,
- proto api.Protocol,
- hz *healthcheck.Upstream) []ingress.UpstreamServer {
- glog.V(3).Infof("getting endpoints for service %v/%v and port %v", s.Namespace, s.Name, servicePort.String())
- ep, err := lbc.endpLister.GetServiceEndpoints(s)
- if err != nil {
- glog.Warningf("unexpected error obtaining service endpoints: %v", err)
- return []ingress.UpstreamServer{}
- }
-
- upsServers := []ingress.UpstreamServer{}
-
- for _, ss := range ep.Subsets {
- for _, epPort := range ss.Ports {
-
- if !reflect.DeepEqual(epPort.Protocol, proto) {
- continue
- }
-
- var targetPort int32
- switch servicePort.Type {
- case intstr.Int:
- if int(epPort.Port) == servicePort.IntValue() {
- targetPort = epPort.Port
- }
- case intstr.String:
- namedPorts := s.ObjectMeta.Annotations
- val, ok := namedPortMapping(namedPorts).getPort(servicePort.StrVal)
- if ok {
- port, err := strconv.Atoi(val)
- if err != nil {
- glog.Warningf("%v is not valid as a port", val)
- continue
- }
-
- targetPort = int32(port)
- } else {
- newnp, err := lbc.checkSvcForUpdate(s)
- if err != nil {
- glog.Warningf("error mapping service ports: %v", err)
- continue
- }
- val, ok := namedPortMapping(newnp).getPort(servicePort.StrVal)
- if ok {
- port, err := strconv.Atoi(val)
- if err != nil {
- glog.Warningf("%v is not valid as a port", val)
- continue
- }
-
- targetPort = int32(port)
- }
- }
- }
-
- if targetPort == 0 {
- continue
- }
-
- for _, epAddress := range ss.Addresses {
- ups := ingress.UpstreamServer{
- Address: epAddress.IP,
- Port: fmt.Sprintf("%v", targetPort),
- MaxFails: hz.MaxFails,
- FailTimeout: hz.FailTimeout,
- }
- upsServers = append(upsServers, ups)
- }
- }
- }
-
- glog.V(3).Infof("endpoints found: %v", upsServers)
- return upsServers
-}
-
-// Stop stops the loadbalancer controller.
-func (lbc *loadBalancerController) Stop() error {
- // Stop is invoked from the http endpoint.
- lbc.stopLock.Lock()
- defer lbc.stopLock.Unlock()
-
- // Only try draining the workqueue if we haven't already.
- if !lbc.shutdown {
- lbc.shutdown = true
- close(lbc.stopCh)
-
- ings := lbc.ingLister.Store.List()
- glog.Infof("removing IP address %v from ingress rules", lbc.podInfo.NodeIP)
- lbc.removeFromIngress(ings)
-
- glog.Infof("Shutting down controller queues.")
- lbc.syncQueue.shutdown()
- lbc.ingQueue.shutdown()
-
- return nil
- }
-
- return fmt.Errorf("shutdown already in progress")
-}
-
-// removeFromIngress removes the IP address of the node where the Ingres
-// controller is running before shutdown to avoid incorrect status
-// information in Ingress rules
-func (lbc *loadBalancerController) removeFromIngress(ings []interface{}) {
- glog.Infof("updating %v Ingress rule/s", len(ings))
- for _, cur := range ings {
- ing := cur.(*extensions.Ingress)
-
- ingClient := lbc.client.Extensions().Ingress(ing.Namespace)
- currIng, err := ingClient.Get(ing.Name)
- if err != nil {
- glog.Errorf("unexpected error searching Ingress %v/%v: %v", ing.Namespace, ing.Name, err)
- continue
- }
-
- lbIPs := ing.Status.LoadBalancer.Ingress
- if len(lbIPs) > 0 && lbc.isStatusIPDefined(lbIPs) {
- glog.Infof("Updating loadbalancer %v/%v. Removing IP %v", ing.Namespace, ing.Name, lbc.podInfo.NodeIP)
-
- for idx, lbStatus := range currIng.Status.LoadBalancer.Ingress {
- if lbStatus.IP == lbc.podInfo.NodeIP {
- currIng.Status.LoadBalancer.Ingress = append(currIng.Status.LoadBalancer.Ingress[:idx],
- currIng.Status.LoadBalancer.Ingress[idx+1:]...)
- break
- }
- }
-
- if _, err := ingClient.UpdateStatus(currIng); err != nil {
- lbc.recorder.Eventf(currIng, api.EventTypeWarning, "UPDATE", "error: %v", err)
- continue
- }
-
- lbc.recorder.Eventf(currIng, api.EventTypeNormal, "DELETE", "ip: %v", lbc.podInfo.NodeIP)
- }
- }
-}
-
-// Run starts the loadbalancer controller.
-func (lbc *loadBalancerController) Run() {
- glog.Infof("starting NGINX loadbalancer controller")
- go lbc.nginx.Start()
-
- go lbc.ingController.Run(lbc.stopCh)
- go lbc.endpController.Run(lbc.stopCh)
- go lbc.svcController.Run(lbc.stopCh)
- go lbc.secrController.Run(lbc.stopCh)
- go lbc.mapController.Run(lbc.stopCh)
-
- go lbc.syncQueue.run(time.Second, lbc.stopCh)
- go lbc.ingQueue.run(time.Second, lbc.stopCh)
-
- <-lbc.stopCh
-}
-
-func isDefaultUpstream(ups *ingress.Upstream) bool {
- if ups == nil || len(ups.Backends) == 0 {
- return false
- }
-
- return ups.Backends[0].Address == "127.0.0.1" &&
- ups.Backends[0].Port == "8181"
-}
diff --git a/controllers/nginx/lua/vendor/lua-resty-http/lua-resty-http-0.07-0.rockspec b/controllers/nginx/lua/vendor/lua-resty-http/lua-resty-http-0.07-0.rockspec
deleted file mode 100644
index d8e892281a..0000000000
--- a/controllers/nginx/lua/vendor/lua-resty-http/lua-resty-http-0.07-0.rockspec
+++ /dev/null
@@ -1,33 +0,0 @@
-package = "lua-resty-http"
-version = "0.07-0"
-source = {
- url = "git://github.com/pintsized/lua-resty-http",
- tag = "v0.07"
-}
-description = {
- summary = "Lua HTTP client cosocket driver for OpenResty / ngx_lua.",
- detailed = [[
- Features an HTTP 1.0 and 1.1 streaming interface to reading
- bodies using coroutines, for predictable memory usage in Lua
- land. Alternative simple interface for singleshot requests
- without manual connection step. Supports chunked transfer
- encoding, keepalive, pipelining, and trailers. Headers are
- treated case insensitively. Probably production ready in most
- cases, though not yet proven in the wild.
- Recommended by the OpenResty maintainer as a long-term
- replacement for internal requests through ngx.location.capture.
- ]],
- homepage = "https://github.com/pintsized/lua-resty-http",
- license = "2-clause BSD",
- maintainer = "James Hurst "
-}
-dependencies = {
- "lua >= 5.1"
-}
-build = {
- type = "builtin",
- modules = {
- ["resty.http"] = "lib/resty/http.lua",
- ["resty.http_headers"] = "lib/resty/http_headers.lua"
- }
-}
diff --git a/controllers/nginx/main.go b/controllers/nginx/main.go
deleted file mode 100644
index 42d47c0e7d..0000000000
--- a/controllers/nginx/main.go
+++ /dev/null
@@ -1,192 +0,0 @@
-/*
-Copyright 2015 The Kubernetes Authors.
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package main
-
-import (
- "flag"
- "fmt"
- "net/http"
- "net/http/pprof"
- "os"
- "os/signal"
- "syscall"
- "time"
-
- "github.com/golang/glog"
- "github.com/spf13/pflag"
-
- "k8s.io/kubernetes/pkg/api"
- "k8s.io/kubernetes/pkg/client/unversioned"
- "k8s.io/kubernetes/pkg/healthz"
- kubectl_util "k8s.io/kubernetes/pkg/kubectl/cmd/util"
-)
-
-const (
- healthPort = 10254
-)
-
-var (
- // value overwritten during build. This can be used to resolve issues.
- version = "0.8.3"
- gitRepo = "https://github.com/kubernetes/contrib"
-
- flags = pflag.NewFlagSet("", pflag.ExitOnError)
-
- defaultSvc = flags.String("default-backend-service", "",
- `Service used to serve a 404 page for the default backend. Takes the form
- namespace/name. The controller uses the first node port of this Service for
- the default backend.`)
-
- nxgConfigMap = flags.String("nginx-configmap", "",
- `Name of the ConfigMap that containes the custom nginx configuration to use`)
-
- tcpConfigMapName = flags.String("tcp-services-configmap", "",
- `Name of the ConfigMap that containes the definition of the TCP services to expose.
- The key in the map indicates the external port to be used. The value is the name of the
- service with the format namespace/serviceName and the port of the service could be a number of the
- name of the port.
- The ports 80 and 443 are not allowed as external ports. This ports are reserved for nginx`)
-
- udpConfigMapName = flags.String("udp-services-configmap", "",
- `Name of the ConfigMap that containes the definition of the UDP services to expose.
- The key in the map indicates the external port to be used. The value is the name of the
- service with the format namespace/serviceName and the port of the service could be a number of the
- name of the port.`)
-
- resyncPeriod = flags.Duration("sync-period", 30*time.Second,
- `Relist and confirm cloud resources this often.`)
-
- watchNamespace = flags.String("watch-namespace", api.NamespaceAll,
- `Namespace to watch for Ingress. Default is to watch all namespaces`)
-
- healthzPort = flags.Int("healthz-port", healthPort, "port for healthz endpoint.")
-
- profiling = flags.Bool("profiling", true, `Enable profiling via web interface host:port/debug/pprof/`)
-
- defSSLCertificate = flags.String("default-ssl-certificate", "", `Name of the secret that contains a SSL
- certificate to be used as default for a HTTPS catch-all server`)
-
- defHealthzURL = flags.String("health-check-path", "/ingress-controller-healthz", `Defines the URL to
- be used as health check inside in the default server in NGINX.`)
-)
-
-func main() {
- flags.AddGoFlagSet(flag.CommandLine)
- flags.Parse(os.Args)
- clientConfig := kubectl_util.DefaultClientConfig(flags)
-
- glog.Infof("Using build: %v - %v", gitRepo, version)
-
- if *defaultSvc == "" {
- glog.Fatalf("Please specify --default-backend-service")
- }
-
- kubeClient, err := unversioned.NewInCluster()
- if err != nil {
- config, err := clientConfig.ClientConfig()
- if err != nil {
- glog.Fatalf("error configuring the client: %v", err)
- }
- kubeClient, err = unversioned.New(config)
- if err != nil {
- glog.Fatalf("failed to create client: %v", err)
- }
- }
-
- runtimePodInfo, err := getPodDetails(kubeClient)
- if err != nil {
- runtimePodInfo = &podInfo{NodeIP: "127.0.0.1"}
- glog.Warningf("unexpected error getting runtime information: %v", err)
- }
- if err := isValidService(kubeClient, *defaultSvc); err != nil {
- glog.Fatalf("no service with name %v found: %v", *defaultSvc, err)
- }
- glog.Infof("Validated %v as the default backend", *defaultSvc)
-
- if *nxgConfigMap != "" {
- _, _, err = parseNsName(*nxgConfigMap)
- if err != nil {
- glog.Fatalf("configmap error: %v", err)
- }
- }
-
- lbc, err := newLoadBalancerController(kubeClient, *resyncPeriod,
- *defaultSvc, *watchNamespace, *nxgConfigMap, *tcpConfigMapName,
- *udpConfigMapName, *defSSLCertificate, *defHealthzURL, runtimePodInfo)
- if err != nil {
- glog.Fatalf("%v", err)
- }
-
- go registerHandlers(lbc)
- go handleSigterm(lbc)
-
- lbc.Run()
-
- for {
- glog.Infof("Handled quit, awaiting pod deletion")
- time.Sleep(30 * time.Second)
- }
-}
-
-// podInfo contains runtime information about the pod
-type podInfo struct {
- PodName string
- PodNamespace string
- NodeIP string
-}
-
-func registerHandlers(lbc *loadBalancerController) {
- mux := http.NewServeMux()
- healthz.InstallHandler(mux, lbc.nginx)
-
- mux.HandleFunc("/build", func(w http.ResponseWriter, r *http.Request) {
- w.WriteHeader(http.StatusOK)
- fmt.Fprintf(w, "build: %v - %v", gitRepo, version)
- })
-
- mux.HandleFunc("/stop", func(w http.ResponseWriter, r *http.Request) {
- lbc.Stop()
- })
-
- if *profiling {
- mux.HandleFunc("/debug/pprof/", pprof.Index)
- mux.HandleFunc("/debug/pprof/profile", pprof.Profile)
- mux.HandleFunc("/debug/pprof/symbol", pprof.Symbol)
- }
-
- server := &http.Server{
- Addr: fmt.Sprintf(":%v", *healthzPort),
- Handler: mux,
- }
- glog.Fatal(server.ListenAndServe())
-}
-
-func handleSigterm(lbc *loadBalancerController) {
- signalChan := make(chan os.Signal, 1)
- signal.Notify(signalChan, syscall.SIGTERM)
- <-signalChan
- glog.Infof("Received SIGTERM, shutting down")
-
- exitCode := 0
- if err := lbc.Stop(); err != nil {
- glog.Infof("Error during shutdown %v", err)
- exitCode = 1
- }
-
- glog.Infof("Exiting with %v", exitCode)
- os.Exit(exitCode)
-}
diff --git a/controllers/nginx/nginx/command.go b/controllers/nginx/nginx/command.go
deleted file mode 100644
index 38fc473236..0000000000
--- a/controllers/nginx/nginx/command.go
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
-Copyright 2015 The Kubernetes Authors.
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package nginx
-
-import (
- "fmt"
- "io/ioutil"
- "net/http"
- "os"
- "os/exec"
-
- "github.com/golang/glog"
-
- "k8s.io/kubernetes/pkg/healthz"
-
- "k8s.io/contrib/ingress/controllers/nginx/nginx/config"
- "k8s.io/contrib/ingress/controllers/nginx/nginx/ingress"
-)
-
-// Start starts a nginx (master process) and waits. If the process ends
-// we need to kill the controller process and return the reason.
-func (ngx *Manager) Start() {
- glog.Info("Starting NGINX process...")
- cmd := exec.Command("nginx")
- cmd.Stdout = os.Stdout
- cmd.Stderr = os.Stderr
- if err := cmd.Start(); err != nil {
- glog.Errorf("nginx error: %v", err)
- }
-
- if err := cmd.Wait(); err != nil {
- glog.Errorf("nginx error: %v", err)
- }
-}
-
-// CheckAndReload verify if the nginx configuration changed and sends a reload
-//
-// the master process receives the signal to reload configuration, it checks
-// the syntax validity of the new configuration file and tries to apply the
-// configuration provided in it. If this is a success, the master process starts
-// new worker processes and sends messages to old worker processes, requesting them
-// to shut down. Otherwise, the master process rolls back the changes and continues
-// to work with the old configuration. Old worker processes, receiving a command to
-// shut down, stop accepting new connections and continue to service current requests
-// until all such requests are serviced. After that, the old worker processes exit.
-// http://nginx.org/en/docs/beginners_guide.html#control
-func (ngx *Manager) CheckAndReload(cfg config.Configuration, ingressCfg ingress.Configuration) error {
- ngx.reloadRateLimiter.Accept()
-
- ngx.reloadLock.Lock()
- defer ngx.reloadLock.Unlock()
-
- newCfg, err := ngx.template.Write(cfg, ingressCfg, ngx.testTemplate)
- if err != nil {
- return fmt.Errorf("failed to write new nginx configuration. Avoiding reload: %v", err)
- }
-
- changed, err := ngx.needsReload(newCfg)
- if err != nil {
- return err
- }
-
- if changed {
- if err := ngx.shellOut("nginx -s reload"); err != nil {
- return fmt.Errorf("error reloading nginx: %v", err)
- }
-
- glog.Info("change in configuration detected. Reloading...")
- }
-
- return nil
-}
-
-// shellOut executes a command and returns its combined standard output and standard
-// error in case of an error in the execution
-func (ngx *Manager) shellOut(cmd string) error {
- out, err := exec.Command("sh", "-c", cmd).CombinedOutput()
- if err != nil {
- glog.Errorf("failed to execute %v: %v", cmd, string(out))
- return err
- }
-
- return nil
-}
-
-// check to verify Manager implements HealthzChecker interface
-var _ healthz.HealthzChecker = Manager{}
-
-// Name returns the healthcheck name
-func (ngx Manager) Name() string {
- return "NGINX"
-}
-
-// Check returns if the nginx healthz endpoint is returning ok (status code 200)
-func (ngx Manager) Check(_ *http.Request) error {
- res, err := http.Get("http://127.0.0.1:18080/healthz")
- if err != nil {
- return err
- }
- defer res.Body.Close()
-
- if res.StatusCode != 200 {
- return fmt.Errorf("NGINX is unhealthy")
- }
-
- return nil
-}
-
-// testTemplate checks if the NGINX configuration inside the byte array is valid
-// running the command "nginx -t" using a temporal file.
-func (ngx Manager) testTemplate(cfg []byte) error {
- tmpfile, err := ioutil.TempFile("", "nginx-cfg")
- if err != nil {
- return err
- }
- defer tmpfile.Close()
- ioutil.WriteFile(tmpfile.Name(), cfg, 0644)
- if err := ngx.shellOut(fmt.Sprintf("nginx -t -c %v", tmpfile.Name())); err != nil {
- return fmt.Errorf("invalid nginx configuration: %v", err)
- }
- // in case of error do not remove temporal file
- defer os.Remove(tmpfile.Name())
- return nil
-}
diff --git a/controllers/nginx/nginx/healthcheck/main.go b/controllers/nginx/nginx/healthcheck/main.go
deleted file mode 100644
index 7abf719602..0000000000
--- a/controllers/nginx/nginx/healthcheck/main.go
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
-Copyright 2016 The Kubernetes Authors.
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package healthcheck
-
-import (
- "errors"
- "strconv"
-
- "k8s.io/kubernetes/pkg/apis/extensions"
-
- "k8s.io/contrib/ingress/controllers/nginx/nginx/config"
-)
-
-const (
- upsMaxFails = "ingress.kubernetes.io/upstream-max-fails"
- upsFailTimeout = "ingress.kubernetes.io/upstream-fail-timeout"
-)
-
-var (
- // ErrMissingMaxFails returned error when the ingress does not contains the
- // max-fails annotation
- ErrMissingMaxFails = errors.New("max-fails annotations is missing")
-
- // ErrMissingFailTimeout returned error when the ingress does not contains
- // the fail-timeout annotation
- ErrMissingFailTimeout = errors.New("fail-timeout annotations is missing")
-
- // ErrInvalidNumber returned
- ErrInvalidNumber = errors.New("the annotation does not contains a number")
-)
-
-// Upstream returns the URL and method to use check the status of
-// the upstream server/s
-type Upstream struct {
- MaxFails int
- FailTimeout int
-}
-
-type ingAnnotations map[string]string
-
-func (a ingAnnotations) maxFails() (int, error) {
- val, ok := a[upsMaxFails]
- if !ok {
- return 0, ErrMissingMaxFails
- }
-
- mf, err := strconv.Atoi(val)
- if err != nil {
- return 0, ErrInvalidNumber
- }
-
- return mf, nil
-}
-
-func (a ingAnnotations) failTimeout() (int, error) {
- val, ok := a[upsFailTimeout]
- if !ok {
- return 0, ErrMissingFailTimeout
- }
-
- ft, err := strconv.Atoi(val)
- if err != nil {
- return 0, ErrInvalidNumber
- }
-
- return ft, nil
-}
-
-// ParseAnnotations parses the annotations contained in the ingress
-// rule used to configure upstream check parameters
-func ParseAnnotations(cfg config.Configuration, ing *extensions.Ingress) *Upstream {
- if ing.GetAnnotations() == nil {
- return &Upstream{cfg.UpstreamMaxFails, cfg.UpstreamFailTimeout}
- }
-
- mf, err := ingAnnotations(ing.GetAnnotations()).maxFails()
- if err != nil {
- mf = cfg.UpstreamMaxFails
- }
-
- ft, err := ingAnnotations(ing.GetAnnotations()).failTimeout()
- if err != nil {
- ft = cfg.UpstreamFailTimeout
- }
-
- return &Upstream{mf, ft}
-}
diff --git a/controllers/nginx/nginx/ingress/nginx.go b/controllers/nginx/nginx/ingress/nginx.go
deleted file mode 100644
index 5dfd7dbff9..0000000000
--- a/controllers/nginx/nginx/ingress/nginx.go
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
-Copyright 2015 The Kubernetes Authors.
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package ingress
-
-import (
- "k8s.io/contrib/ingress/controllers/nginx/nginx/auth"
- "k8s.io/contrib/ingress/controllers/nginx/nginx/authreq"
- "k8s.io/contrib/ingress/controllers/nginx/nginx/ipwhitelist"
- "k8s.io/contrib/ingress/controllers/nginx/nginx/ratelimit"
- "k8s.io/contrib/ingress/controllers/nginx/nginx/rewrite"
-)
-
-// Configuration describes an NGINX configuration
-type Configuration struct {
- Upstreams []*Upstream
- Servers []*Server
- TCPUpstreams []*Location
- UDPUpstreams []*Location
-}
-
-// Upstream describes an NGINX upstream
-type Upstream struct {
- Name string
- Backends []UpstreamServer
- Secure bool
-}
-
-// UpstreamByNameServers sorts upstreams by name
-type UpstreamByNameServers []*Upstream
-
-func (c UpstreamByNameServers) Len() int { return len(c) }
-func (c UpstreamByNameServers) Swap(i, j int) { c[i], c[j] = c[j], c[i] }
-func (c UpstreamByNameServers) Less(i, j int) bool {
- return c[i].Name < c[j].Name
-}
-
-// UpstreamServer describes a server in an NGINX upstream
-type UpstreamServer struct {
- Address string
- Port string
- MaxFails int
- FailTimeout int
-}
-
-// UpstreamServerByAddrPort sorts upstream servers by address and port
-type UpstreamServerByAddrPort []UpstreamServer
-
-func (c UpstreamServerByAddrPort) Len() int { return len(c) }
-func (c UpstreamServerByAddrPort) Swap(i, j int) { c[i], c[j] = c[j], c[i] }
-func (c UpstreamServerByAddrPort) Less(i, j int) bool {
- iName := c[i].Address
- jName := c[j].Address
- if iName != jName {
- return iName < jName
- }
-
- iU := c[i].Port
- jU := c[j].Port
- return iU < jU
-}
-
-// Server describes an NGINX server
-type Server struct {
- Name string
- Locations []*Location
- SSL bool
- SSLCertificate string
- SSLCertificateKey string
- SSLPemChecksum string
-}
-
-// ServerByName sorts server by name
-type ServerByName []*Server
-
-func (c ServerByName) Len() int { return len(c) }
-func (c ServerByName) Swap(i, j int) { c[i], c[j] = c[j], c[i] }
-func (c ServerByName) Less(i, j int) bool {
- return c[i].Name < c[j].Name
-}
-
-// Location describes an NGINX location
-type Location struct {
- Path string
- IsDefBackend bool
- Upstream Upstream
- Auth auth.Nginx
- RateLimit ratelimit.RateLimit
- Redirect rewrite.Redirect
- SecureUpstream bool
- Whitelist ipwhitelist.SourceRange
- EnableCORS bool
- ExternalAuthURL authreq.Auth
-}
-
-// LocationByPath sorts location by path
-// Location / is the last one
-type LocationByPath []*Location
-
-func (c LocationByPath) Len() int { return len(c) }
-func (c LocationByPath) Swap(i, j int) { c[i], c[j] = c[j], c[i] }
-func (c LocationByPath) Less(i, j int) bool {
- return c[i].Path > c[j].Path
-}
-
-// SSLCert describes a SSL certificate to be used in NGINX
-type SSLCert struct {
- CertFileName string
- KeyFileName string
- // PemFileName contains the path to the file with the certificate and key concatenated
- PemFileName string
- // PemSHA contains the sha1 of the pem file.
- // This is used to detect changes in the secret that contains the certificates
- PemSHA string
- // CN contains all the common names defined in the SSL certificate
- CN []string
-}
diff --git a/controllers/nginx/nginx/main.go b/controllers/nginx/nginx/main.go
deleted file mode 100644
index 944181b1dc..0000000000
--- a/controllers/nginx/nginx/main.go
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
-Copyright 2015 The Kubernetes Authors.
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package nginx
-
-import (
- "os"
- "strings"
- "sync"
-
- "github.com/golang/glog"
-
- client "k8s.io/kubernetes/pkg/client/unversioned"
- "k8s.io/kubernetes/pkg/util/flowcontrol"
-
- "k8s.io/contrib/ingress/controllers/nginx/nginx/config"
- "k8s.io/contrib/ingress/controllers/nginx/nginx/ingress"
- ngx_template "k8s.io/contrib/ingress/controllers/nginx/nginx/template"
-)
-
-var (
- tmplPath = "/etc/nginx/template/nginx.tmpl"
-)
-
-// Manager ...
-type Manager struct {
- ConfigFile string
-
- defCfg config.Configuration
-
- defResolver string
-
- sslDHParam string
-
- reloadRateLimiter flowcontrol.RateLimiter
-
- // template loaded ready to be used to generate the nginx configuration file
- template *ngx_template.Template
-
- reloadLock *sync.Mutex
-}
-
-// NewDefaultServer return an UpstreamServer to be use as default server that returns 503.
-func NewDefaultServer() ingress.UpstreamServer {
- return ingress.UpstreamServer{Address: "127.0.0.1", Port: "8181"}
-}
-
-// NewUpstream creates an upstream without servers.
-func NewUpstream(name string) *ingress.Upstream {
- return &ingress.Upstream{
- Name: name,
- Backends: []ingress.UpstreamServer{},
- }
-}
-
-// NewManager ...
-func NewManager(kubeClient *client.Client) *Manager {
- ngx := &Manager{
- ConfigFile: "/etc/nginx/nginx.conf",
- defCfg: config.NewDefault(),
- reloadLock: &sync.Mutex{},
- reloadRateLimiter: flowcontrol.NewTokenBucketRateLimiter(0.1, 1),
- }
-
- res, err := getDNSServers()
- if err != nil {
- glog.Warningf("error reading nameservers: %v", err)
- }
- ngx.defResolver = strings.Join(res, " ")
-
- ngx.createCertsDir(config.SSLDirectory)
-
- ngx.sslDHParam = ngx.SearchDHParamFile(config.SSLDirectory)
-
- var onChange func()
- onChange = func() {
- template, err := ngx_template.NewTemplate(tmplPath, onChange)
- if err != nil {
- glog.Warningf("invalid NGINX template: %v", err)
- return
- }
-
- ngx.template.Close()
- ngx.template = template
- glog.Info("new NGINX template loaded")
- }
-
- template, err := ngx_template.NewTemplate(tmplPath, onChange)
- if err != nil {
- glog.Fatalf("invalid NGINX template: %v", err)
- }
-
- ngx.template = template
- return ngx
-}
-
-func (nginx *Manager) createCertsDir(base string) {
- if err := os.Mkdir(base, os.ModeDir); err != nil {
- if os.IsExist(err) {
- glog.Infof("%v already exists", err)
- return
- }
- glog.Fatalf("Couldn't create directory %v: %v", base, err)
- }
-}
diff --git a/controllers/nginx/nginx/ssl.go b/controllers/nginx/nginx/ssl.go
deleted file mode 100644
index 25338f3aab..0000000000
--- a/controllers/nginx/nginx/ssl.go
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
-Copyright 2015 The Kubernetes Authors.
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package nginx
-
-import (
- "crypto/sha1"
- "crypto/x509"
- "encoding/hex"
- "encoding/pem"
- "fmt"
- "io/ioutil"
- "os"
-
- "github.com/golang/glog"
-
- "k8s.io/contrib/ingress/controllers/nginx/nginx/config"
- "k8s.io/contrib/ingress/controllers/nginx/nginx/ingress"
-)
-
-// AddOrUpdateCertAndKey creates a .pem file wth the cert and the key with the specified name
-func (nginx *Manager) AddOrUpdateCertAndKey(name string, cert string, key string) (ingress.SSLCert, error) {
- temporaryPemFileName := fmt.Sprintf("%v.pem", name)
- pemFileName := fmt.Sprintf("%v/%v.pem", config.SSLDirectory, name)
-
- temporaryPemFile, err := ioutil.TempFile("", temporaryPemFileName)
- if err != nil {
- return ingress.SSLCert{}, fmt.Errorf("Couldn't create temp pem file %v: %v", temporaryPemFile.Name(), err)
- }
-
- _, err = temporaryPemFile.WriteString(fmt.Sprintf("%v\n%v", cert, key))
- if err != nil {
- return ingress.SSLCert{}, fmt.Errorf("Couldn't write to pem file %v: %v", temporaryPemFile.Name(), err)
- }
-
- err = temporaryPemFile.Close()
- if err != nil {
- return ingress.SSLCert{}, fmt.Errorf("Couldn't close temp pem file %v: %v", temporaryPemFile.Name(), err)
- }
-
- cn, err := nginx.commonNames(temporaryPemFile.Name())
- if err != nil {
- os.Remove(temporaryPemFile.Name())
- return ingress.SSLCert{}, err
- }
-
- err = os.Rename(temporaryPemFile.Name(), pemFileName)
- if err != nil {
- os.Remove(temporaryPemFile.Name())
- return ingress.SSLCert{}, fmt.Errorf("Couldn't move temp pem file %v to destination %v: %v", temporaryPemFile.Name(), pemFileName, err)
- }
-
- return ingress.SSLCert{
- CertFileName: cert,
- KeyFileName: key,
- PemFileName: pemFileName,
- PemSHA: nginx.pemSHA1(pemFileName),
- CN: cn,
- }, nil
-}
-
-// commonNames checks if the certificate and key file are valid
-// returning the result of the validation and the list of hostnames
-// contained in the common name/s
-func (nginx *Manager) commonNames(pemFileName string) ([]string, error) {
- pemCerts, err := ioutil.ReadFile(pemFileName)
- if err != nil {
- return []string{}, err
- }
-
- block, _ := pem.Decode(pemCerts)
- if block == nil {
- return []string{}, fmt.Errorf("No valid PEM formatted block found")
- }
-
- cert, err := x509.ParseCertificate(block.Bytes)
- if err != nil {
- return []string{}, err
- }
-
- cn := []string{cert.Subject.CommonName}
- if len(cert.DNSNames) > 0 {
- cn = append(cn, cert.DNSNames...)
- }
-
- glog.V(3).Infof("found %v common names: %v\n", cn, len(cn))
- return cn, nil
-}
-
-// SearchDHParamFile iterates all the secrets mounted inside the /etc/nginx-ssl directory
-// in order to find a file with the name dhparam.pem. If such file exists it will
-// returns the path. If not it just returns an empty string
-func (nginx *Manager) SearchDHParamFile(baseDir string) string {
- files, _ := ioutil.ReadDir(baseDir)
- for _, file := range files {
- if !file.IsDir() {
- continue
- }
-
- dhPath := fmt.Sprintf("%v/%v/dhparam.pem", baseDir, file.Name())
- if _, err := os.Stat(dhPath); err == nil {
- glog.Infof("using file '%v' for parameter ssl_dhparam", dhPath)
- return dhPath
- }
- }
-
- glog.Warning("no file dhparam.pem found in secrets")
- return ""
-}
-
-// pemSHA1 returns the SHA1 of a pem file. This is used to
-// reload NGINX in case a secret with a SSL certificate changed.
-func (nginx *Manager) pemSHA1(filename string) string {
- hasher := sha1.New()
- s, err := ioutil.ReadFile(filename)
- if err != nil {
- return ""
- }
-
- hasher.Write(s)
- return hex.EncodeToString(hasher.Sum(nil))
-}
diff --git a/controllers/nginx/nginx/utils.go b/controllers/nginx/nginx/utils.go
deleted file mode 100644
index 40a6dffd60..0000000000
--- a/controllers/nginx/nginx/utils.go
+++ /dev/null
@@ -1,224 +0,0 @@
-/*
-Copyright 2015 The Kubernetes Authors.
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package nginx
-
-import (
- "bytes"
- "io/ioutil"
- "os"
- "os/exec"
- "reflect"
- "strconv"
- "strings"
-
- "github.com/golang/glog"
- "github.com/mitchellh/mapstructure"
- "k8s.io/kubernetes/pkg/api"
-
- "k8s.io/contrib/ingress/controllers/nginx/nginx/config"
-)
-
-const (
- customHTTPErrors = "custom-http-errors"
- skipAccessLogUrls = "skip-access-log-urls"
-)
-
-// getDNSServers returns the list of nameservers located in the file /etc/resolv.conf
-func getDNSServers() ([]string, error) {
- var nameservers []string
- file, err := ioutil.ReadFile("/etc/resolv.conf")
- if err != nil {
- return nameservers, err
- }
-
- // Lines of the form "nameserver 1.2.3.4" accumulate.
- lines := strings.Split(string(file), "\n")
- for l := range lines {
- trimmed := strings.TrimSpace(lines[l])
- if strings.HasPrefix(trimmed, "#") {
- continue
- }
- fields := strings.Fields(trimmed)
- if len(fields) == 0 {
- continue
- }
- if fields[0] == "nameserver" {
- nameservers = append(nameservers, fields[1:]...)
- }
- }
-
- glog.V(3).Infof("nameservers to use: %v", nameservers)
- return nameservers, nil
-}
-
-// getConfigKeyToStructKeyMap returns a map with the ConfigMapKey as key and the StructName as value.
-func getConfigKeyToStructKeyMap() map[string]string {
- keyMap := map[string]string{}
- n := &config.Configuration{}
- val := reflect.Indirect(reflect.ValueOf(n))
- for i := 0; i < val.Type().NumField(); i++ {
- fieldSt := val.Type().Field(i)
- configMapKey := strings.Split(fieldSt.Tag.Get("structs"), ",")[0]
- structKey := fieldSt.Name
- keyMap[configMapKey] = structKey
- }
- return keyMap
-}
-
-// ReadConfig obtains the configuration defined by the user merged with the defaults.
-func (ngx *Manager) ReadConfig(conf *api.ConfigMap) config.Configuration {
- if len(conf.Data) == 0 {
- return config.NewDefault()
- }
-
- cfgCM := config.Configuration{}
- cfgDefault := config.NewDefault()
-
- metadata := &mapstructure.Metadata{}
-
- decoder, err := mapstructure.NewDecoder(&mapstructure.DecoderConfig{
- TagName: "structs",
- Result: &cfgCM,
- WeaklyTypedInput: true,
- Metadata: metadata,
- })
-
- cErrors := make([]int, 0)
- if val, ok := conf.Data[customHTTPErrors]; ok {
- delete(conf.Data, customHTTPErrors)
- for _, i := range strings.Split(val, ",") {
- j, err := strconv.Atoi(i)
- if err != nil {
- glog.Warningf("%v is not a valid http code: %v", i, err)
- } else {
- cErrors = append(cErrors, j)
- }
- }
- }
-
- cSkipUrls := make([]string, 0)
- if val, ok := conf.Data[skipAccessLogUrls]; ok {
- delete(conf.Data, skipAccessLogUrls)
- cSkipUrls = strings.Split(val, ",")
- }
-
- err = decoder.Decode(conf.Data)
- if err != nil {
- glog.Infof("%v", err)
- }
-
- keyMap := getConfigKeyToStructKeyMap()
-
- valCM := reflect.Indirect(reflect.ValueOf(cfgCM))
-
- for _, key := range metadata.Keys {
- fieldName, ok := keyMap[key]
- if !ok {
- continue
- }
-
- valDefault := reflect.ValueOf(&cfgDefault).Elem().FieldByName(fieldName)
-
- fieldCM := valCM.FieldByName(fieldName)
-
- if valDefault.IsValid() {
- valDefault.Set(fieldCM)
- }
- }
-
- cfgDefault.CustomHTTPErrors = ngx.filterErrors(cErrors)
- cfgDefault.SkipAccessLogURLs = cSkipUrls
- // no custom resolver means use the system resolver
- if cfgDefault.Resolver == "" {
- cfgDefault.Resolver = ngx.defResolver
- }
- return cfgDefault
-}
-
-func (ngx *Manager) filterErrors(errCodes []int) []int {
- fa := make([]int, 0)
- for _, errCode := range errCodes {
- if errCode > 299 && errCode < 600 {
- fa = append(fa, errCode)
- } else {
- glog.Warningf("error code %v is not valid for custom error pages", errCode)
- }
- }
-
- return fa
-}
-
-func (ngx *Manager) needsReload(data []byte) (bool, error) {
- filename := ngx.ConfigFile
- in, err := os.Open(filename)
- if err != nil {
- return false, err
- }
-
- src, err := ioutil.ReadAll(in)
- in.Close()
- if err != nil {
- return false, err
- }
-
- if !bytes.Equal(src, data) {
- err = ioutil.WriteFile(filename, data, 0644)
- if err != nil {
- return false, err
- }
-
- dData, err := diff(src, data)
- if err != nil {
- glog.Errorf("error computing diff: %s", err)
- return true, nil
- }
-
- if glog.V(2) {
- glog.Infof("NGINX configuration diff a/%s b/%s\n", filename, filename)
- glog.Infof("%v", string(dData))
- }
-
- return len(dData) > 0, nil
- }
-
- return false, nil
-}
-
-func diff(b1, b2 []byte) (data []byte, err error) {
- f1, err := ioutil.TempFile("", "")
- if err != nil {
- return
- }
- defer os.Remove(f1.Name())
- defer f1.Close()
-
- f2, err := ioutil.TempFile("", "")
- if err != nil {
- return
- }
- defer os.Remove(f2.Name())
- defer f2.Close()
-
- f1.Write(b1)
- f2.Write(b2)
-
- data, err = exec.Command("diff", "-u", f1.Name(), f2.Name()).CombinedOutput()
- if len(data) > 0 {
- err = nil
- }
- return
-}
diff --git a/controllers/nginx/nginx/utils_test.go b/controllers/nginx/nginx/utils_test.go
deleted file mode 100644
index e9c37edd0b..0000000000
--- a/controllers/nginx/nginx/utils_test.go
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
-Copyright 2015 The Kubernetes Authors.
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package nginx
-
-import (
- "testing"
-
- "k8s.io/kubernetes/pkg/api"
-
- "k8s.io/contrib/ingress/controllers/nginx/nginx/config"
-)
-
-func getConfigNginxBool(data map[string]string) config.Configuration {
- manager := &Manager{}
- configMap := &api.ConfigMap{
- Data: data,
- }
- return manager.ReadConfig(configMap)
-}
-
-func TestManagerReadConfigBoolFalse(t *testing.T) {
- configNginx := getConfigNginxBool(map[string]string{
- "hsts-include-subdomains": "false",
- "use-proxy-protocol": "false",
- })
- if configNginx.HSTSIncludeSubdomains {
- t.Error("Failed to config boolean value (default true) to false")
- }
- if configNginx.UseProxyProtocol {
- t.Error("Failed to config boolean value (default false) to false")
- }
-}
-
-func TestManagerReadConfigBoolTrue(t *testing.T) {
- configNginx := getConfigNginxBool(map[string]string{
- "hsts-include-subdomains": "true",
- "use-proxy-protocol": "true",
- })
- if !configNginx.HSTSIncludeSubdomains {
- t.Error("Failed to config boolean value (default true) to true")
- }
- if !configNginx.UseProxyProtocol {
- t.Error("Failed to config boolean value (default false) to true")
- }
-}
-
-func TestManagerReadConfigBoolNothing(t *testing.T) {
- configNginx := getConfigNginxBool(map[string]string{
- "invaild-key": "true",
- })
- if !configNginx.HSTSIncludeSubdomains {
- t.Error("Failed to get default boolean value true")
- }
- if configNginx.UseProxyProtocol {
- t.Error("Failed to get default boolean value false")
- }
-}
-
-func TestManagerReadConfigStringSet(t *testing.T) {
- configNginx := getConfigNginxBool(map[string]string{
- "ssl-protocols": "TLSv1.2",
- })
- exp := "TLSv1.2"
- if configNginx.SSLProtocols != exp {
- t.Errorf("Failed to set string value true actual='%s' expected='%s'", configNginx.SSLProtocols, exp)
- }
-}
-
-func TestManagerReadConfigStringNothing(t *testing.T) {
- configNginx := getConfigNginxBool(map[string]string{
- "not-existing": "TLSv1.2",
- })
- exp := "10m"
- if configNginx.SSLSessionTimeout != exp {
- t.Errorf("Failed to set string value true actual='%s' expected='%s'", configNginx.SSLSessionTimeout, exp)
- }
-}
-
-func TestGetDNSServers(t *testing.T) {
- s, err := getDNSServers()
- if err != nil {
- t.Fatalf("unexpected error reading /etc/resolv.conf file: %v", err)
- }
- if len(s) < 1 {
- t.Error("expected at least 1 nameserver in /etc/resolv.conf")
- }
-}
diff --git a/controllers/nginx/pkg/cmd/controller/main.go b/controllers/nginx/pkg/cmd/controller/main.go
new file mode 100644
index 0000000000..c35d808a7c
--- /dev/null
+++ b/controllers/nginx/pkg/cmd/controller/main.go
@@ -0,0 +1,60 @@
+/*
+Copyright 2015 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package main
+
+import (
+ "os"
+ "os/signal"
+ "syscall"
+ "time"
+
+ "github.com/golang/glog"
+
+ "k8s.io/ingress/core/pkg/ingress/controller"
+)
+
+func main() {
+ // start a new nginx controller
+ ngx := newNGINXController()
+ // create a custom Ingress controller using NGINX as backend
+ ic := controller.NewIngressController(ngx)
+ go handleSigterm(ic)
+ // start the controller
+ ic.Start()
+ // wait
+ glog.Infof("shutting down Ingress controller...")
+ for {
+ glog.Infof("Handled quit, awaiting pod deletion")
+ time.Sleep(30 * time.Second)
+ }
+}
+
+func handleSigterm(ic *controller.GenericController) {
+ signalChan := make(chan os.Signal, 1)
+ signal.Notify(signalChan, syscall.SIGTERM)
+ <-signalChan
+ glog.Infof("Received SIGTERM, shutting down")
+
+ exitCode := 0
+ if err := ic.Stop(); err != nil {
+ glog.Infof("Error during shutdown %v", err)
+ exitCode = 1
+ }
+
+ glog.Infof("Exiting with %v", exitCode)
+ os.Exit(exitCode)
+}
diff --git a/controllers/nginx/pkg/cmd/controller/nginx.go b/controllers/nginx/pkg/cmd/controller/nginx.go
new file mode 100644
index 0000000000..92ff980c9f
--- /dev/null
+++ b/controllers/nginx/pkg/cmd/controller/nginx.go
@@ -0,0 +1,267 @@
+/*
+Copyright 2015 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package main
+
+import (
+ "bytes"
+ "fmt"
+ "io/ioutil"
+ "os"
+ "os/exec"
+
+ "github.com/golang/glog"
+
+ "k8s.io/kubernetes/pkg/api"
+
+ "k8s.io/ingress/core/pkg/ingress"
+ "k8s.io/ingress/core/pkg/ingress/defaults"
+
+ "errors"
+
+ "k8s.io/ingress/controllers/nginx/pkg/config"
+ ngx_template "k8s.io/ingress/controllers/nginx/pkg/template"
+ "k8s.io/ingress/controllers/nginx/pkg/version"
+)
+
+var (
+ tmplPath = "/etc/nginx/template/nginx.tmpl"
+ cfgPath = "/etc/nginx/nginx.conf"
+ binary = "/usr/sbin/nginx"
+)
+
+// newNGINXController creates a new NGINX Ingress controller.
+// If the environment variable NGINX_BINARY exists it will be used
+// as source for nginx commands
+func newNGINXController() ingress.Controller {
+ ngx := os.Getenv("NGINX_BINARY")
+ if ngx == "" {
+ ngx = binary
+ }
+ n := NGINXController{binary: ngx}
+
+ var onChange func()
+ onChange = func() {
+ template, err := ngx_template.NewTemplate(tmplPath, onChange)
+ if err != nil {
+ // this error is different from the rest because it must be clear why nginx is not working
+ glog.Errorf(`
+-------------------------------------------------------------------------------
+Error loading new template : %v
+-------------------------------------------------------------------------------
+`, err)
+ return
+ }
+
+ n.t.Close()
+ n.t = template
+ glog.Info("new NGINX template loaded")
+ }
+
+ ngxTpl, err := ngx_template.NewTemplate(tmplPath, onChange)
+ if err != nil {
+ glog.Fatalf("invalid NGINX template: %v", err)
+ }
+
+ n.t = ngxTpl
+ go n.Start()
+
+ return n
+}
+
+// NGINXController ...
+type NGINXController struct {
+ t *ngx_template.Template
+
+ binary string
+}
+
+// Start start a new NGINX master process running in foreground.
+func (n NGINXController) Start() {
+ glog.Info("starting NGINX process...")
+ cmd := exec.Command(n.binary, "-c", cfgPath)
+ cmd.Stdout = os.Stdout
+ cmd.Stderr = os.Stderr
+ if err := cmd.Start(); err != nil {
+ glog.Fatalf("nginx error: %v", err)
+ }
+ if err := cmd.Wait(); err != nil {
+ glog.Errorf("nginx error: %v", err)
+ }
+}
+
+// Reload checks if the running configuration file is different
+// to the specified and reload nginx if required
+func (n NGINXController) Reload(data []byte) ([]byte, bool, error) {
+ if !n.isReloadRequired(data) {
+ return []byte("Reload not required"), false, nil
+ }
+
+ err := ioutil.WriteFile(cfgPath, data, 0644)
+ if err != nil {
+ return nil, false, err
+ }
+
+ o, e := exec.Command(n.binary, "-s", "reload").CombinedOutput()
+ return o, true, e
+}
+
+// BackendDefaults returns the nginx defaults
+func (n NGINXController) BackendDefaults() defaults.Backend {
+ d := config.NewDefault()
+ return d.Backend
+}
+
+// IsReloadRequired check if the new configuration file is different
+// from the current one.
+func (n NGINXController) isReloadRequired(data []byte) bool {
+ in, err := os.Open(cfgPath)
+ if err != nil {
+ return false
+ }
+ src, err := ioutil.ReadAll(in)
+ in.Close()
+ if err != nil {
+ return false
+ }
+
+ if !bytes.Equal(src, data) {
+ tmpfile, err := ioutil.TempFile("", "nginx-cfg-diff")
+ if err != nil {
+ glog.Errorf("error creating temporal file: %s", err)
+ return false
+ }
+ defer tmpfile.Close()
+ err = ioutil.WriteFile(tmpfile.Name(), data, 0644)
+ if err != nil {
+ return false
+ }
+
+ diffOutput, err := diff(src, data)
+ if err != nil {
+ glog.Errorf("error computing diff: %s", err)
+ return true
+ }
+
+ if glog.V(2) {
+ glog.Infof("NGINX configuration diff\n")
+ glog.Infof("%v", string(diffOutput))
+ }
+ return len(diffOutput) > 0
+ }
+ return false
+}
+
+// Info return build information
+func (n NGINXController) Info() *ingress.BackendInfo {
+ return &ingress.BackendInfo{
+ Name: "NGINX",
+ Release: version.RELEASE,
+ Build: version.COMMIT,
+ Repository: version.REPO,
+ }
+}
+
+// testTemplate checks if the NGINX configuration inside the byte array is valid
+// running the command "nginx -t" using a temporal file.
+func (n NGINXController) testTemplate(cfg []byte) error {
+ tmpfile, err := ioutil.TempFile("", "nginx-cfg")
+ if err != nil {
+ return err
+ }
+ defer tmpfile.Close()
+ ioutil.WriteFile(tmpfile.Name(), cfg, 0644)
+ out, err := exec.Command(n.binary, "-t", "-c", tmpfile.Name()).CombinedOutput()
+ if err != nil {
+ // this error is different from the rest because it must be clear why nginx is not working
+ oe := fmt.Sprintf(`
+-------------------------------------------------------------------------------
+Error: %v
+%v
+-------------------------------------------------------------------------------
+`, err, string(out))
+ return errors.New(oe)
+ }
+
+ os.Remove(tmpfile.Name())
+ return nil
+}
+
+// OnUpdate is called by syncQueue in https://github.com/aledbf/ingress-controller/blob/master/pkg/ingress/controller/controller.go#L82
+// periodically to keep the configuration in sync.
+//
+// convert configmap to custom configuration object (different in each implementation)
+// write the custom template (the complexity depends on the implementation)
+// write the configuration file
+// returning nill implies the backend will be reloaded.
+// if an error is returned means requeue the update
+func (n NGINXController) OnUpdate(cmap *api.ConfigMap, ingressCfg ingress.Configuration) ([]byte, error) {
+ var longestName int
+ var serverNames int
+ for _, srv := range ingressCfg.Servers {
+ serverNames += len([]byte(srv.Hostname))
+ if longestName < len(srv.Hostname) {
+ longestName = len(srv.Hostname)
+ }
+ }
+
+ cfg := ngx_template.ReadConfig(cmap)
+
+ // NGINX cannot resize the has tables used to store server names.
+ // For this reason we check if the defined size defined is correct
+ // for the FQDN defined in the ingress rules adjusting the value
+ // if is required.
+ // https://trac.nginx.org/nginx/ticket/352
+ // https://trac.nginx.org/nginx/ticket/631
+ nameHashBucketSize := nextPowerOf2(longestName)
+ if nameHashBucketSize > cfg.ServerNameHashBucketSize {
+ glog.V(3).Infof("adjusting ServerNameHashBucketSize variable from %v to %v",
+ cfg.ServerNameHashBucketSize, nameHashBucketSize)
+ cfg.ServerNameHashBucketSize = nameHashBucketSize
+ }
+ serverNameHashMaxSize := nextPowerOf2(serverNames)
+ if serverNameHashMaxSize > cfg.ServerNameHashMaxSize {
+ glog.V(3).Infof("adjusting ServerNameHashMaxSize variable from %v to %v",
+ cfg.ServerNameHashMaxSize, serverNameHashMaxSize)
+ cfg.ServerNameHashMaxSize = serverNameHashMaxSize
+ }
+
+ return n.t.Write(config.TemplateConfig{
+ BacklogSize: sysctlSomaxconn(),
+ Backends: ingressCfg.Backends,
+ PassthrougBackends: ingressCfg.PassthroughBackends,
+ Servers: ingressCfg.Servers,
+ TCPBackends: ingressCfg.TCPEndpoints,
+ UDPBackends: ingressCfg.UPDEndpoints,
+ HealthzURI: "/healthz",
+ CustomErrors: len(cfg.CustomHTTPErrors) > 0,
+ Cfg: cfg,
+ }, n.testTemplate)
+}
+
+// http://graphics.stanford.edu/~seander/bithacks.html#RoundUpPowerOf2
+// https://play.golang.org/p/TVSyCcdxUh
+func nextPowerOf2(v int) int {
+ v--
+ v |= v >> 1
+ v |= v >> 2
+ v |= v >> 4
+ v |= v >> 8
+ v |= v >> 16
+ v++
+
+ return v
+}
diff --git a/controllers/nginx/pkg/cmd/controller/utils.go b/controllers/nginx/pkg/cmd/controller/utils.go
new file mode 100644
index 0000000000..5a043abe4d
--- /dev/null
+++ b/controllers/nginx/pkg/cmd/controller/utils.go
@@ -0,0 +1,62 @@
+/*
+Copyright 2015 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package main
+
+import (
+ "io/ioutil"
+ "os"
+ "os/exec"
+
+ "k8s.io/kubernetes/pkg/util/sysctl"
+
+ "github.com/golang/glog"
+)
+
+// sysctlSomaxconn returns the value of net.core.somaxconn, i.e.
+// maximum number of connections that can be queued for acceptance
+// http://nginx.org/en/docs/http/ngx_http_core_module.html#listen
+func sysctlSomaxconn() int {
+ maxConns, err := sysctl.New().GetSysctl("net/core/somaxconn")
+ if err != nil || maxConns < 512 {
+ glog.V(3).Infof("system net.core.somaxconn=%v (using system default)", maxConns)
+ return 511
+ }
+
+ return maxConns
+}
+
+func diff(b1, b2 []byte) ([]byte, error) {
+ f1, err := ioutil.TempFile("", "a")
+ if err != nil {
+ return nil, err
+ }
+ defer f1.Close()
+ defer os.Remove(f1.Name())
+
+ f2, err := ioutil.TempFile("", "b")
+ if err != nil {
+ return nil, err
+ }
+ defer f2.Close()
+ defer os.Remove(f2.Name())
+
+ f1.Write(b1)
+ f2.Write(b2)
+
+ out, _ := exec.Command("diff", "-u", f1.Name(), f2.Name()).CombinedOutput()
+ return out, nil
+}
diff --git a/controllers/nginx/pkg/cmd/controller/utils_test.go b/controllers/nginx/pkg/cmd/controller/utils_test.go
new file mode 100644
index 0000000000..c506525c27
--- /dev/null
+++ b/controllers/nginx/pkg/cmd/controller/utils_test.go
@@ -0,0 +1,41 @@
+/*
+Copyright 2015 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package main
+
+import "testing"
+
+func TestDiff(t *testing.T) {
+ tests := []struct {
+ a []byte
+ b []byte
+ empty bool
+ }{
+ {[]byte(""), []byte(""), true},
+ {[]byte("a"), []byte("a"), true},
+ {[]byte("a"), []byte("b"), false},
+ }
+
+ for _, test := range tests {
+ b, err := diff(test.a, test.b)
+ if err != nil {
+ t.Fatalf("unexpected error returned: %v", err)
+ }
+ if len(b) == 0 && !test.empty {
+ t.Fatalf("expected empty but returned %s", b)
+ }
+ }
+}
diff --git a/controllers/nginx/nginx/config/config.go b/controllers/nginx/pkg/config/config.go
similarity index 74%
rename from controllers/nginx/nginx/config/config.go
rename to controllers/nginx/pkg/config/config.go
index 066440bbd9..8afeca499e 100644
--- a/controllers/nginx/nginx/config/config.go
+++ b/controllers/nginx/pkg/config/config.go
@@ -18,9 +18,11 @@ package config
import (
"runtime"
- "strconv"
"github.com/golang/glog"
+
+ "k8s.io/ingress/core/pkg/ingress"
+ "k8s.io/ingress/core/pkg/ingress/defaults"
)
const (
@@ -42,7 +44,7 @@ const (
// If UseProxyProtocol is enabled defIPCIDR defines the default the IP/network address of your external load balancer
defIPCIDR = "0.0.0.0/0"
- gzipTypes = "application/atom+xml application/javascript aplication/x-javascript application/json application/rss+xml application/vnd.ms-fontobject application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/svg+xml image/x-icon text/css text/plain text/x-component"
+ gzipTypes = "application/atom+xml application/javascript application/x-javascript application/json application/rss+xml application/vnd.ms-fontobject application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/svg+xml image/x-icon text/css text/plain text/x-component"
// http://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_buffer_size
// Sets the size of the buffer used for sending data.
@@ -69,18 +71,17 @@ const (
var (
// SSLDirectory contains the mounted secrets with SSL certificates, keys and
- SSLDirectory = "/etc/nginx-ssl"
+ SSLDirectory = "/etc/ingress-controller/ssl"
)
// Configuration represents the content of nginx.conf file
type Configuration struct {
+ defaults.Backend
+
// http://nginx.org/en/docs/http/ngx_http_core_module.html#client_max_body_size
// Sets the maximum allowed size of the client request body
BodySize string `structs:"body-size,omitempty"`
- // HealthzURL defines the URL should be used in probes
- HealthzURL string
-
// EnableDynamicTLSRecords enables dynamic TLS record sizes
// https://blog.cloudflare.com/optimizing-tls-over-tcp-to-reduce-latency
// By default this is enabled
@@ -126,12 +127,6 @@ type Configuration struct {
// accessed using HTTPS.
HSTSMaxAge string `structs:"hsts-max-age,omitempty"`
- // enables which HTTP codes should be passed for processing with the error_page directive
- // http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_intercept_errors
- // http://nginx.org/en/docs/http/ngx_http_core_module.html#error_page
- // By default this is disabled
- CustomHTTPErrors []int `structs:"custom-http-errors,-"`
-
// Time during which a keep-alive client connection will stay open on the server side.
// The zero value disables keep-alive client connections
// http://nginx.org/en/docs/http/ngx_http_core_module.html#keepalive_timeout
@@ -146,34 +141,10 @@ type Configuration struct {
// http://nginx.org/en/docs/http/ngx_http_map_module.html#map_hash_bucket_size
MapHashBucketSize int `structs:"map-hash-bucket-size,omitempty"`
- // Defines a timeout for establishing a connection with a proxied server.
- // It should be noted that this timeout cannot usually exceed 75 seconds.
- // http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_connect_timeout
- ProxyConnectTimeout int `structs:"proxy-connect-timeout,omitempty"`
-
// If UseProxyProtocol is enabled ProxyRealIPCIDR defines the default the IP/network address
// of your external load balancer
ProxyRealIPCIDR string `structs:"proxy-real-ip-cidr,omitempty"`
- // Timeout in seconds for reading a response from the proxied server. The timeout is set only between
- // two successive read operations, not for the transmission of the whole response
- // http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_read_timeout
- ProxyReadTimeout int `structs:"proxy-read-timeout,omitempty"`
-
- // Timeout in seconds for transmitting a request to the proxied server. The timeout is set only between
- // two successive write operations, not for the transmission of the whole request.
- // http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_send_timeout
- ProxySendTimeout int `structs:"proxy-send-timeout,omitempty"`
-
- // Sets the size of the buffer used for reading the first part of the response received from the
- // proxied server. This part usually contains a small response header.
- // http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_buffer_size)
- ProxyBufferSize string `structs:"proxy-buffer-size,omitempty"`
-
- // Configures name servers used to resolve names of upstream servers into addresses
- // http://nginx.org/en/docs/http/ngx_http_core_module.html#resolver
- Resolver string `structs:"resolver,omitempty"`
-
// Maximum size of the server names hash tables used in server names, map directive’s values,
// MIME types, names of request header strings, etcd.
// http://nginx.org/en/docs/hash.html
@@ -185,20 +156,6 @@ type Configuration struct {
// http://nginx.org/en/docs/http/ngx_http_core_module.html#server_names_hash_bucket_size
ServerNameHashBucketSize int `structs:"server-name-hash-bucket-size,omitempty"`
- // SkipAccessLogURLs sets a list of URLs that should not appear in the NGINX access log
- // This is useful with urls like `/health` or `health-check` that make "complex" reading the logs
- // By default this list is empty
- SkipAccessLogURLs []string `structs:"skip-access-log-urls,-"`
-
- // Enables or disables the redirect (301) to the HTTPS port
- SSLRedirect bool `structs:"ssl-redirect,omitempty"`
-
- // http://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_buffer_size
- // Sets the size of the buffer used for sending data.
- // 4k helps NGINX to improve TLS Time To First Byte (TTTFB)
- // https://www.igvita.com/2013/12/16/optimizing-nginx-tls-time-to-first-byte/
- SSLBufferSize string `structs:"ssl-buffer-size,omitempty"`
-
// Enabled ciphers list to enabled. The ciphers are specified in the format understood by
// the OpenSSL library
// http://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_ciphers
@@ -230,17 +187,11 @@ type Configuration struct {
// http://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_session_timeout
SSLSessionTimeout string `structs:"ssl-session-timeout,omitempty"`
- // Number of unsuccessful attempts to communicate with the server that should happen in the
- // duration set by the fail_timeout parameter to consider the server unavailable
- // http://nginx.org/en/docs/http/ngx_http_upstream_module.html#upstream
- // Default: 0, ie use platform liveness probe
- UpstreamMaxFails int `structs:"upstream-max-fails,omitempty"`
-
- // Time during which the specified number of unsuccessful attempts to communicate with
- // the server should happen to consider the server unavailable
- // http://nginx.org/en/docs/http/ngx_http_upstream_module.html#upstream
- // Default: 0, ie use platform liveness probe
- UpstreamFailTimeout int `structs:"upstream-fail-timeout,omitempty"`
+ // http://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_buffer_size
+ // Sets the size of the buffer used for sending data.
+ // 4k helps NGINX to improve TLS Time To First Byte (TTTFB)
+ // https://www.igvita.com/2013/12/16/optimizing-nginx-tls-time-to-first-byte/
+ SSLBufferSize string `structs:"ssl-buffer-size,omitempty"`
// Enables or disables the use of the PROXY protocol to receive client connection
// (real IP address) information passed through proxy servers and load balancers
@@ -261,22 +212,17 @@ type Configuration struct {
// Responses with the “text/html” type are always compressed if UseGzip is enabled
GzipTypes string `structs:"gzip-types,omitempty"`
- // WhitelistSourceRange allows limiting access to certain client addresses
- // http://nginx.org/en/docs/http/ngx_http_access_module.html
- WhitelistSourceRange []string `structs:"whitelist-source-range,omitempty"`
-
// Defines the number of worker processes. By default auto means number of available CPU cores
// http://nginx.org/en/docs/ngx_core_module.html#worker_processes
- WorkerProcesses string `structs:"worker-processes,omitempty"`
+ WorkerProcesses int `structs:"worker-processes,omitempty"`
}
-// NewDefault returns the default configuration contained
-// in the file default-conf.json
+// NewDefault returns the default nginx configuration
func NewDefault() Configuration {
cfg := Configuration{
BodySize: bodySize,
EnableDynamicTLSRecords: true,
- EnableSPDY: true,
+ EnableSPDY: false,
ErrorLogLevel: errorLevel,
HSTS: true,
HSTSIncludeSubdomains: true,
@@ -285,14 +231,9 @@ func NewDefault() Configuration {
KeepAlive: 75,
MaxWorkerConnections: 16384,
MapHashBucketSize: 64,
- ProxyConnectTimeout: 5,
ProxyRealIPCIDR: defIPCIDR,
- ProxyReadTimeout: 60,
- ProxySendTimeout: 60,
- ProxyBufferSize: "4k",
ServerNameHashMaxSize: 512,
ServerNameHashBucketSize: 64,
- SSLRedirect: true,
SSLBufferSize: sslBufferSize,
SSLCiphers: sslCiphers,
SSLProtocols: sslProtocols,
@@ -302,12 +243,19 @@ func NewDefault() Configuration {
SSLSessionTimeout: sslSessionTimeout,
UseProxyProtocol: false,
UseGzip: true,
- WorkerProcesses: strconv.Itoa(runtime.NumCPU()),
+ WorkerProcesses: runtime.NumCPU(),
VtsStatusZoneSize: "10m",
UseHTTP2: true,
- CustomHTTPErrors: make([]int, 0),
- WhitelistSourceRange: make([]string, 0),
- SkipAccessLogURLs: make([]string, 0),
+ Backend: defaults.Backend{
+ ProxyConnectTimeout: 5,
+ ProxyReadTimeout: 60,
+ ProxySendTimeout: 60,
+ ProxyBufferSize: "4k",
+ SSLRedirect: true,
+ CustomHTTPErrors: []int{},
+ WhitelistSourceRange: []string{},
+ SkipAccessLogURLs: []string{},
+ },
}
if glog.V(5) {
@@ -316,3 +264,15 @@ func NewDefault() Configuration {
return cfg
}
+
+type TemplateConfig struct {
+ BacklogSize int
+ Backends []*ingress.Backend
+ PassthrougBackends []*ingress.SSLPassthroughBackend
+ Servers []*ingress.Server
+ TCPBackends []*ingress.Location
+ UDPBackends []*ingress.Location
+ HealthzURI string
+ CustomErrors bool
+ Cfg Configuration
+}
diff --git a/controllers/nginx/pkg/template/configmap.go b/controllers/nginx/pkg/template/configmap.go
new file mode 100644
index 0000000000..09bce6d006
--- /dev/null
+++ b/controllers/nginx/pkg/template/configmap.go
@@ -0,0 +1,122 @@
+/*
+Copyright 2015 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package template
+
+import (
+ "strconv"
+ "strings"
+
+ "github.com/golang/glog"
+ "github.com/imdario/mergo"
+
+ "github.com/fatih/structs"
+ "github.com/mitchellh/mapstructure"
+ go_camelcase "github.com/segmentio/go-camelcase"
+
+ "k8s.io/kubernetes/pkg/api"
+
+ "k8s.io/ingress/controllers/nginx/pkg/config"
+ "k8s.io/ingress/core/pkg/ingress/defaults"
+)
+
+const (
+ customHTTPErrors = "custom-http-errors"
+ skipAccessLogUrls = "skip-access-log-urls"
+ whitelistSourceRange = "whitelist-source-range"
+)
+
+// StandarizeKeyNames ...
+func StandarizeKeyNames(data interface{}) map[string]interface{} {
+ return fixKeyNames(structs.Map(data))
+}
+
+// ReadConfig obtains the configuration defined by the user merged with the defaults.
+func ReadConfig(conf *api.ConfigMap) config.Configuration {
+ if len(conf.Data) == 0 {
+ return config.NewDefault()
+ }
+
+ errors := make([]int, 0)
+ skipUrls := make([]string, 0)
+ whitelist := make([]string, 0)
+
+ if val, ok := conf.Data[customHTTPErrors]; ok {
+ delete(conf.Data, customHTTPErrors)
+ for _, i := range strings.Split(val, ",") {
+ j, err := strconv.Atoi(i)
+ if err != nil {
+ glog.Warningf("%v is not a valid http code: %v", i, err)
+ } else {
+ errors = append(errors, j)
+ }
+ }
+ }
+ if val, ok := conf.Data[skipAccessLogUrls]; ok {
+ delete(conf.Data, skipAccessLogUrls)
+ skipUrls = strings.Split(val, ",")
+ }
+ if val, ok := conf.Data[whitelistSourceRange]; ok {
+ delete(conf.Data, whitelistSourceRange)
+ whitelist = append(whitelist, strings.Split(val, ",")...)
+ }
+
+ to := config.Configuration{}
+ to.Backend = defaults.Backend{
+ CustomHTTPErrors: filterErrors(errors),
+ SkipAccessLogURLs: skipUrls,
+ WhitelistSourceRange: whitelist,
+ }
+ def := config.NewDefault()
+ if err := mergo.Merge(&to, def); err != nil {
+ glog.Warningf("unexpected error merging defaults: %v", err)
+ }
+
+ metadata := &mapstructure.Metadata{}
+ decoder, err := mapstructure.NewDecoder(&mapstructure.DecoderConfig{
+ TagName: "structs",
+ Result: &to,
+ WeaklyTypedInput: true,
+ Metadata: metadata,
+ })
+
+ err = decoder.Decode(conf.Data)
+ if err != nil {
+ glog.Infof("%v", err)
+ }
+ return to
+}
+
+func filterErrors(codes []int) []int {
+ var fa []int
+ for _, code := range codes {
+ if code > 299 && code < 600 {
+ fa = append(fa, code)
+ } else {
+ glog.Warningf("error code %v is not valid for custom error pages", code)
+ }
+ }
+
+ return fa
+}
+
+func fixKeyNames(data map[string]interface{}) map[string]interface{} {
+ fixed := make(map[string]interface{})
+ for k, v := range data {
+ fixed[go_camelcase.Camelcase(k)] = v
+ }
+ return fixed
+}
diff --git a/controllers/nginx/pkg/template/configmap_test.go b/controllers/nginx/pkg/template/configmap_test.go
new file mode 100644
index 0000000000..e80a299172
--- /dev/null
+++ b/controllers/nginx/pkg/template/configmap_test.go
@@ -0,0 +1,83 @@
+/*
+Copyright 2015 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package template
+
+import (
+ "testing"
+
+ "k8s.io/ingress/controllers/nginx/pkg/config"
+)
+
+func TestStandarizeKeyNames(t *testing.T) {
+}
+
+func TestFilterErrors(t *testing.T) {
+ e := filterErrors([]int{200, 300, 345, 500, 555, 999})
+ if len(e) != 4 {
+ t.Errorf("expected 4 elements but %v returned", len(e))
+ }
+}
+
+func TestFixKeyNames(t *testing.T) {
+ d := map[string]interface{}{
+ "one": "one",
+ "one-example": "oneExample",
+ "aMore-complex_example": "aMoreComplexExample",
+ "a": "a",
+ }
+
+ fixed := fixKeyNames(d)
+ for k, v := range fixed {
+ if k != v {
+ t.Errorf("expected %v but retuned %v", v, k)
+ }
+ }
+}
+
+type testStruct struct {
+ ProxyReadTimeout int `structs:"proxy-read-timeout,omitempty"`
+ ProxySendTimeout int `structs:"proxy-send-timeout,omitempty"`
+ CustomHTTPErrors []int `structs:"custom-http-errors"`
+ SkipAccessLogURLs []string `structs:"skip-access-log-urls,-"`
+ NoTag string
+}
+
+var decodedData = &testStruct{
+ 1,
+ 2,
+ []int{300, 400},
+ []string{"/log"},
+ "",
+}
+
+func TestMergeConfigMapToStruct(t *testing.T) {
+ /*conf := &api.ConfigMap{
+ Data: map[string]string{
+ "custom-http-errors": "300,400",
+ "proxy-read-timeout": "1",
+ "proxy-send-timeout": "2",
+ "skip-access-log-urls": "/log",
+ },
+ }*/
+ def := config.NewDefault()
+ def.CustomHTTPErrors = []int{300, 400}
+ def.SkipAccessLogURLs = []string{"/log"}
+ //to := ReadConfig(conf)
+ //if !reflect.DeepEqual(def, to) {
+ // t.Errorf("expected %v but retuned %v", def, to)
+ //}
+}
diff --git a/controllers/nginx/nginx/template/template.go b/controllers/nginx/pkg/template/template.go
similarity index 58%
rename from controllers/nginx/nginx/template/template.go
rename to controllers/nginx/pkg/template/template.go
index a7e7a18a11..59c6c844f7 100644
--- a/controllers/nginx/nginx/template/template.go
+++ b/controllers/nginx/pkg/template/template.go
@@ -21,51 +21,29 @@ import (
"encoding/base64"
"encoding/json"
"fmt"
- "regexp"
+ "os/exec"
"strings"
text_template "text/template"
- "github.com/fatih/structs"
"github.com/golang/glog"
- "k8s.io/contrib/ingress/controllers/nginx/nginx/config"
- "k8s.io/contrib/ingress/controllers/nginx/nginx/ingress"
- "k8s.io/kubernetes/pkg/util/sysctl"
+ "k8s.io/ingress/controllers/nginx/pkg/config"
+ "k8s.io/ingress/core/pkg/ingress"
+ "k8s.io/ingress/core/pkg/watch"
)
const (
- slash = "/"
-)
-
-var (
- camelRegexp = regexp.MustCompile("[0-9A-Za-z]+")
-
- funcMap = text_template.FuncMap{
- "empty": func(input interface{}) bool {
- check, ok := input.(string)
- if ok {
- return len(check) == 0
- }
-
- return true
- },
- "buildLocation": buildLocation,
- "buildAuthLocation": buildAuthLocation,
- "buildProxyPass": buildProxyPass,
- "buildRateLimitZones": buildRateLimitZones,
- "buildRateLimit": buildRateLimit,
- "contains": strings.Contains,
- "hasPrefix": strings.HasPrefix,
- "hasSuffix": strings.HasSuffix,
- "toUpper": strings.ToUpper,
- "toLower": strings.ToLower,
- }
+ slash = "/"
+ defBufferSize = 65535
)
// Template ...
type Template struct {
- tmpl *text_template.Template
- fw fileWatcher
+ tmpl *text_template.Template
+ fw watch.FileWatcher
+ s int
+ tmplBuf *bytes.Buffer
+ outCmdBuf *bytes.Buffer
}
//NewTemplate returns a new Template instance or an
@@ -75,66 +53,39 @@ func NewTemplate(file string, onChange func()) (*Template, error) {
if err != nil {
return nil, err
}
- fw, err := newFileWatcher(file, onChange)
+ fw, err := watch.NewFileWatcher(file, onChange)
if err != nil {
return nil, err
}
return &Template{
- tmpl: tmpl,
- fw: fw,
+ tmpl: tmpl,
+ fw: fw,
+ s: defBufferSize,
+ tmplBuf: bytes.NewBuffer(make([]byte, 0, defBufferSize)),
+ outCmdBuf: bytes.NewBuffer(make([]byte, 0, defBufferSize)),
}, nil
}
// Close removes the file watcher
func (t *Template) Close() {
- t.fw.close()
+ t.fw.Close()
}
// Write populates a buffer using a template with NGINX configuration
// and the servers and upstreams created by Ingress rules
-func (t *Template) Write(
- cfg config.Configuration,
- ingressCfg ingress.Configuration,
- isValidTemplate func([]byte) error) ([]byte, error) {
- var longestName int
- var serverNames int
- for _, srv := range ingressCfg.Servers {
- serverNames += len([]byte(srv.Name))
- if longestName < len(srv.Name) {
- longestName = len(srv.Name)
+func (t *Template) Write(conf config.TemplateConfig, isValidTemplate func([]byte) error) ([]byte, error) {
+ defer t.tmplBuf.Reset()
+ defer t.outCmdBuf.Reset()
+
+ defer func() {
+ if t.s < t.tmplBuf.Cap() {
+ glog.V(2).Infof("adjusting template buffer size from %v to %v", t.s, t.tmplBuf.Cap())
+ t.s = t.tmplBuf.Cap()
+ t.tmplBuf = bytes.NewBuffer(make([]byte, 0, t.tmplBuf.Cap()))
+ t.outCmdBuf = bytes.NewBuffer(make([]byte, 0, t.outCmdBuf.Cap()))
}
- }
-
- // NGINX cannot resize the has tables used to store server names.
- // For this reason we check if the defined size defined is correct
- // for the FQDN defined in the ingress rules adjusting the value
- // if is required.
- // https://trac.nginx.org/nginx/ticket/352
- // https://trac.nginx.org/nginx/ticket/631
- nameHashBucketSize := nextPowerOf2(longestName)
- if nameHashBucketSize > cfg.ServerNameHashBucketSize {
- glog.V(3).Infof("adjusting ServerNameHashBucketSize variable from %v to %v",
- cfg.ServerNameHashBucketSize, nameHashBucketSize)
- cfg.ServerNameHashBucketSize = nameHashBucketSize
- }
- serverNameHashMaxSize := nextPowerOf2(serverNames)
- if serverNameHashMaxSize > cfg.ServerNameHashMaxSize {
- glog.V(3).Infof("adjusting ServerNameHashMaxSize variable from %v to %v",
- cfg.ServerNameHashMaxSize, serverNameHashMaxSize)
- cfg.ServerNameHashMaxSize = serverNameHashMaxSize
- }
-
- conf := make(map[string]interface{})
- conf["backlogSize"] = sysctlSomaxconn()
- conf["upstreams"] = ingressCfg.Upstreams
- conf["servers"] = ingressCfg.Servers
- conf["tcpUpstreams"] = ingressCfg.TCPUpstreams
- conf["udpUpstreams"] = ingressCfg.UDPUpstreams
- conf["defResolver"] = cfg.Resolver
- conf["sslDHParam"] = cfg.SSLDHParam
- conf["customErrors"] = len(cfg.CustomHTTPErrors) > 0
- conf["cfg"] = fixKeyNames(structs.Map(cfg))
+ }()
if glog.V(3) {
b, err := json.Marshal(conf)
@@ -144,39 +95,80 @@ func (t *Template) Write(
glog.Infof("NGINX configuration: %v", string(b))
}
- buffer := new(bytes.Buffer)
- err := t.tmpl.Execute(buffer, conf)
+ err := t.tmpl.Execute(t.tmplBuf, conf)
if err != nil {
- glog.V(3).Infof("%v", string(buffer.Bytes()))
return nil, err
}
- err = isValidTemplate(buffer.Bytes())
+ // squeezes multiple adjacent empty lines to be single
+ // spaced this is to avoid the use of regular expressions
+ cmd := exec.Command("/ingress-controller/clean-nginx-conf.sh")
+ cmd.Stdin = t.tmplBuf
+ cmd.Stdout = t.outCmdBuf
+ if err := cmd.Run(); err != nil {
+ glog.Warningf("unexpected error cleaning template: %v", err)
+ return t.tmplBuf.Bytes(), nil
+ }
+
+ content := t.outCmdBuf.Bytes()
+ err = isValidTemplate(content)
if err != nil {
return nil, err
}
- return buffer.Bytes(), nil
+ return content, nil
}
-func fixKeyNames(data map[string]interface{}) map[string]interface{} {
- fixed := make(map[string]interface{})
- for k, v := range data {
- fixed[toCamelCase(k)] = v
+var (
+ funcMap = text_template.FuncMap{
+ "empty": func(input interface{}) bool {
+ check, ok := input.(string)
+ if ok {
+ return len(check) == 0
+ }
+ return true
+ },
+ "buildLocation": buildLocation,
+ "buildAuthLocation": buildAuthLocation,
+ "buildProxyPass": buildProxyPass,
+ "buildRateLimitZones": buildRateLimitZones,
+ "buildRateLimit": buildRateLimit,
+ "buildSSPassthroughUpstreams": buildSSPassthroughUpstreams,
+
+ "contains": strings.Contains,
+ "hasPrefix": strings.HasPrefix,
+ "hasSuffix": strings.HasSuffix,
+ "toUpper": strings.ToUpper,
+ "toLower": strings.ToLower,
}
+)
- return fixed
-}
-
-func toCamelCase(src string) string {
- byteSrc := []byte(src)
- chunks := camelRegexp.FindAll(byteSrc, -1)
- for idx, val := range chunks {
- if idx > 0 {
- chunks[idx] = bytes.Title(val)
+func buildSSPassthroughUpstreams(b interface{}, sslb interface{}) string {
+ backends := b.([]*ingress.Backend)
+ sslBackends := sslb.([]*ingress.SSLPassthroughBackend)
+ buf := bytes.NewBuffer(make([]byte, 0, 10))
+
+ // multiple services can use the same upstream.
+ // avoid duplications using a map[name]=true
+ u := make(map[string]bool)
+ for _, passthrough := range sslBackends {
+ if u[passthrough.Backend] {
+ continue
}
+ u[passthrough.Backend] = true
+ fmt.Fprintf(buf, "upstream %v {\n", passthrough.Backend)
+ for _, backend := range backends {
+ if backend.Name == passthrough.Backend {
+ for _, server := range backend.Endpoints {
+ fmt.Fprintf(buf, "\t\tserver %v:%v;\n", server.Address, server.Port)
+ }
+ break
+ }
+ }
+ fmt.Fprint(buf, "\t}\n\n")
}
- return string(bytes.Join(chunks, nil))
+
+ return buf.String()
}
// buildLocation produces the location string, if the ingress has redirects
@@ -201,7 +193,7 @@ func buildAuthLocation(input interface{}) string {
return ""
}
- if location.ExternalAuthURL.URL == "" {
+ if location.ExternalAuth.URL == "" {
return ""
}
@@ -215,20 +207,27 @@ func buildAuthLocation(input interface{}) string {
// (specified through the ingress.kubernetes.io/rewrite-to annotation)
// If the annotation ingress.kubernetes.io/add-base-url:"true" is specified it will
// add a base tag in the head of the response from the service
-func buildProxyPass(input interface{}) string {
- location, ok := input.(*ingress.Location)
+func buildProxyPass(b interface{}, loc interface{}) string {
+ backends := b.([]*ingress.Backend)
+ location, ok := loc.(*ingress.Location)
if !ok {
return ""
}
path := location.Path
-
proto := "http"
- if location.SecureUpstream {
- proto = "https"
+
+ for _, backend := range backends {
+ if backend.Name == location.Backend {
+ if backend.Secure {
+ proto = "https"
+ }
+ break
+ }
}
+
// defProxyPass returns the default proxy_pass, just the name of the upstream
- defProxyPass := fmt.Sprintf("proxy_pass %s://%s;", proto, location.Upstream.Name)
+ defProxyPass := fmt.Sprintf("proxy_pass %s://%s;", proto, location.Backend)
// if the path in the ingress rule is equals to the target: no special rewrite
if path == location.Redirect.Target {
return defProxyPass
@@ -258,13 +257,13 @@ func buildProxyPass(input interface{}) string {
rewrite %s(.*) /$1 break;
rewrite %s / break;
proxy_pass %s://%s;
- %v`, path, location.Path, proto, location.Upstream.Name, abu)
+ %v`, path, location.Path, proto, location.Backend, abu)
}
return fmt.Sprintf(`
rewrite %s(.*) %s/$1 break;
proxy_pass %s://%s;
- %v`, path, location.Redirect.Target, proto, location.Upstream.Name, abu)
+ %v`, path, location.Redirect.Target, proto, location.Backend, abu)
}
// default proxy_pass
@@ -329,30 +328,3 @@ func buildRateLimit(input interface{}) []string {
return limits
}
-
-// sysctlSomaxconn returns the value of net.core.somaxconn, i.e.
-// maximum number of connections that can be queued for acceptance
-// http://nginx.org/en/docs/http/ngx_http_core_module.html#listen
-func sysctlSomaxconn() int {
- maxConns, err := sysctl.New().GetSysctl("net/core/somaxconn")
- if err != nil || maxConns < 512 {
- glog.Warningf("system net.core.somaxconn=%v. Using NGINX default (511)", maxConns)
- return 511
- }
-
- return maxConns
-}
-
-// http://graphics.stanford.edu/~seander/bithacks.html#RoundUpPowerOf2
-// https://play.golang.org/p/TVSyCcdxUh
-func nextPowerOf2(v int) int {
- v--
- v |= v >> 1
- v |= v >> 2
- v |= v >> 4
- v |= v >> 8
- v |= v >> 16
- v++
-
- return v
-}
diff --git a/controllers/nginx/nginx/template/template_test.go b/controllers/nginx/pkg/template/template_test.go
similarity index 59%
rename from controllers/nginx/nginx/template/template_test.go
rename to controllers/nginx/pkg/template/template_test.go
index 1ca93c025e..fde02e3ef6 100644
--- a/controllers/nginx/nginx/template/template_test.go
+++ b/controllers/nginx/pkg/template/template_test.go
@@ -17,14 +17,21 @@ limitations under the License.
package template
import (
+ "encoding/json"
+ "os"
+ "path"
"strings"
"testing"
- "k8s.io/contrib/ingress/controllers/nginx/nginx/ingress"
- "k8s.io/contrib/ingress/controllers/nginx/nginx/rewrite"
+ "io/ioutil"
+
+ "k8s.io/ingress/controllers/nginx/pkg/config"
+ "k8s.io/ingress/core/pkg/ingress"
+ "k8s.io/ingress/core/pkg/ingress/annotations/rewrite"
)
var (
+ // TODO: add tests for secure endpoints
tmplFuncTestcases = map[string]struct {
Path string
Target string
@@ -88,12 +95,77 @@ func TestBuildProxyPass(t *testing.T) {
loc := &ingress.Location{
Path: tc.Path,
Redirect: rewrite.Redirect{Target: tc.Target, AddBaseURL: tc.AddBaseURL},
- Upstream: ingress.Upstream{Name: "upstream-name"},
+ Backend: "upstream-name",
}
- pp := buildProxyPass(loc)
+ pp := buildProxyPass([]*ingress.Backend{}, loc)
if !strings.EqualFold(tc.ProxyPass, pp) {
t.Errorf("%s: expected \n'%v'\nbut returned \n'%v'", k, tc.ProxyPass, pp)
}
}
}
+
+func TestTemplateWithData(t *testing.T) {
+ pwd, _ := os.Getwd()
+ f, err := os.Open(path.Join(pwd, "../../test/data/config.json"))
+ if err != nil {
+ t.Errorf("unexpected error reading json file: %v", err)
+ }
+ defer f.Close()
+ data, err := ioutil.ReadFile(f.Name())
+ if err != nil {
+ t.Error("unexpected error reading json file: ", err)
+ }
+ var dat config.TemplateConfig
+ if err := json.Unmarshal(data, &dat); err != nil {
+ t.Errorf("unexpected error unmarshalling json: %v", err)
+ }
+
+ tf, err := os.Open(path.Join(pwd, "../../rootfs/etc/nginx/template/nginx.tmpl"))
+ if err != nil {
+ t.Errorf("unexpected error reading json file: %v", err)
+ }
+ defer tf.Close()
+
+ ngxTpl, err := NewTemplate(tf.Name(), func() {})
+ if err != nil {
+ t.Errorf("invalid NGINX template: %v", err)
+ }
+
+ _, err = ngxTpl.Write(dat, func(b []byte) error { return nil })
+ if err != nil {
+ t.Errorf("invalid NGINX template: %v", err)
+ }
+}
+
+func BenchmarkTemplateWithData(b *testing.B) {
+ pwd, _ := os.Getwd()
+ f, err := os.Open(path.Join(pwd, "../../test/data/config.json"))
+ if err != nil {
+ b.Errorf("unexpected error reading json file: %v", err)
+ }
+ defer f.Close()
+ data, err := ioutil.ReadFile(f.Name())
+ if err != nil {
+ b.Error("unexpected error reading json file: ", err)
+ }
+ var dat config.TemplateConfig
+ if err := json.Unmarshal(data, &dat); err != nil {
+ b.Errorf("unexpected error unmarshalling json: %v", err)
+ }
+
+ tf, err := os.Open(path.Join(pwd, "../../rootfs/etc/nginx/template/nginx.tmpl"))
+ if err != nil {
+ b.Errorf("unexpected error reading json file: %v", err)
+ }
+ defer tf.Close()
+
+ ngxTpl, err := NewTemplate(tf.Name(), func() {})
+ if err != nil {
+ b.Errorf("invalid NGINX template: %v", err)
+ }
+
+ for i := 0; i < b.N; i++ {
+ ngxTpl.Write(dat, func(b []byte) error { return nil })
+ }
+}
diff --git a/controllers/nginx/pkg/version/version.go b/controllers/nginx/pkg/version/version.go
new file mode 100644
index 0000000000..3c036c0bca
--- /dev/null
+++ b/controllers/nginx/pkg/version/version.go
@@ -0,0 +1,26 @@
+/*
+Copyright 2015 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package version
+
+var (
+ // RELEASE returns the release version
+ RELEASE = "UNKNOWN"
+ // REPO returns the git repository URL
+ REPO = "UNKNOWN"
+ // COMMIT returns the short sha from git
+ COMMIT = "UNKNOWN"
+)
diff --git a/controllers/nginx/rc.yaml b/controllers/nginx/rc.yaml
deleted file mode 100644
index 9b299b9272..0000000000
--- a/controllers/nginx/rc.yaml
+++ /dev/null
@@ -1,107 +0,0 @@
-apiVersion: v1
-kind: Service
-metadata:
- name: default-http-backend
- labels:
- k8s-app: default-http-backend
-spec:
- ports:
- - port: 80
- targetPort: 8080
- protocol: TCP
- name: http
- selector:
- k8s-app: default-http-backend
----
-apiVersion: v1
-kind: ReplicationController
-metadata:
- name: default-http-backend
-spec:
- replicas: 1
- selector:
- k8s-app: default-http-backend
- template:
- metadata:
- labels:
- k8s-app: default-http-backend
- spec:
- terminationGracePeriodSeconds: 60
- containers:
- - name: default-http-backend
- # Any image is permissable as long as:
- # 1. It serves a 404 page at /
- # 2. It serves 200 on a /healthz endpoint
- image: gcr.io/google_containers/defaultbackend:1.0
- livenessProbe:
- httpGet:
- path: /healthz
- port: 8080
- scheme: HTTP
- initialDelaySeconds: 30
- timeoutSeconds: 5
- ports:
- - containerPort: 8080
- resources:
- limits:
- cpu: 10m
- memory: 20Mi
- requests:
- cpu: 10m
- memory: 20Mi
----
-apiVersion: v1
-kind: ReplicationController
-metadata:
- name: nginx-ingress-controller
- labels:
- k8s-app: nginx-ingress-lb
-spec:
- replicas: 1
- selector:
- k8s-app: nginx-ingress-lb
- template:
- metadata:
- labels:
- k8s-app: nginx-ingress-lb
- name: nginx-ingress-lb
- spec:
- terminationGracePeriodSeconds: 60
- containers:
- - image: gcr.io/google_containers/nginx-ingress-controller:0.8.3
- name: nginx-ingress-lb
- imagePullPolicy: Always
- readinessProbe:
- httpGet:
- path: /healthz
- port: 10254
- scheme: HTTP
- livenessProbe:
- httpGet:
- path: /healthz
- port: 10254
- scheme: HTTP
- initialDelaySeconds: 10
- timeoutSeconds: 1
- # use downward API
- env:
- - name: POD_NAME
- valueFrom:
- fieldRef:
- fieldPath: metadata.name
- - name: POD_NAMESPACE
- valueFrom:
- fieldRef:
- fieldPath: metadata.namespace
- ports:
- - containerPort: 80
- hostPort: 80
- - containerPort: 443
- hostPort: 443
- # we expose 18080 to access nginx stats in url /nginx-status
- # this is optional
- - containerPort: 18080
- hostPort: 18080
- args:
- - /nginx-ingress-controller
- - --default-backend-service=$(POD_NAMESPACE)/default-http-backend
diff --git a/controllers/nginx/Dockerfile b/controllers/nginx/rootfs/Dockerfile
similarity index 78%
rename from controllers/nginx/Dockerfile
rename to controllers/nginx/rootfs/Dockerfile
index ab4997e927..c7e4180ff2 100644
--- a/controllers/nginx/Dockerfile
+++ b/controllers/nginx/rootfs/Dockerfile
@@ -12,7 +12,7 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-FROM gcr.io/google_containers/nginx-slim:0.9
+FROM gcr.io/google_containers/nginx-slim:0.11
RUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y \
diffutils \
@@ -21,13 +21,6 @@ RUN DEBIAN_FRONTEND=noninteractive apt-get update && apt-get install -y \
&& rm -rf /var/lib/apt/lists/* \
&& make-ssl-cert generate-default-snakeoil --force-overwrite
-COPY nginx-ingress-controller /
-COPY nginx.tmpl /etc/nginx/template/nginx.tmpl
-COPY nginx.tmpl /etc/nginx/nginx.tmpl
-COPY default.conf /etc/nginx/nginx.conf
-
-COPY lua /etc/nginx/lua/
-
-WORKDIR /
+COPY . /
CMD ["/nginx-ingress-controller"]
diff --git a/controllers/nginx/lua/error_page.lua b/controllers/nginx/rootfs/etc/nginx/lua/error_page.lua
similarity index 100%
rename from controllers/nginx/lua/error_page.lua
rename to controllers/nginx/rootfs/etc/nginx/lua/error_page.lua
diff --git a/controllers/nginx/lua/trie.lua b/controllers/nginx/rootfs/etc/nginx/lua/trie.lua
similarity index 100%
rename from controllers/nginx/lua/trie.lua
rename to controllers/nginx/rootfs/etc/nginx/lua/trie.lua
diff --git a/controllers/nginx/lua/vendor/lua-resty-http/.gitignore b/controllers/nginx/rootfs/etc/nginx/lua/vendor/lua-resty-http/.gitignore
similarity index 100%
rename from controllers/nginx/lua/vendor/lua-resty-http/.gitignore
rename to controllers/nginx/rootfs/etc/nginx/lua/vendor/lua-resty-http/.gitignore
diff --git a/controllers/nginx/lua/vendor/lua-resty-http/LICENSE b/controllers/nginx/rootfs/etc/nginx/lua/vendor/lua-resty-http/LICENSE
similarity index 100%
rename from controllers/nginx/lua/vendor/lua-resty-http/LICENSE
rename to controllers/nginx/rootfs/etc/nginx/lua/vendor/lua-resty-http/LICENSE
diff --git a/controllers/nginx/lua/vendor/lua-resty-http/Makefile b/controllers/nginx/rootfs/etc/nginx/lua/vendor/lua-resty-http/Makefile
similarity index 100%
rename from controllers/nginx/lua/vendor/lua-resty-http/Makefile
rename to controllers/nginx/rootfs/etc/nginx/lua/vendor/lua-resty-http/Makefile
diff --git a/controllers/nginx/lua/vendor/lua-resty-http/README.md b/controllers/nginx/rootfs/etc/nginx/lua/vendor/lua-resty-http/README.md
similarity index 96%
rename from controllers/nginx/lua/vendor/lua-resty-http/README.md
rename to controllers/nginx/rootfs/etc/nginx/lua/vendor/lua-resty-http/README.md
index 9ad07f03d4..f0135ffe4c 100644
--- a/controllers/nginx/lua/vendor/lua-resty-http/README.md
+++ b/controllers/nginx/rootfs/etc/nginx/lua/vendor/lua-resty-http/README.md
@@ -1,21 +1,21 @@
# lua-resty-http
-Lua HTTP client cosocket driver for [OpenResty](http://openresty.org/) / [ngx_lua](https://github.com/chaoslawful/lua-nginx-module).
+Lua HTTP client cosocket driver for [OpenResty](http://openresty.org/) / [ngx_lua](https://github.com/openresty/lua-nginx-module).
# Status
-Ready for testing. Probably production ready in most cases, though not yet proven in the wild. Please check the issues list and let me know if you have any problems / questions.
+Production ready.
# Features
* HTTP 1.0 and 1.1
-* Streaming interface to reading bodies using coroutines, for predictable memory usage in Lua land.
-* Alternative simple interface for singleshot requests without manual connection step.
-* Headers treated case insensitively.
-* Chunked transfer encoding.
-* Keepalive.
-* Pipelining.
-* Trailers.
+* SSL
+* Streaming interface to the response body, for predictable memory usage
+* Alternative simple interface for singleshot requests without manual connection step
+* Chunked and non-chunked transfer encodings
+* Keepalive
+* Pipelining
+* Trailers
# API
@@ -222,6 +222,7 @@ The `params` table accepts the following fields:
When the request is successful, `res` will contain the following fields:
* `status` The status code.
+* `reason` The status reason phrase.
* `headers` A table of headers. Multiple headers with the same field name will be presented as a table of values.
* `has_body` A boolean flag indicating if there is a body to be read.
* `body_reader` An iterator function for reading the body in a streaming fashion.
@@ -291,7 +292,7 @@ repeat
ngx.log(ngx.ERR, err)
break
end
-
+
if chunk then
-- process
end
@@ -410,7 +411,7 @@ Originally started life based on https://github.com/bakins/lua-resty-http-simple
This module is licensed under the 2-clause BSD license.
-Copyright (c) 2013, James Hurst
+Copyright (c) 2013-2016, James Hurst
All rights reserved.
diff --git a/controllers/nginx/lua/vendor/lua-resty-http/lib/resty/http.lua b/controllers/nginx/rootfs/etc/nginx/lua/vendor/lua-resty-http/lib/resty/http.lua
similarity index 92%
rename from controllers/nginx/lua/vendor/lua-resty-http/lib/resty/http.lua
rename to controllers/nginx/rootfs/etc/nginx/lua/vendor/lua-resty-http/lib/resty/http.lua
index 3a6a01a0c8..94f9813ef6 100644
--- a/controllers/nginx/lua/vendor/lua-resty-http/lib/resty/http.lua
+++ b/controllers/nginx/rootfs/etc/nginx/lua/vendor/lua-resty-http/lib/resty/http.lua
@@ -67,7 +67,7 @@ end
local _M = {
- _VERSION = '0.07',
+ _VERSION = '0.09',
}
_M._USER_AGENT = "lua-resty-http/" .. _M._VERSION .. " (Lua) ngx_lua/" .. ngx.config.ngx_lua_version
@@ -111,6 +111,8 @@ function _M.ssl_handshake(self, ...)
return nil, "not initialized"
end
+ self.ssl = true
+
return sock:sslhandshake(...)
end
@@ -122,6 +124,13 @@ function _M.connect(self, ...)
end
self.host = select(1, ...)
+ self.port = select(2, ...)
+
+ -- If port is not a number, this is likely a unix domain socket connection.
+ if type(self.port) ~= "number" then
+ self.port = nil
+ end
+
self.keepalive = true
return sock:connect(...)
@@ -179,17 +188,19 @@ end
function _M.parse_uri(self, uri)
- local m, err = ngx_re_match(uri, [[^(http[s]*)://([^:/]+)(?::(\d+))?(.*)]],
+ local m, err = ngx_re_match(uri, [[^(http[s]?)://([^:/]+)(?::(\d+))?(.*)]],
"jo")
if not m then
if err then
- return nil, "failed to match the uri: " .. err
+ return nil, "failed to match the uri: " .. uri .. ", " .. err
end
- return nil, "bad uri"
+ return nil, "bad uri: " .. uri
else
- if not m[3] then
+ if m[3] then
+ m[3] = tonumber(m[3])
+ else
if m[1] == "https" then
m[3] = 443
else
@@ -250,10 +261,10 @@ end
local function _receive_status(sock)
local line, err = sock:receive("*l")
if not line then
- return nil, nil, err
+ return nil, nil, nil, err
end
- return tonumber(str_sub(line, 10, 12)), tonumber(str_sub(line, 6, 8))
+ return tonumber(str_sub(line, 10, 12)), tonumber(str_sub(line, 6, 8)), str_sub(line, 14)
end
@@ -487,16 +498,16 @@ end
local function _handle_continue(sock, body)
- local status, version, err = _receive_status(sock)
+ local status, version, reason, err = _receive_status(sock)
if not status then
- return nil, err
+ return nil, nil, err
end
-- Only send body if we receive a 100 Continue
if status == 100 then
local ok, err = sock:receive("*l") -- Read carriage return
if not ok then
- return nil, err
+ return nil, nil, err
end
_send_body(sock, body)
end
@@ -526,7 +537,22 @@ function _M.send_request(self, params)
headers["Content-Length"] = #body
end
if not headers["Host"] then
- headers["Host"] = self.host
+ if (str_sub(self.host, 1, 5) == "unix:") then
+ return nil, "Unable to generate a useful Host header for a unix domain socket. Please provide one."
+ end
+ -- If we have a port (i.e. not connected to a unix domain socket), and this
+ -- port is non-standard, append it to the Host heaer.
+ if self.port then
+ if self.ssl and self.port ~= 443 then
+ headers["Host"] = self.host .. ":" .. self.port
+ elseif not self.ssl and self.port ~= 80 then
+ headers["Host"] = self.host .. ":" .. self.port
+ else
+ headers["Host"] = self.host
+ end
+ else
+ headers["Host"] = self.host
+ end
end
if not headers["User-Agent"] then
headers["User-Agent"] = _M._USER_AGENT
@@ -562,7 +588,7 @@ end
function _M.read_response(self, params)
local sock = self.sock
- local status, version, err
+ local status, version, reason, err
-- If we expect: continue, we need to handle this, sending the body if allowed.
-- If we don't get 100 back, then status is the actual status.
@@ -577,7 +603,7 @@ function _M.read_response(self, params)
-- Just read the status as normal.
if not status then
- status, version, err = _receive_status(sock)
+ status, version, reason, err = _receive_status(sock)
if not status then
return nil, err
end
@@ -589,13 +615,18 @@ function _M.read_response(self, params)
return nil, err
end
- -- Determine if we should keepalive or not.
+ -- keepalive is true by default. Determine if this is correct or not.
local ok, connection = pcall(str_lower, res_headers["Connection"])
if ok then
if (version == 1.1 and connection == "close") or
(version == 1.0 and connection ~= "keep-alive") then
self.keepalive = false
end
+ else
+ -- no connection header
+ if version == 1.0 then
+ self.keepalive = false
+ end
end
local body_reader = _no_body_reader
@@ -627,6 +658,7 @@ function _M.read_response(self, params)
else
return {
status = status,
+ reason = reason,
headers = res_headers,
has_body = has_body,
body_reader = body_reader,
diff --git a/controllers/nginx/lua/vendor/lua-resty-http/lib/resty/http_headers.lua b/controllers/nginx/rootfs/etc/nginx/lua/vendor/lua-resty-http/lib/resty/http_headers.lua
similarity index 100%
rename from controllers/nginx/lua/vendor/lua-resty-http/lib/resty/http_headers.lua
rename to controllers/nginx/rootfs/etc/nginx/lua/vendor/lua-resty-http/lib/resty/http_headers.lua
diff --git a/controllers/nginx/rootfs/etc/nginx/lua/vendor/lua-resty-http/lua-resty-http-0.09-0.rockspec b/controllers/nginx/rootfs/etc/nginx/lua/vendor/lua-resty-http/lua-resty-http-0.09-0.rockspec
new file mode 100644
index 0000000000..589c0ca29d
--- /dev/null
+++ b/controllers/nginx/rootfs/etc/nginx/lua/vendor/lua-resty-http/lua-resty-http-0.09-0.rockspec
@@ -0,0 +1,22 @@
+package = "lua-resty-http"
+version = "0.09-0"
+source = {
+ url = "git://github.com/pintsized/lua-resty-http",
+ tag = "v0.09"
+}
+description = {
+ summary = "Lua HTTP client cosocket driver for OpenResty / ngx_lua.",
+ homepage = "https://github.com/pintsized/lua-resty-http",
+ license = "2-clause BSD",
+ maintainer = "James Hurst "
+}
+dependencies = {
+ "lua >= 5.1"
+}
+build = {
+ type = "builtin",
+ modules = {
+ ["resty.http"] = "lib/resty/http.lua",
+ ["resty.http_headers"] = "lib/resty/http_headers.lua"
+ }
+}
diff --git a/controllers/nginx/lua/vendor/lua-resty-http/t/01-basic.t b/controllers/nginx/rootfs/etc/nginx/lua/vendor/lua-resty-http/t/01-basic.t
similarity index 98%
rename from controllers/nginx/lua/vendor/lua-resty-http/t/01-basic.t
rename to controllers/nginx/rootfs/etc/nginx/lua/vendor/lua-resty-http/t/01-basic.t
index 03c33c57a8..79d4ee7e05 100644
--- a/controllers/nginx/lua/vendor/lua-resty-http/t/01-basic.t
+++ b/controllers/nginx/rootfs/etc/nginx/lua/vendor/lua-resty-http/t/01-basic.t
@@ -83,7 +83,7 @@ OK
[warn]
-=== TEST 3: Status code
+=== TEST 3: Status code and reason phrase
--- http_config eval: $::HttpConfig
--- config
location = /a {
@@ -97,6 +97,7 @@ OK
}
ngx.status = res.status
+ ngx.say(res.reason)
ngx.print(res:read_body())
httpc:close()
@@ -111,6 +112,7 @@ OK
--- request
GET /a
--- response_body
+Not Found
OK
--- error_code: 404
--- no_error_log
diff --git a/controllers/nginx/lua/vendor/lua-resty-http/t/02-chunked.t b/controllers/nginx/rootfs/etc/nginx/lua/vendor/lua-resty-http/t/02-chunked.t
similarity index 100%
rename from controllers/nginx/lua/vendor/lua-resty-http/t/02-chunked.t
rename to controllers/nginx/rootfs/etc/nginx/lua/vendor/lua-resty-http/t/02-chunked.t
diff --git a/controllers/nginx/lua/vendor/lua-resty-http/t/03-requestbody.t b/controllers/nginx/rootfs/etc/nginx/lua/vendor/lua-resty-http/t/03-requestbody.t
similarity index 100%
rename from controllers/nginx/lua/vendor/lua-resty-http/t/03-requestbody.t
rename to controllers/nginx/rootfs/etc/nginx/lua/vendor/lua-resty-http/t/03-requestbody.t
diff --git a/controllers/nginx/lua/vendor/lua-resty-http/t/04-trailers.t b/controllers/nginx/rootfs/etc/nginx/lua/vendor/lua-resty-http/t/04-trailers.t
similarity index 100%
rename from controllers/nginx/lua/vendor/lua-resty-http/t/04-trailers.t
rename to controllers/nginx/rootfs/etc/nginx/lua/vendor/lua-resty-http/t/04-trailers.t
diff --git a/controllers/nginx/lua/vendor/lua-resty-http/t/05-stream.t b/controllers/nginx/rootfs/etc/nginx/lua/vendor/lua-resty-http/t/05-stream.t
similarity index 100%
rename from controllers/nginx/lua/vendor/lua-resty-http/t/05-stream.t
rename to controllers/nginx/rootfs/etc/nginx/lua/vendor/lua-resty-http/t/05-stream.t
diff --git a/controllers/nginx/lua/vendor/lua-resty-http/t/06-simpleinterface.t b/controllers/nginx/rootfs/etc/nginx/lua/vendor/lua-resty-http/t/06-simpleinterface.t
similarity index 100%
rename from controllers/nginx/lua/vendor/lua-resty-http/t/06-simpleinterface.t
rename to controllers/nginx/rootfs/etc/nginx/lua/vendor/lua-resty-http/t/06-simpleinterface.t
diff --git a/controllers/nginx/lua/vendor/lua-resty-http/t/07-keepalive.t b/controllers/nginx/rootfs/etc/nginx/lua/vendor/lua-resty-http/t/07-keepalive.t
similarity index 76%
rename from controllers/nginx/lua/vendor/lua-resty-http/t/07-keepalive.t
rename to controllers/nginx/rootfs/etc/nginx/lua/vendor/lua-resty-http/t/07-keepalive.t
index cb9bc3aa57..c8bda14079 100644
--- a/controllers/nginx/lua/vendor/lua-resty-http/t/07-keepalive.t
+++ b/controllers/nginx/rootfs/etc/nginx/lua/vendor/lua-resty-http/t/07-keepalive.t
@@ -180,3 +180,61 @@ connection must be closed
--- no_error_log
[error]
[warn]
+
+
+=== TEST 5: Generic interface, HTTP 1.0, no connection header. Test we don't try to keepalive, but also that subsequent connections can keepalive.
+--- http_config eval: $::HttpConfig
+--- config
+ location = /a {
+ content_by_lua '
+ local http = require "resty.http"
+ local httpc = http.new()
+ httpc:connect("127.0.0.1", 12345)
+
+ local res, err = httpc:request{
+ version = 1.0,
+ path = "/b"
+ }
+
+ local body = res:read_body()
+ ngx.print(body)
+
+ ngx.say(res.headers["Connection"])
+
+ local r, e = httpc:set_keepalive()
+ ngx.say(r)
+ ngx.say(e)
+
+ httpc:connect("127.0.0.1", ngx.var.server_port)
+ ngx.say(httpc:get_reused_times())
+
+ httpc:set_keepalive()
+
+ httpc:connect("127.0.0.1", ngx.var.server_port)
+ ngx.say(httpc:get_reused_times())
+ ';
+ }
+ location = /b {
+ content_by_lua '
+ ngx.say("OK")
+ ';
+ }
+--- request
+GET /a
+--- tcp_listen: 12345
+--- tcp_reply
+HTTP/1.0 200 OK
+Date: Fri, 08 Aug 2016 08:12:31 GMT
+Server: OpenResty
+
+OK
+--- response_body
+OK
+nil
+2
+connection must be closed
+0
+1
+--- no_error_log
+[error]
+[warn]
diff --git a/controllers/nginx/lua/vendor/lua-resty-http/t/08-pipeline.t b/controllers/nginx/rootfs/etc/nginx/lua/vendor/lua-resty-http/t/08-pipeline.t
similarity index 100%
rename from controllers/nginx/lua/vendor/lua-resty-http/t/08-pipeline.t
rename to controllers/nginx/rootfs/etc/nginx/lua/vendor/lua-resty-http/t/08-pipeline.t
diff --git a/controllers/nginx/lua/vendor/lua-resty-http/t/09-ssl.t b/controllers/nginx/rootfs/etc/nginx/lua/vendor/lua-resty-http/t/09-ssl.t
similarity index 100%
rename from controllers/nginx/lua/vendor/lua-resty-http/t/09-ssl.t
rename to controllers/nginx/rootfs/etc/nginx/lua/vendor/lua-resty-http/t/09-ssl.t
diff --git a/controllers/nginx/lua/vendor/lua-resty-http/t/10-clientbodyreader.t b/controllers/nginx/rootfs/etc/nginx/lua/vendor/lua-resty-http/t/10-clientbodyreader.t
similarity index 100%
rename from controllers/nginx/lua/vendor/lua-resty-http/t/10-clientbodyreader.t
rename to controllers/nginx/rootfs/etc/nginx/lua/vendor/lua-resty-http/t/10-clientbodyreader.t
diff --git a/controllers/nginx/lua/vendor/lua-resty-http/t/11-proxy.t b/controllers/nginx/rootfs/etc/nginx/lua/vendor/lua-resty-http/t/11-proxy.t
similarity index 100%
rename from controllers/nginx/lua/vendor/lua-resty-http/t/11-proxy.t
rename to controllers/nginx/rootfs/etc/nginx/lua/vendor/lua-resty-http/t/11-proxy.t
diff --git a/controllers/nginx/lua/vendor/lua-resty-http/t/12-case_insensitive_headers.t b/controllers/nginx/rootfs/etc/nginx/lua/vendor/lua-resty-http/t/12-case_insensitive_headers.t
similarity index 100%
rename from controllers/nginx/lua/vendor/lua-resty-http/t/12-case_insensitive_headers.t
rename to controllers/nginx/rootfs/etc/nginx/lua/vendor/lua-resty-http/t/12-case_insensitive_headers.t
diff --git a/controllers/nginx/lua/vendor/lua-resty-http/t/13-default-path.t b/controllers/nginx/rootfs/etc/nginx/lua/vendor/lua-resty-http/t/13-default-path.t
similarity index 100%
rename from controllers/nginx/lua/vendor/lua-resty-http/t/13-default-path.t
rename to controllers/nginx/rootfs/etc/nginx/lua/vendor/lua-resty-http/t/13-default-path.t
diff --git a/controllers/nginx/rootfs/etc/nginx/lua/vendor/lua-resty-http/t/14-host-header.t b/controllers/nginx/rootfs/etc/nginx/lua/vendor/lua-resty-http/t/14-host-header.t
new file mode 100644
index 0000000000..e3411ffe46
--- /dev/null
+++ b/controllers/nginx/rootfs/etc/nginx/lua/vendor/lua-resty-http/t/14-host-header.t
@@ -0,0 +1,161 @@
+# vim:set ft= ts=4 sw=4 et:
+
+use Test::Nginx::Socket;
+use Cwd qw(cwd);
+
+plan tests => repeat_each() * (blocks() * 3);
+
+my $pwd = cwd();
+
+our $HttpConfig = qq{
+ lua_package_path "$pwd/lib/?.lua;;";
+ error_log logs/error.log debug;
+ resolver 8.8.8.8;
+};
+
+$ENV{TEST_NGINX_RESOLVER} = '8.8.8.8';
+$ENV{TEST_NGINX_PWD} ||= $pwd;
+
+sub read_file {
+ my $infile = shift;
+ open my $in, $infile
+ or die "cannot open $infile for reading: $!";
+ my $cert = do { local $/; <$in> };
+ close $in;
+ $cert;
+}
+
+our $TestCertificate = read_file("t/cert/test.crt");
+our $TestCertificateKey = read_file("t/cert/test.key");
+
+no_long_string();
+#no_diff();
+
+run_tests();
+
+__DATA__
+=== TEST 1: Default HTTP port is not added to Host header
+--- http_config eval: $::HttpConfig
+--- config
+ location /lua {
+ content_by_lua '
+ local http = require "resty.http"
+ local httpc = http.new()
+
+ local res, err = httpc:request_uri("http://www.google.com")
+ ';
+ }
+--- request
+GET /lua
+--- no_error_log
+[error]
+--- error_log
+Host: www.google.com
+
+
+=== TEST 2: Default HTTPS port is not added to Host header
+--- http_config eval: $::HttpConfig
+--- config
+ location /lua {
+ content_by_lua '
+ local http = require "resty.http"
+ local httpc = http.new()
+
+ local res, err = httpc:request_uri("https://www.google.com:443", { ssl_verify = false })
+ ';
+ }
+--- request
+GET /lua
+--- no_error_log
+[error]
+--- error_log
+Host: www.google.com
+
+
+=== TEST 3: Non-default HTTP port is added to Host header
+--- http_config
+ lua_package_path "$TEST_NGINX_PWD/lib/?.lua;;";
+ error_log logs/error.log debug;
+ resolver 8.8.8.8;
+ server {
+ listen *:8080;
+ }
+--- config
+ location /lua {
+ content_by_lua '
+ local http = require "resty.http"
+ local httpc = http.new()
+
+ local res, err = httpc:request_uri("http://127.0.0.1:8080")
+ ';
+ }
+--- request
+GET /lua
+--- no_error_log
+[error]
+--- error_log
+Host: 127.0.0.1:8080
+
+
+=== TEST 4: Non-default HTTPS port is added to Host header
+--- http_config
+ lua_package_path "$TEST_NGINX_PWD/lib/?.lua;;";
+ error_log logs/error.log debug;
+ resolver 8.8.8.8;
+ server {
+ listen *:8080;
+ listen *:8081 ssl;
+ ssl_certificate ../html/test.crt;
+ ssl_certificate_key ../html/test.key;
+ }
+--- config
+ location /lua {
+ content_by_lua '
+ local http = require "resty.http"
+ local httpc = http.new()
+
+ local res, err = httpc:request_uri("https://127.0.0.1:8081", { ssl_verify = false })
+ ';
+ }
+--- user_files eval
+">>> test.key
+$::TestCertificateKey
+>>> test.crt
+$::TestCertificate"
+--- request
+GET /lua
+--- no_error_log
+[error]
+--- error_log
+Host: 127.0.0.1:8081
+
+
+=== TEST 5: No host header on a unix domain socket returns a useful error.
+--- http_config eval: $::HttpConfig
+--- config
+ location /a {
+ content_by_lua_block {
+ local http = require "resty.http"
+ local httpc = http.new()
+
+ local res, err = httpc:connect("unix:test.sock")
+ if not res then
+ ngx.log(ngx.ERR, err)
+ end
+
+ local res, err = httpc:request({ path = "/" })
+ if not res then
+ ngx.say(err)
+ else
+ ngx.say(res:read_body())
+ end
+ }
+ }
+--- tcp_listen: test.sock
+--- tcp_reply: OK
+--- request
+GET /a
+--- no_error_log
+[error]
+--- response_body
+Unable to generate a useful Host header for a unix domain socket. Please provide one.
diff --git a/controllers/nginx/rootfs/etc/nginx/lua/vendor/lua-resty-http/t/cert/test.crt b/controllers/nginx/rootfs/etc/nginx/lua/vendor/lua-resty-http/t/cert/test.crt
new file mode 100644
index 0000000000..ae1134461d
--- /dev/null
+++ b/controllers/nginx/rootfs/etc/nginx/lua/vendor/lua-resty-http/t/cert/test.crt
@@ -0,0 +1,24 @@
+-----BEGIN CERTIFICATE-----
+MIID8DCCAtigAwIBAgIJALL9eJPZ6neGMA0GCSqGSIb3DQEBBQUAMFgxCzAJBgNV
+BAYTAkdCMQ0wCwYDVQQIEwRUZXN0MQ0wCwYDVQQHEwRUZXN0MQ0wCwYDVQQKEwRU
+ZXN0MQ0wCwYDVQQLEwRUZXN0MQ0wCwYDVQQDEwR0ZXN0MB4XDTE1MTAyMTE2MjQ1
+NloXDTE1MTEyMDE2MjQ1NlowWDELMAkGA1UEBhMCR0IxDTALBgNVBAgTBFRlc3Qx
+DTALBgNVBAcTBFRlc3QxDTALBgNVBAoTBFRlc3QxDTALBgNVBAsTBFRlc3QxDTAL
+BgNVBAMTBHRlc3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDz/AoE
+c+TPdm+Aqcchq8fLNWksFQZqbsCBGnq8rUG1b6MsVlAOkDUQGRlNPs9v0/+pzgX7
+IYXPCFcV7YONNsTUfvBYTq43mfOycmAdb3SX6kBygxdhYsDRZR+vCAIkjoRmRB20
+meh1motqM58spq3IcT8VADTRJl1OI48VTnxmXdCtmkOymU948DcauMoxm03eL/hU
+6eniNEujbnbB305noNG0W5c3h6iz9CvqUAD1kwyjick+f1atB2YYn1bymA+db6YN
+3iTo0v2raWmIc7D+qqpkNaCRxgMb2HN6X3/SfkijtNJidjqHMbs2ftlKJ5/lODPZ
+rCPQOcYK6TT8MIZ1AgMBAAGjgbwwgbkwHQYDVR0OBBYEFFUC1GrAhUp7IvJH5iyf
++fJQliEIMIGJBgNVHSMEgYEwf4AUVQLUasCFSnsi8kfmLJ/58lCWIQihXKRaMFgx
+CzAJBgNVBAYTAkdCMQ0wCwYDVQQIEwRUZXN0MQ0wCwYDVQQHEwRUZXN0MQ0wCwYD
+VQQKEwRUZXN0MQ0wCwYDVQQLEwRUZXN0MQ0wCwYDVQQDEwR0ZXN0ggkAsv14k9nq
+d4YwDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAtaUQOr3Qn87KXmmP
+GbSvCLSl+bScE09VYZsYaB6iq0pGN9y+Vh4/HjBUUsFexopw1dY25MEEJXEVi1xV
+2krLYAsfKCM6c1QBVmdqfVuxUvxpXwr+CNRNAlzz6PhjkeY/Ds/j4sg7EqN8hMmT
+gu8GuogX7+ZCgrzRSMMclWej+W8D1xSIuCC+rqv4w9SZdtVb3XGpCyizpTNsQAuV
+ACXvq9KXkEEj+XNvKrNdWd4zG715RdMnVm+WM53d9PLp63P+4/kwhwHULYhXygQ3
+DzzVPaojBBdw3VaHbbPHnv73FtAzOb7ky6zJ01DlmEPxEahCFpklMkY9T2uCdpj9
+oOzaNA==
+-----END CERTIFICATE-----
diff --git a/controllers/nginx/rootfs/etc/nginx/lua/vendor/lua-resty-http/t/cert/test.key b/controllers/nginx/rootfs/etc/nginx/lua/vendor/lua-resty-http/t/cert/test.key
new file mode 100644
index 0000000000..4fcd0dae85
--- /dev/null
+++ b/controllers/nginx/rootfs/etc/nginx/lua/vendor/lua-resty-http/t/cert/test.key
@@ -0,0 +1,27 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIEowIBAAKCAQEA8/wKBHPkz3ZvgKnHIavHyzVpLBUGam7AgRp6vK1BtW+jLFZQ
+DpA1EBkZTT7Pb9P/qc4F+yGFzwhXFe2DjTbE1H7wWE6uN5nzsnJgHW90l+pAcoMX
+YWLA0WUfrwgCJI6EZkQdtJnodZqLajOfLKatyHE/FQA00SZdTiOPFU58Zl3QrZpD
+splPePA3GrjKMZtN3i/4VOnp4jRLo252wd9OZ6DRtFuXN4eos/Qr6lAA9ZMMo4nJ
+Pn9WrQdmGJ9W8pgPnW+mDd4k6NL9q2lpiHOw/qqqZDWgkcYDG9hzel9/0n5Io7TS
+YnY6hzG7Nn7ZSief5Tgz2awj0DnGCuk0/DCGdQIDAQABAoIBAGjKc7L94+SHRdTJ
+FtILacCJrCZW0W6dKulIajbnYzV+QWMlnzTiEyha31ciBw5My54u8rqt5z7Ioj60
+yK+6OkfaTXhgMsuGv/iAz29VE4q7/fow+7XEKHTHLhiLJAB3hb42u1t6TzFTs1Vl
+3pPa8wEIQsPOVuENzT1mYGoST7PW+LBIMr9ScMnRHfC0MNdV/ntQiXideOAd5PkA
+4O7fNgYZ8CTAZ8rOLYTMFF76/c/jLiqfeghqbIhqMykk36kd7Lud//FRykVsn1aJ
+REUva/SjVEth5kITot1hpMC4SIElWpha2YxiiZFoSXSaUbtHpymiUGV01cYtMWk0
+MZ5HN3ECgYEA/74U8DpwPxd4up9syKyNqOqrCrYnhEEC/tdU/W5wECi4y5kppjdd
+88lZzICVPzk2fezYXlCO9HiSHU1UfcEsY3u16qNCvylK7Qz1OqXV/Ncj59891Q5Z
+K0UBcbnrv+YD6muZuhlHEbyDPqYO091G9Gf/BbL5JIBDzg1qFO9Dh9cCgYEA9Drt
+O9PJ5Sjz3mXQVtVHpwyhOVnd7CUv8a1zkUQCK5uQeaiF5kal1FIo7pLOr3KAvG0C
+pXbm/TobwlfAfcERQN88aPN8Z/l1CB0oKV6ipBMD2/XLzDRtx8lpTeh/BB8jIhrz
++FDJY54HCzLfW0P5kT+Cyw51ofjziPnFdO/Z6pMCgYEAon17gEchGnUnWCwDSl2Y
+hELV+jBSW02TQag/b+bDfQDiqTnfpKR5JXRBghYQveL0JH5f200EB4C0FboUfPJH
+6c2ogDTLK/poiMU66tCDbeqj/adx+fTr4votOL0QdRUIV+GWAxAcf8BvA1cvBJ4L
+fy60ckKM2gxFCJ6tUC/VkHECgYBoMDNAUItSnXPbrmeAg5/7naGxy6qmsP6RBUPF
+9tNOMyEhJUlqAT2BJEOd8zcFFb3hpEd6uwyzfnSVJcZSX2iy2gj1ZNnvqTXJ7lZR
+v7N2dz4wOd1lEgC7OCsaN1LoOThNtl3Z0uz2+FVc66jpUEhJNGThpxt7q66JArS/
+vAqkzQKBgFkzqA6QpnH5KhOCoZcuLQ4MtvnNHOx1xSm2B0gKDVJzGkHexTmOJvwM
+ZhHXRl9txS4icejS+AGUXNBzCWEusfhDaZpZqS6zt6UxEjMsLj/Te7z++2KQn4t/
+aI77jClydW1pJvICtqm5v+sukVZvQTTJza9ujta6fj7u2s671np9
+-----END RSA PRIVATE KEY-----
diff --git a/controllers/nginx/lua/vendor/lua-resty-http/util/lua-releng b/controllers/nginx/rootfs/etc/nginx/lua/vendor/lua-resty-http/util/lua-releng
similarity index 100%
rename from controllers/nginx/lua/vendor/lua-resty-http/util/lua-releng
rename to controllers/nginx/rootfs/etc/nginx/lua/vendor/lua-resty-http/util/lua-releng
diff --git a/controllers/nginx/default.conf b/controllers/nginx/rootfs/etc/nginx/nginx.conf
similarity index 100%
rename from controllers/nginx/default.conf
rename to controllers/nginx/rootfs/etc/nginx/nginx.conf
diff --git a/controllers/nginx/nginx.tmpl b/controllers/nginx/rootfs/etc/nginx/template/nginx.tmpl
similarity index 60%
rename from controllers/nginx/nginx.tmpl
rename to controllers/nginx/rootfs/etc/nginx/template/nginx.tmpl
index 065560136d..906afd370c 100644
--- a/controllers/nginx/nginx.tmpl
+++ b/controllers/nginx/rootfs/etc/nginx/template/nginx.tmpl
@@ -1,29 +1,25 @@
-{{ $cfg := .cfg }}
+{{ $cfg := .Cfg }}{{ $healthzURI := .HealthzURI }}{{ $backends := .Backends }}
daemon off;
-worker_processes {{ $cfg.workerProcesses }};
-
+worker_processes {{ $cfg.WorkerProcesses }};
pid /run/nginx.pid;
-
worker_rlimit_nofile 131072;
-pcre_jit on;
-
events {
multi_accept on;
- worker_connections {{ $cfg.maxWorkerConnections }};
+ worker_connections {{ $cfg.MaxWorkerConnections }};
use epoll;
}
http {
{{/* we use the value of the header X-Forwarded-For to be able to use the geo_ip module */}}
- {{ if $cfg.useProxyProtocol -}}
- set_real_ip_from {{ $cfg.proxyRealIpCidr }};
+ {{ if $cfg.UseProxyProtocol }}
+ set_real_ip_from {{ $cfg.ProxyRealIpCidr }};
real_ip_header proxy_protocol;
{{ else }}
real_ip_header X-Forwarded-For;
set_real_ip_from 0.0.0.0/0;
- {{ end -}}
+ {{ end }}
real_ip_recursive on;
@@ -34,10 +30,10 @@ http {
geoip_city /etc/nginx/GeoLiteCity.dat;
geoip_proxy_recursive on;
- {{- if $cfg.enableVtsStatus }}
- vhost_traffic_status_zone shared:vhost_traffic_status:{{ $cfg.vtsStatusZoneSize }};
+ {{ if $cfg.EnableVtsStatus }}
+ vhost_traffic_status_zone shared:vhost_traffic_status:{{ $cfg.VtsStatusZoneSize }};
vhost_traffic_status_filter_by_set_key $geoip_country_code country::*;
- {{ end -}}
+ {{ end }}
# lua section to return proper error codes when custom pages are used
lua_package_path '.?.lua;./etc/nginx/lua/?.lua;/etc/nginx/lua/vendor/lua-resty-http/lib/?.lua;';
@@ -54,43 +50,43 @@ http {
reset_timedout_connection on;
- keepalive_timeout {{ $cfg.keepAlive }}s;
+ keepalive_timeout {{ $cfg.KeepAlive }}s;
- types_hash_max_size 2048;
- server_names_hash_max_size {{ $cfg.serverNameHashMaxSize }};
- server_names_hash_bucket_size {{ $cfg.serverNameHashBucketSize }};
- map_hash_bucket_size {{ $cfg.mapHashBucketSize }};
+ types_hash_max_size 2048;
+ server_names_hash_max_size {{ $cfg.ServerNameHashMaxSize }};
+ server_names_hash_bucket_size {{ $cfg.ServerNameHashBucketSize }};
+ map_hash_bucket_size {{ $cfg.MapHashBucketSize }};
include /etc/nginx/mime.types;
default_type text/html;
- {{ if $cfg.useGzip -}}
+ {{ if $cfg.UseGzip }}
gzip on;
gzip_comp_level 5;
gzip_http_version 1.1;
gzip_min_length 256;
- gzip_types {{ $cfg.gzipTypes }};
+ gzip_types {{ $cfg.GzipTypes }};
gzip_proxied any;
- {{- end }}
+ {{ end }}
- client_max_body_size "{{ $cfg.bodySize }}";
+ client_max_body_size "{{ $cfg.BodySize }}";
- log_format upstreaminfo '{{ if $cfg.useProxyProtocol }}$proxy_protocol_addr{{ else }}$remote_addr{{ end }} $host '
- '[$proxy_add_x_forwarded_for] $server_port $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" '
+ log_format upstreaminfo '{{ if $cfg.UseProxyProtocol }}$proxy_protocol_addr{{ else }}$remote_addr{{ end }} - '
+ '[$proxy_add_x_forwarded_for] - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" '
'$request_length $request_time [$proxy_upstream_name] $upstream_addr $upstream_response_length $upstream_response_time $upstream_status';
{{/* map urls that should not appear in access.log */}}
{{/* http://nginx.org/en/docs/http/ngx_http_log_module.html#access_log */}}
map $request $loggable {
- {{- range $reqUri := $cfg.skipAccessLogUrls }}
+ {{ range $reqUri := $cfg.SkipAccessLogURLs }}
{{ $reqUri }} 0;{{ end }}
default 1;
}
access_log /var/log/nginx/access.log upstreaminfo if=$loggable;
- error_log /var/log/nginx/error.log {{ $cfg.errorLogLevel }};
+ error_log /var/log/nginx/error.log {{ $cfg.ErrorLogLevel }};
- {{ if not (empty .defResolver) }}# Custom dns resolver.
- resolver {{ .defResolver }} valid=30s;
+ {{ if not (empty $cfg.Resolver) }}# Custom dns resolver.
+ resolver {{ $cfg.Resolver }} valid=30s;
resolver_timeout 10s;
{{ end }}
@@ -102,14 +98,14 @@ http {
{{/* normal nginx behavior we have to use this approach. */}}
# Retain the default nginx handling of requests without a "Connection" header
map $http_upgrade $connection_upgrade {
- default upgrade;
- '' close;
+ default upgrade;
+ '' close;
}
# trust http_x_forwarded_proto headers correctly indicate ssl offloading
map $http_x_forwarded_proto $pass_access_scheme {
- default $http_x_forwarded_proto;
- '' $scheme;
+ default $http_x_forwarded_proto;
+ '' $scheme;
}
# Map a response error watching the header Content-Type
@@ -128,139 +124,148 @@ http {
}
server_name_in_redirect off;
- port_in_redirect off;
+ port_in_redirect off;
- ssl_protocols {{ $cfg.sslProtocols }};
+ ssl_protocols {{ $cfg.SSLProtocols }};
# turn on session caching to drastically improve performance
- {{ if $cfg.sslSessionCache }}
- ssl_session_cache builtin:1000 shared:SSL:{{ $cfg.sslSessionCacheSize }};
- ssl_session_timeout {{ $cfg.sslSessionTimeout }};
+ {{ if $cfg.SSLSessionCache }}
+ ssl_session_cache builtin:1000 shared:SSL:{{ $cfg.SSLSessionCacheSize }};
+ ssl_session_timeout {{ $cfg.SSLSessionTimeout }};
{{ end }}
# allow configuring ssl session tickets
- ssl_session_tickets {{ if $cfg.sslSessionTickets }}on{{ else }}off{{ end }};
+ ssl_session_tickets {{ if $cfg.SSLSessionTickets }}on{{ else }}off{{ end }};
# slightly reduce the time-to-first-byte
- ssl_buffer_size {{ $cfg.sslBufferSize }};
+ ssl_buffer_size {{ $cfg.SSLBufferSize }};
- {{ if not (empty $cfg.sslCiphers) }}
+ {{ if not (empty $cfg.SSLCiphers) }}
# allow configuring custom ssl ciphers
- ssl_ciphers '{{ $cfg.sslCiphers }}';
+ ssl_ciphers '{{ $cfg.SSLCiphers }}';
ssl_prefer_server_ciphers on;
{{ end }}
- {{ if not (empty .sslDHParam) }}
+ {{ if not (empty $cfg.SSLDHParam) }}
# allow custom DH file http://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_dhparam
- ssl_dhparam {{ .sslDHParam }};
+ ssl_dhparam {{ $cfg.SSLDHParam }};
{{ end }}
- {{- if not $cfg.enableDynamicTlsRecords }}
+ {{ if not $cfg.EnableDynamicTLSRecords }}
ssl_dyn_rec_size_lo 0;
{{ end }}
- {{- if .customErrors }}
+ {{ if .CustomErrors }}
# Custom error pages
proxy_intercept_errors on;
{{ end }}
- {{- range $errCode := $cfg.customHttpErrors }}
+ {{ range $errCode := $cfg.CustomHTTPErrors }}
error_page {{ $errCode }} = @custom_{{ $errCode }};{{ end }}
# In case of errors try the next upstream server before returning an error
- proxy_next_upstream error timeout invalid_header http_502 http_503 http_504{{ if $cfg.retryNonIdempotent }} non_idempotent{{ end }};
+ proxy_next_upstream error timeout invalid_header http_502 http_503 http_504{{ if $cfg.RetryNonIdempotent }} non_idempotent{{ end }};
- {{range $name, $upstream := .upstreams}}
+ {{range $name, $upstream := $backends}}
upstream {{$upstream.Name}} {
- {{ if $cfg.enableStickySessions -}}
+ {{ if $cfg.EnableStickySessions }}
sticky hash=sha1 httponly;
- {{ else -}}
+ {{ else }}
least_conn;
- {{- end }}
- {{ range $server := $upstream.Backends }}server {{ $server.Address }}:{{ $server.Port }} max_fails={{ $server.MaxFails }} fail_timeout={{ $server.FailTimeout }};
+ {{ end }}
+ {{ range $server := $upstream.Endpoints }}server {{ $server.Address }}:{{ $server.Port }} max_fails={{ $server.MaxFails }} fail_timeout={{ $server.FailTimeout }};
{{ end }}
}
{{ end }}
{{/* build all the required rate limit zones. Each annotation requires a dedicated zone */}}
{{/* 1MB -> 16 thousand 64-byte states or about 8 thousand 128-byte states */}}
- {{- range $zone := (buildRateLimitZones .servers) }}
+ {{ range $zone := (buildRateLimitZones .Servers) }}
{{ $zone }}
{{ end }}
- {{ range $server := .servers }}
+ {{ range $server := .Servers }}
server {
- server_name {{ $server.Name }};
- listen 80{{ if $cfg.useProxyProtocol }} proxy_protocol{{ end }};
- {{ if $server.SSL }}listen 443 {{ if $cfg.useProxyProtocol }}proxy_protocol{{ end }} ssl {{ if $cfg.enableSpdy }}spdy{{ end }} {{ if $cfg.useHttp2 }}http2{{ end }};
+ server_name {{ $server.Hostname }};
+ listen 80{{ if $cfg.UseProxyProtocol }} proxy_protocol{{ end }};
+ {{ if not (empty $server.SSLCertificate) }}listen 442 {{ if $cfg.UseProxyProtocol }}proxy_protocol{{ end }} ssl {{ if $cfg.UseHTTP2 }}http2{{ end }};
{{/* comment PEM sha is required to detect changes in the generated configuration and force a reload */}}
# PEM sha: {{ $server.SSLPemChecksum }}
- ssl_certificate {{ $server.SSLCertificate }};
- ssl_certificate_key {{ $server.SSLCertificateKey }};
- {{- end }}
-
- {{- if (and $server.SSL $cfg.hsts) }}
- more_set_headers "Strict-Transport-Security: max-age={{ $cfg.hstsMaxAge }}{{ if $cfg.hstsIncludeSubdomains }}; includeSubDomains{{ end }}; preload";
- {{- end }}
+ ssl_certificate {{ $server.SSLCertificate }};
+ ssl_certificate_key {{ $server.SSLCertificate }};
+ {{ end }}
+
+ {{ if (and (not (empty $server.SSLCertificate)) $cfg.HSTS) }}
+ more_set_headers "Strict-Transport-Security: max-age={{ $cfg.HSTSMaxAge }}{{ if $cfg.HSTSIncludeSubdomains }}; includeSubDomains{{ end }}; preload";
+ {{ end }}
- {{ if $cfg.enableVtsStatus }}vhost_traffic_status_filter_by_set_key $geoip_country_code country::$server_name;{{ end -}}
+ {{ if $cfg.EnableVtsStatus }}vhost_traffic_status_filter_by_set_key $geoip_country_code country::$server_name;{{ end }}
- {{- range $location := $server.Locations }}
+ {{ range $location := $server.Locations }}
{{ $path := buildLocation $location }}
{{ $authPath := buildAuthLocation $location }}
- {{- if not (empty $authPath) }}
+
+ {{ if not (empty $location.CertificateAuth.CertFileName) }}
+ # PEM sha: {{ $location.CertificateAuth.PemSHA }}
+ ssl_client_certificate {{ $location.CertificateAuth.CAFileName }};
+ ssl_verify_client on;
+ {{ end }}
+
+ {{ if not (empty $authPath) }}
location = {{ $authPath }} {
internal;
- {{ if not $location.ExternalAuthURL.SendBody }}
+ {{ if not $location.ExternalAuth.SendBody }}
proxy_pass_request_body off;
proxy_set_header Content-Length "";
- {{ end -}}
- {{ if not (empty $location.ExternalAuthURL.Method) }}
- proxy_method {{ $location.ExternalAuthURL.Method }};
- {{ end -}}
+ {{ end }}
+ {{ if not (empty $location.ExternalAuth.Method) }}
+ proxy_method {{ $location.ExternalAuth.Method }};
+ {{ end }}
proxy_set_header Host $host;
proxy_pass_request_headers on;
- proxy_pass {{ $location.ExternalAuthURL.URL }};
+ set $target {{ $location.ExternalAuth.URL }};
+ proxy_pass $target;
}
{{ end }}
+
location {{ $path }} {
- {{- if gt (len $location.Whitelist.CIDR) 0 }}
- {{- range $ip := $location.Whitelist.CIDR }}
+ {{ if gt (len $location.Whitelist.CIDR) 0 }}
+ {{ range $ip := $location.Whitelist.CIDR }}
allow {{ $ip }};{{ end }}
deny all;
- {{ end -}}
- {{- if not (empty $authPath) }}
+ {{ end }}
+
+ {{ if not (empty $authPath) }}
# this location requires authentication
auth_request {{ $authPath }};
- {{ end -}}
-
- {{- if (and $server.SSL $location.Redirect.SSLRedirect) }}
+ {{ end }}
+
+ {{ if (and (not (empty $server.SSLCertificate)) $location.Redirect.SSLRedirect) }}
# enforce ssl on server side
if ($scheme = http) {
return 301 https://$host$request_uri;
}
- {{ end -}}
+ {{ end }}
{{/* if the location contains a rate limit annotation, create one */}}
{{ $limits := buildRateLimit $location }}
- {{- range $limit := $limits }}
+ {{ range $limit := $limits }}
{{ $limit }}{{ end }}
-
- {{- if $location.Auth.Secured }}
- {{- if eq $location.Auth.Type "basic" }}
- auth_basic "{{ $location.Auth.Realm }}";
- auth_basic_user_file {{ $location.Auth.File }};
+
+ {{ if $location.BasicDigestAuth.Secured }}
+ {{ if eq $location.BasicDigestAuth.Type "basic" }}
+ auth_basic "{{ $location.BasicDigestAuth.Realm }}";
+ auth_basic_user_file {{ $location.BasicDigestAuth.File }};
{{ else }}
- #TODO: add nginx-http-auth-digest module
- auth_digest "{{ $location.Auth.Realm }}";
- auth_digest_user_file {{ $location.Auth.File }};
- {{ end -}}
+ auth_digest "{{ $location.BasicDigestAuth.Realm }}";
+ auth_digest_user_file {{ $location.BasicDigestAuth.File }};
+ {{ end }}
proxy_set_header Authorization "";
- {{ end -}}
-
- {{- if $location.EnableCORS }}
+ {{ end }}
+
+ {{ if $location.EnableCORS }}
{{ template "CORS" }}
- {{ end -}}
-
+ {{ end }}
+
proxy_set_header Host $host;
# Pass Real IP
@@ -279,29 +284,29 @@ http {
# https://www.nginx.com/blog/mitigating-the-httpoxy-vulnerability-with-nginx/
proxy_set_header Proxy "";
- proxy_connect_timeout {{ $cfg.proxyConnectTimeout }}s;
- proxy_send_timeout {{ $cfg.proxySendTimeout }}s;
- proxy_read_timeout {{ $cfg.proxyReadTimeout }}s;
+ proxy_connect_timeout {{ $location.Proxy.ConnectTimeout }}s;
+ proxy_send_timeout {{ $location.Proxy.SendTimeout }}s;
+ proxy_read_timeout {{ $location.Proxy.ReadTimeout }}s;
proxy_redirect off;
proxy_buffering off;
- proxy_buffer_size {{ $cfg.proxyBufferSize }};
+ proxy_buffer_size "{{ $location.Proxy.BufferSize }}";
proxy_http_version 1.1;
{{/* rewrite only works if the content is not compressed */}}
- {{- if $location.Redirect.AddBaseURL }}
+ {{ if $location.Redirect.AddBaseURL }}
proxy_set_header Accept-Encoding "";
- {{ end -}}
+ {{ end }}
- set $proxy_upstream_name "{{ $location.Upstream.Name }}";
- {{ buildProxyPass $location }}
+ set $proxy_upstream_name "{{ $location.Backend }}";
+ {{ buildProxyPass $backends $location }}
}
{{ end }}
-
- {{- if eq $server.Name "_" }}
+
+ {{ if eq $server.Hostname "_" }}
# health checks in cloud providers require the use of port 80
- location {{ $cfg.HealthzURL }} {
+ location {{ $healthzURI }} {
access_log off;
return 200;
}
@@ -315,38 +320,40 @@ http {
access_log off;
stub_status on;
}
- {{ end -}}
+ {{ end }}
+
{{ template "CUSTOM_ERRORS" $cfg }}
}
+
{{ end }}
-
+
# default server, used for NGINX healthcheck and access to nginx stats
server {
# Use the port 18080 (random value just to avoid known ports) as default port for nginx.
# Changing this value requires a change in:
# https://github.com/kubernetes/contrib/blob/master/ingress/controllers/nginx/nginx/command.go#L104
- listen 18080 default_server reuseport backlog={{ .backlogSize }};
+ listen 18080 default_server reuseport backlog={{ .BacklogSize }};
- location /healthz {
+ location {{ $healthzURI }} {
access_log off;
return 200;
}
location /nginx_status {
- {{ if $cfg.enableVtsStatus -}}
+ {{ if $cfg.EnableVtsStatus }}
vhost_traffic_status_display;
vhost_traffic_status_display_format html;
{{ else }}
access_log off;
stub_status on;
- {{- end }}
+ {{ end }}
}
location / {
set $proxy_upstream_name "upstream-default-backend";
proxy_pass http://upstream-default-backend;
}
- {{- template "CUSTOM_ERRORS" $cfg }}
+ {{ template "CUSTOM_ERRORS" $cfg }}
}
# default server for services without endpoints
@@ -355,7 +362,7 @@ http {
set $proxy_upstream_name "-";
location / {
- {{ if .customErrors }}
+ {{ if .CustomErrors }}
content_by_lua_block {
openURL(503)
}
@@ -367,40 +374,39 @@ http {
}
stream {
-# TCP services
-{{ range $i, $tcpServer := .tcpUpstreams }}
- upstream tcp-{{ $tcpServer.Upstream.Name }} {
- {{ range $server := $tcpServer.Upstream.Backends }}server {{ $server.Address }}:{{ $server.Port }};
+ # map FQDN that requires SSL passthrough
+ map $ssl_preread_server_name $stream_upstream {
+ {{ range $i, $passthrough := .PassthrougBackends }}
+ {{ $passthrough.Hostname }} {{ $passthrough.Backend }};
{{ end }}
+ # send SSL traffic to this nginx in a different port
+ default nginx-ssl-backend;
}
- server {
- listen {{ $tcpServer.Path }};
- proxy_connect_timeout {{ $cfg.proxyConnectTimeout }};
- proxy_timeout {{ $cfg.proxyReadTimeout }};
- proxy_pass tcp-{{ $tcpServer.Upstream.Name }};
- }
-{{ end }}
+ log_format log_stream '$remote_addr [$time_local] $protocol [$ssl_preread_server_name] [$stream_upstream] $status $bytes_sent $bytes_received $session_time';
-# UDP services
-{{ range $i, $udpServer := .udpUpstreams }}
- upstream udp-{{ $udpServer.Upstream.Name }} {
- {{ range $server := $udpServer.Upstream.Backends }}server {{ $server.Address }}:{{ $server.Port }};
- {{ end }}
+ access_log /var/log/nginx/access.log log_stream;
+ error_log /var/log/nginx/error.log;
+
+ # configure default backend for SSL
+ upstream nginx-ssl-backend {
+ server 127.0.0.1:442;
}
+ {{ buildSSPassthroughUpstreams $backends .PassthrougBackends }}
+
server {
- listen {{ $udpServer.Path }} udp;
- proxy_timeout 10s;
- proxy_responses 1;
- proxy_pass udp-{{ $udpServer.Upstream.Name }};
+ listen 443;
+ {{ if $cfg.UseProxyProtocol }}proxy_protocol on;{{ end }}
+ proxy_pass $stream_upstream;
+ ssl_preread on;
}
-{{ end }}
+
}
{{/* definition of templates to avoid repetitions */}}
{{ define "CUSTOM_ERRORS" }}
- {{ range $errCode := .customHttpErrors }}
+ {{ range $errCode := .CustomHTTPErrors }}
location @custom_{{ $errCode }} {
internal;
content_by_lua_block {
diff --git a/controllers/nginx/rootfs/ingress-controller/clean-nginx-conf.sh b/controllers/nginx/rootfs/ingress-controller/clean-nginx-conf.sh
new file mode 100755
index 0000000000..53662152fc
--- /dev/null
+++ b/controllers/nginx/rootfs/ingress-controller/clean-nginx-conf.sh
@@ -0,0 +1,8 @@
+#!/bin/bash
+
+# This script removes consecutive empty lines in nginx.conf
+# Using sed is more simple than using a go regex
+
+# first sed removes empty lines
+# second sed command replaces the empty lines
+sed -e 's/^ *$/\'$'\n/g' | sed -e '/^$/{N;/^\n$/d;}'
diff --git a/controllers/nginx/test/data/config.json b/controllers/nginx/test/data/config.json
new file mode 100644
index 0000000000..8f08819787
--- /dev/null
+++ b/controllers/nginx/test/data/config.json
@@ -0,0 +1,57259 @@
+{
+ "backlogSize": 32768,
+ "cfg": {
+ "backend": {
+ "custom-http-errors": [404],
+ "proxy-buffer-size": "4k",
+ "proxy-connect-timeout": 5,
+ "proxy-read-timeout": 60,
+ "proxy-send-timeout": 60,
+ "resolver": "",
+ "skip-access-log-urls": ["~*health-check", "~*info"],
+ "ssl-redirect": true,
+ "upstream-fail-timeout": 0,
+ "upstream-max-fails": 0,
+ "whitelist-source-range": null
+ },
+ "bodySize": "1m",
+ "enableDynamicTlsRecords": true,
+ "enableSpdy": false,
+ "enableVtsStatus": true,
+ "errorLogLevel": "notice",
+ "gzipTypes": "application/atom+xml application/javascript application/x-javascript application/json application/rss+xml application/vnd.ms-fontobject application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/svg+xml image/x-icon text/css text/plain text/x-component",
+ "hsts": true,
+ "hstsIncludeSubdomains": true,
+ "hstsMaxAge": "15724800",
+ "keepAlive": 75,
+ "mapHashBucketSize": 64,
+ "maxWorkerConnections": 16384,
+ "proxyRealIpCidr": "0.0.0.0/0",
+ "retryNonIdempotent": false,
+ "serverNameHashBucketSize": 64,
+ "serverNameHashMaxSize": 16384,
+ "sslBufferSize": "4k",
+ "sslCiphers": "ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA",
+ "sslProtocols": "TLSv1 TLSv1.1 TLSv1.2",
+ "sslSessionCache": true,
+ "sslSessionCacheSize": "10m",
+ "sslSessionTickets": true,
+ "sslSessionTimeout": "10m",
+ "useGzip": true,
+ "useHttp2": true,
+ "vtsStatusZoneSize": "10m",
+ "workerProcesses": 1
+ },
+ "customErrors": true,
+ "defResolver": "",
+ "healthzURI": "/healthz",
+ "passthrougBackends": [{
+ "namespace": "default-kubernetes-443",
+ "hostname": "foo-898.bar.com"
+ }, {
+ "namespace": "default-echoheaders-x-80",
+ "hostname": "foo-997.bar.com"
+ }, {
+ "namespace": "default-kubernetes-443",
+ "hostname": "kubernetes.foo-bar.com"
+ }],
+ "servers": [{
+ "hostname": "_",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/testpath",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": true
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }, {
+ "path": "/",
+ "isDefBackend": true,
+ "backend": "upstream-default-backend",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": null
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "bar.baz.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/foo",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }, {
+ "path": "/bar",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-y-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }, {
+ "path": "/",
+ "isDefBackend": true,
+ "backend": "upstream-default-backend",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": null
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "default-backend.sample.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": true,
+ "backend": "default-echoheaders-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": null
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "external-auth-01.sample.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "https://httpbin.org/basic-auth/user/passwd",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": true
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-1.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-10.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-100.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-1000.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-101.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-102.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-103.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-104.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-105.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-106.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-107.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-108.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-109.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-11.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-110.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-111.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-112.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-113.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-114.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-115.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-116.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-117.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-118.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-119.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-12.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-120.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-121.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-122.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-123.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-124.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-125.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-126.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-127.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-128.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-129.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-13.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-130.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-131.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-132.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-133.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-134.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-135.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-136.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-137.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-138.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-139.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-14.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-140.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-141.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-142.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-143.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-144.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-145.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-146.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-147.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-148.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-149.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-15.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-150.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-151.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-152.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-153.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-154.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-155.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-156.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-157.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-158.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-159.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-16.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-160.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-161.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-162.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-163.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-164.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-165.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-166.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-167.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-168.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-169.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-17.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-170.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-171.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-172.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-173.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-174.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-175.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-176.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-177.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-178.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-179.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-18.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-180.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-181.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-182.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-183.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-184.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-185.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-186.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-187.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-188.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-189.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-19.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-190.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-191.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-192.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-193.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-194.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-195.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-196.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-197.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-198.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-199.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-2.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-20.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-200.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-201.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-202.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-203.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-204.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-205.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-206.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-207.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-208.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-209.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-21.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-210.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-211.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-212.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-213.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-214.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-215.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-216.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-217.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-218.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-219.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-22.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-220.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-221.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-222.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-223.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-224.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-225.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-226.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-227.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-228.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-229.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-23.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-230.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-231.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-232.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-233.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-234.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-235.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-236.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-237.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-238.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-239.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-24.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-240.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-241.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-242.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-243.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-244.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-245.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-246.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-247.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-248.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-249.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-25.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-250.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-251.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-252.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-253.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-254.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-255.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-256.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-257.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-258.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-259.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-26.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-260.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-261.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-262.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-263.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-264.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-265.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-266.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-267.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-268.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-269.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-27.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-270.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-271.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-272.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-273.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-274.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-275.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-276.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-277.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-278.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-279.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-28.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-280.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-281.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-282.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-283.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-284.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-285.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-286.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-287.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-288.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-289.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-29.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-290.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-291.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-292.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-293.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-294.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-295.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-296.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-297.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-298.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-299.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-3.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-30.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-300.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-301.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-302.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-303.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-304.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-305.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-306.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-307.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-308.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-309.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-31.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-310.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-311.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-312.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-313.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-314.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-315.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-316.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-317.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-318.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-319.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-32.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-320.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-321.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-322.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-323.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-324.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-325.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-326.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-327.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-328.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-329.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-33.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-330.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-331.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-332.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-333.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-334.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-335.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-336.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-337.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-338.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-339.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-34.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-340.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-341.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-342.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-343.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-344.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-345.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-346.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-347.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-348.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-349.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-35.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-350.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-351.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-352.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-353.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-354.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-355.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-356.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-357.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-358.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-359.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-36.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-360.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-361.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-362.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-363.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-364.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-365.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-366.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-367.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-368.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-369.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-37.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-370.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-371.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-372.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-373.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-374.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-375.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-376.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-377.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-378.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-379.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-38.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-380.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-381.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-382.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-383.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-384.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-385.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-386.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-387.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-388.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-389.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-39.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-390.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-391.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-392.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-393.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-394.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-395.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-396.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-397.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-398.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-399.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-4.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-40.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-400.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-401.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-402.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-403.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-404.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-405.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-406.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-407.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-408.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-409.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-41.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-410.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-411.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-412.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-413.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-414.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-415.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-416.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-417.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-418.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-419.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-42.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-420.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-421.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-422.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-423.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-424.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-425.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-426.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-427.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-428.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-429.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-43.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-430.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-431.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-432.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-433.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-434.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-435.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-436.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-437.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-438.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-439.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-44.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-440.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-441.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-442.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-443.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-444.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-445.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-446.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-447.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-448.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-449.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-45.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-450.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-451.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-452.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-453.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-454.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-455.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-456.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-457.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-458.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-459.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-46.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-460.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-461.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-462.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-463.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-464.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-465.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-466.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-467.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-468.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-469.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-47.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-470.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-471.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-472.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-473.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-474.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-475.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-476.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-477.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-478.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-479.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-48.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-480.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-481.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-482.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-483.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-484.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-485.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-486.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-487.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-488.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-489.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-49.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-490.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-491.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-492.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-493.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-494.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-495.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-496.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-497.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-498.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-499.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-5.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-50.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-500.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-501.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-502.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-503.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-504.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-505.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-506.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-507.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-508.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-509.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-51.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-510.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-511.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-512.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-513.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-514.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-515.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-516.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-517.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-518.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-519.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-52.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-520.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-521.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-522.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-523.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-524.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-525.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-526.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-527.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-528.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-529.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-53.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-530.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-531.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-532.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-533.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-534.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-535.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-536.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-537.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-538.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-539.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-54.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-540.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-541.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-542.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-543.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-544.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-545.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-546.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-547.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-548.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-549.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-55.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-550.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-551.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-552.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-553.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-554.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-555.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-556.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-557.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-558.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-559.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-56.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-560.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-561.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-562.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-563.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-564.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-565.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-566.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-567.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-568.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-569.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-57.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-570.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-571.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-572.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-573.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-574.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-575.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-576.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-577.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-578.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-579.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-58.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-580.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-581.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-582.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-583.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-584.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-585.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-586.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-587.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-588.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-589.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-59.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-590.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-591.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-592.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-593.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-594.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-595.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-596.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-597.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-598.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-599.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-6.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-60.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-600.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-601.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-602.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-603.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-604.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-605.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-606.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-607.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-608.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-609.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-61.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-610.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-611.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-612.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-613.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-614.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-615.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-616.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-617.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-618.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-619.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-62.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-620.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-621.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-622.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-623.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-624.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-625.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-626.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-627.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-628.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-629.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-63.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-630.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-631.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-632.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-633.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-634.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-635.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-636.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-637.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-638.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-639.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-64.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-640.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-641.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-642.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-643.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-644.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-645.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-646.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-647.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-648.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-649.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-65.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-650.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-651.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-652.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-653.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-654.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-655.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-656.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-657.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-658.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-659.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-66.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-660.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-661.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-662.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-663.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-664.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-665.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-666.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-667.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-668.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-669.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-67.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-670.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-671.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-672.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-673.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-674.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-675.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-676.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-677.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-678.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-679.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-68.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-680.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-681.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-682.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-683.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-684.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-685.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-686.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-687.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-688.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-689.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-69.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-690.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-691.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-692.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-693.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-694.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-695.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-696.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-697.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-698.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-699.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-7.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-70.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-700.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-701.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-702.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-703.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-704.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-705.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-706.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-707.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-708.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-709.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-71.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-710.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-711.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-712.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-713.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-714.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-715.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-716.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-717.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-718.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-719.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-72.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-720.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-721.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-722.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-723.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-724.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-725.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-726.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-727.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-728.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-729.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-73.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-730.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-731.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-732.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-733.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-734.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-735.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-736.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-737.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-738.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-739.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-74.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-740.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-741.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-742.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-743.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-744.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-745.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-746.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-747.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-748.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-749.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-75.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-750.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-751.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-752.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-753.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-754.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-755.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-756.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-757.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-758.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-759.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-76.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-760.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-761.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-762.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-763.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-764.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-765.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-766.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-767.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-768.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-769.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-77.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-770.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-771.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-772.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-773.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-774.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-775.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-776.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-777.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-778.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-779.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-78.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-780.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-781.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-782.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-783.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-784.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-785.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-786.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-787.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-788.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-789.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-79.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-790.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-791.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-792.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-793.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-794.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-795.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-796.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-797.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-798.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-799.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-8.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-80.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-800.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-801.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-802.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-803.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-804.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-805.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-806.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-807.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-808.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-809.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-81.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-810.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-811.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-812.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-813.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-814.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-815.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-816.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-817.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-818.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-819.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-82.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-820.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-821.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-822.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-823.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-824.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-825.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-826.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-827.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-828.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-829.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-83.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-830.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-831.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-832.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-833.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-834.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-835.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-836.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-837.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-838.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-839.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-84.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-840.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-841.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-842.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-843.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-844.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-845.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-846.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-847.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-848.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-849.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-85.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-850.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-851.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-852.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-853.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-854.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-855.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-856.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-857.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-858.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-859.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-86.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-860.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-861.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-862.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-863.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-864.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-865.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-866.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-867.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-868.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-869.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-87.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-870.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-871.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-872.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-873.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-874.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-875.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-876.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-877.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-878.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-879.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-88.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-880.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-881.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-882.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-883.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-884.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-885.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-886.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-887.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-888.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-889.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-89.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-890.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-891.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-892.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-893.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-894.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-895.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-896.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-897.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-898.bar.com",
+ "sslPassthrough": true,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-kubernetes-443",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": true
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-899.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-9.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-90.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-900.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-901.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-902.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-903.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-904.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-905.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-906.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-907.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-908.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-909.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-91.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-910.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-911.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-912.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-913.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-914.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-915.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-916.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-917.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-918.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-919.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-92.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-920.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-921.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-922.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-923.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-924.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-925.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-926.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-927.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-928.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-929.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-93.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-930.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-931.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-932.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-933.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-934.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-935.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-936.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-937.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-938.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-939.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-94.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-940.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-941.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-942.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-943.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-944.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-945.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-946.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-947.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-948.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-949.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-95.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-950.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-951.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-952.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-953.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-954.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-955.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-956.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-957.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-958.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-959.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-96.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-960.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-961.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-962.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-963.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-964.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-965.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-966.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-967.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-968.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-969.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-97.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-970.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-971.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-972.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-973.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-974.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-975.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-976.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-977.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-978.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-979.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-98.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-980.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-981.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-982.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-983.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-984.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-985.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-986.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-987.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-988.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-989.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-99.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-990.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-991.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-992.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": true
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "default/aledbf-ca-secret",
+ "certFilename": "/ingress-controller/ssl/default-aledbf-ca-secret.pem",
+ "keyFilename": "",
+ "caFilename": "/ingress-controller/ssl/ca-default-aledbf-ca-secret.pem",
+ "pemSha": "69d055bd017208111377c971ba5ee0987fecee65"
+ }
+ }]
+ }, {
+ "hostname": "foo-993.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-994.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-995.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-996.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-997.bar.com",
+ "sslPassthrough": true,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": true
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo-998.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "https://httpbin.org/basic-auth/user/passwd",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": true
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/foo",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }, {
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo2.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-xtp-echo-port",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": true
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foo3.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-xtp-echo-port",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "foos.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": true
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "jenkins.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/jenkins",
+ "isDefBackend": false,
+ "backend": "default-jenkins-8080",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "default_jenkins_conn",
+ "limit": 2,
+ "burst": 10,
+ "sharedSize": 5
+ },
+ "rps": {
+ "name": "default_jenkins_rps",
+ "limit": 0,
+ "burst": 10,
+ "sharedSize": 5
+ }
+ },
+ "redirect": {
+ "target": "/",
+ "addBaseUrl": true,
+ "sslRedirect": true
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }, {
+ "path": "/",
+ "isDefBackend": true,
+ "backend": "upstream-default-backend",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": null
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "kubernetes.foo-bar.com",
+ "sslPassthrough": true,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-kubernetes-443",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": true
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "no-root.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/api",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }, {
+ "path": "/",
+ "isDefBackend": true,
+ "backend": "upstream-default-backend",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": null
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "rewrite.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/something",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "/",
+ "addBaseUrl": false,
+ "sslRedirect": true
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }, {
+ "path": "/",
+ "isDefBackend": true,
+ "backend": "upstream-default-backend",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": null
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "whitelist.bar.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": true
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }, {
+ "hostname": "with-root.com",
+ "sslPassthrough": false,
+ "sslCertificate": "",
+ "sslPemChecksum": "",
+ "locations": [{
+ "path": "/",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-x-80",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": []
+ },
+ "proxy": {
+ "conectTimeout": 5,
+ "sendTimeout": 60,
+ "readTimeout": 60,
+ "bufferSize": "4k"
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }]
+ }],
+ "sslDHParam": "",
+ "tcpBackends": [{
+ "path": "2222",
+ "isDefBackend": false,
+ "backend": "default-echoheaders-2222",
+ "basicDigestAuth": {
+ "type": "",
+ "realm": "",
+ "file": "",
+ "secured": false
+ },
+ "externalAuth": {
+ "url": "",
+ "method": "",
+ "sendBody": false
+ },
+ "rateLimit": {
+ "connections": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ },
+ "rps": {
+ "name": "",
+ "limit": 0,
+ "burst": 0,
+ "sharedSize": 0
+ }
+ },
+ "redirect": {
+ "target": "",
+ "addBaseUrl": false,
+ "sslRedirect": false
+ },
+ "whitelist": {
+ "cidr": null
+ },
+ "proxy": {
+ "conectTimeout": 0,
+ "sendTimeout": 0,
+ "readTimeout": 0,
+ "bufferSize": ""
+ },
+ "certificateAuth": {
+ "secret": "",
+ "certFilename": "",
+ "keyFilename": "",
+ "caFilename": "",
+ "pemSha": ""
+ }
+ }],
+ "udpBackends": [],
+ "backends": [{
+ "name": "default-echoheaders-80",
+ "secure": false,
+ "endpoints": [{
+ "address": "10.2.3.2",
+ "port": "8080",
+ "maxFails": 0,
+ "failTimeout": 0
+ }, {
+ "address": "10.2.3.5",
+ "port": "8080",
+ "maxFails": 0,
+ "failTimeout": 0
+ }]
+ }, {
+ "name": "default-echoheaders-x-80",
+ "secure": false,
+ "endpoints": [{
+ "address": "10.2.3.4",
+ "port": "8080",
+ "maxFails": 0,
+ "failTimeout": 0
+ }]
+ }, {
+ "name": "default-echoheaders-xtp-echo-port",
+ "secure": false,
+ "endpoints": [{
+ "address": "127.0.0.1",
+ "port": "8181",
+ "maxFails": 0,
+ "failTimeout": 0
+ }]
+ }, {
+ "name": "default-echoheaders-y-80",
+ "secure": false,
+ "endpoints": [{
+ "address": "10.2.3.4",
+ "port": "8080",
+ "maxFails": 0,
+ "failTimeout": 0
+ }]
+ }, {
+ "name": "default-jenkins-8080",
+ "secure": false,
+ "endpoints": [{
+ "address": "127.0.0.1",
+ "port": "8181",
+ "maxFails": 0,
+ "failTimeout": 0
+ }]
+ }, {
+ "name": "default-kubernetes-443",
+ "secure": false,
+ "endpoints": [{
+ "address": "172.17.4.99",
+ "port": "443",
+ "maxFails": 0,
+ "failTimeout": 0
+ }]
+ }, {
+ "name": "upstream-default-backend",
+ "secure": false,
+ "endpoints": [{
+ "address": "10.2.3.11",
+ "port": "8080",
+ "maxFails": 0,
+ "failTimeout": 0
+ }]
+ }]
+}
\ No newline at end of file
diff --git a/controllers/nginx/utils.go b/controllers/nginx/utils.go
deleted file mode 100644
index 877837ed05..0000000000
--- a/controllers/nginx/utils.go
+++ /dev/null
@@ -1,301 +0,0 @@
-/*
-Copyright 2015 The Kubernetes Authors.
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-*/
-
-package main
-
-import (
- "fmt"
- "io/ioutil"
- "os"
- "strings"
- "time"
-
- "github.com/golang/glog"
-
- "k8s.io/kubernetes/pkg/api"
- apierrs "k8s.io/kubernetes/pkg/api/errors"
- "k8s.io/kubernetes/pkg/apis/extensions"
- "k8s.io/kubernetes/pkg/client/cache"
- "k8s.io/kubernetes/pkg/client/unversioned"
- "k8s.io/kubernetes/pkg/util/wait"
- "k8s.io/kubernetes/pkg/util/workqueue"
-)
-
-// StoreToIngressLister makes a Store that lists Ingress.
-type StoreToIngressLister struct {
- cache.Store
-}
-
-// StoreToSecretsLister makes a Store that lists Secrets.
-type StoreToSecretsLister struct {
- cache.Store
-}
-
-// StoreToConfigmapLister makes a Store that lists Configmap.
-type StoreToConfigmapLister struct {
- cache.Store
-}
-
-// taskQueue manages a work queue through an independent worker that
-// invokes the given sync function for every work item inserted.
-type taskQueue struct {
- // queue is the work queue the worker polls
- queue workqueue.RateLimitingInterface
- // sync is called for each item in the queue
- sync func(string) error
- // workerDone is closed when the worker exits
- workerDone chan struct{}
-}
-
-func (t *taskQueue) run(period time.Duration, stopCh <-chan struct{}) {
- wait.Until(t.worker, period, stopCh)
-}
-
-// enqueue enqueues ns/name of the given api object in the task queue.
-func (t *taskQueue) enqueue(obj interface{}) {
- key, err := keyFunc(obj)
- if err != nil {
- glog.Infof("could not get key for object %+v: %v", obj, err)
- return
- }
- t.queue.Add(key)
-}
-
-func (t *taskQueue) requeue(key string) {
- t.queue.AddRateLimited(key)
-}
-
-// worker processes work in the queue through sync.
-func (t *taskQueue) worker() {
- for {
- key, quit := t.queue.Get()
- if quit {
- close(t.workerDone)
- return
- }
- glog.V(3).Infof("syncing %v", key)
- if err := t.sync(key.(string)); err != nil {
- glog.Warningf("requeuing %v, err %v", key, err)
- t.requeue(key.(string))
- } else {
- t.queue.Forget(key)
- }
-
- t.queue.Done(key)
- }
-}
-
-// shutdown shuts down the work queue and waits for the worker to ACK
-func (t *taskQueue) shutdown() {
- t.queue.ShutDown()
- <-t.workerDone
-}
-
-// NewTaskQueue creates a new task queue with the given sync function.
-// The sync function is called for every element inserted into the queue.
-func NewTaskQueue(syncFn func(string) error) *taskQueue {
- return &taskQueue{
- queue: workqueue.NewRateLimitingQueue(workqueue.DefaultControllerRateLimiter()),
- sync: syncFn,
- workerDone: make(chan struct{}),
- }
-}
-
-// getPodDetails returns runtime information about the pod: name, namespace and IP of the node
-func getPodDetails(kubeClient *unversioned.Client) (*podInfo, error) {
- podName := os.Getenv("POD_NAME")
- podNs := os.Getenv("POD_NAMESPACE")
-
- if podName == "" && podNs == "" {
- return nil, fmt.Errorf("unable to get POD information (missing POD_NAME or POD_NAMESPACE environment variable")
- }
-
- err := waitForPodRunning(kubeClient, podNs, podName, time.Millisecond*200, time.Second*30)
- if err != nil {
- return nil, err
- }
-
- pod, _ := kubeClient.Pods(podNs).Get(podName)
- if pod == nil {
- return nil, fmt.Errorf("unable to get POD information")
- }
-
- node, err := kubeClient.Nodes().Get(pod.Spec.NodeName)
- if err != nil {
- return nil, err
- }
-
- var externalIP string
- for _, address := range node.Status.Addresses {
- if address.Type == api.NodeExternalIP {
- if address.Address != "" {
- externalIP = address.Address
- break
- }
- }
-
- if externalIP == "" && address.Type == api.NodeLegacyHostIP {
- externalIP = address.Address
- }
- }
-
- return &podInfo{
- PodName: podName,
- PodNamespace: podNs,
- NodeIP: externalIP,
- }, nil
-}
-
-func isValidService(kubeClient *unversioned.Client, name string) error {
- if name == "" {
- return fmt.Errorf("empty string is not a valid service name")
- }
-
- parts := strings.Split(name, "/")
- if len(parts) != 2 {
- return fmt.Errorf("invalid name format (namespace/name) in service '%v'", name)
- }
-
- _, err := kubeClient.Services(parts[0]).Get(parts[1])
- return err
-}
-
-func isHostValid(host string, cns []string) bool {
- for _, cn := range cns {
- if matchHostnames(cn, host) {
- return true
- }
- }
-
- return false
-}
-
-func matchHostnames(pattern, host string) bool {
- host = strings.TrimSuffix(host, ".")
- pattern = strings.TrimSuffix(pattern, ".")
-
- if len(pattern) == 0 || len(host) == 0 {
- return false
- }
-
- patternParts := strings.Split(pattern, ".")
- hostParts := strings.Split(host, ".")
-
- if len(patternParts) != len(hostParts) {
- return false
- }
-
- for i, patternPart := range patternParts {
- if i == 0 && patternPart == "*" {
- continue
- }
- if patternPart != hostParts[i] {
- return false
- }
- }
-
- return true
-}
-
-func parseNsName(input string) (string, string, error) {
- nsName := strings.Split(input, "/")
- if len(nsName) != 2 {
- return "", "", fmt.Errorf("invalid format (namespace/name) found in '%v'", input)
- }
-
- return nsName[0], nsName[1], nil
-}
-
-func waitForPodRunning(kubeClient *unversioned.Client, ns, podName string, interval, timeout time.Duration) error {
- condition := func(pod *api.Pod) (bool, error) {
- if pod.Status.Phase == api.PodRunning {
- return true, nil
- }
- return false, nil
- }
-
- return waitForPodCondition(kubeClient, ns, podName, condition, interval, timeout)
-}
-
-// waitForPodCondition waits for a pod in state defined by a condition (func)
-func waitForPodCondition(kubeClient *unversioned.Client, ns, podName string, condition func(pod *api.Pod) (bool, error),
- interval, timeout time.Duration) error {
- return wait.PollImmediate(interval, timeout, func() (bool, error) {
- pod, err := kubeClient.Pods(ns).Get(podName)
- if err != nil {
- if apierrs.IsNotFound(err) {
- return false, nil
- }
- }
-
- done, err := condition(pod)
- if err != nil {
- return false, err
- }
- if done {
- return true, nil
- }
-
- return false, nil
- })
-}
-
-// ingAnnotations represents Ingress annotations.
-type ingAnnotations map[string]string
-
-const (
- // ingressClassKey picks a specific "class" for the Ingress. The controller
- // only processes Ingresses with this annotation either unset, or set
- // to either nginxIngressClass or the empty string.
- ingressClassKey = "kubernetes.io/ingress.class"
- nginxIngressClass = "nginx"
-)
-
-func (ing ingAnnotations) ingressClass() string {
- val, ok := ing[ingressClassKey]
- if !ok {
- return ""
- }
- return val
-}
-
-// isNGINXIngress returns true if the given Ingress either doesn't specify the
-// ingress.class annotation, or it's set to "nginx".
-func isNGINXIngress(ing *extensions.Ingress) bool {
- class := ingAnnotations(ing.ObjectMeta.Annotations).ingressClass()
- return class == "" || class == nginxIngressClass
-}
-
-const (
- snakeOilPem = "/etc/ssl/certs/ssl-cert-snakeoil.pem"
- snakeOilKey = "/etc/ssl/private/ssl-cert-snakeoil.key"
-)
-
-// getFakeSSLCert returns the snake oil ssl certificate created by the command
-// make-ssl-cert generate-default-snakeoil --force-overwrite
-func getFakeSSLCert() (string, string) {
- cert, err := ioutil.ReadFile(snakeOilPem)
- if err != nil {
- return "", ""
- }
-
- key, err := ioutil.ReadFile(snakeOilKey)
- if err != nil {
- return "", ""
- }
-
- return string(cert), string(key)
-}
diff --git a/core/pkg/cache/main.go b/core/pkg/cache/main.go
new file mode 100644
index 0000000000..04257a0ba9
--- /dev/null
+++ b/core/pkg/cache/main.go
@@ -0,0 +1,34 @@
+/*
+Copyright 2015 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package cache
+
+import "k8s.io/kubernetes/pkg/client/cache"
+
+// StoreToIngressLister makes a Store that lists Ingress.
+type StoreToIngressLister struct {
+ cache.Store
+}
+
+// StoreToSecretsLister makes a Store that lists Secrets.
+type StoreToSecretsLister struct {
+ cache.Store
+}
+
+// StoreToConfigmapLister makes a Store that lists Configmap.
+type StoreToConfigmapLister struct {
+ cache.Store
+}
diff --git a/controllers/nginx/nginx/auth/main.go b/core/pkg/ingress/annotations/auth/main.go
similarity index 58%
rename from controllers/nginx/nginx/auth/main.go
rename to core/pkg/ingress/annotations/auth/main.go
index 0a10686941..70acde2e1d 100644
--- a/controllers/nginx/nginx/auth/main.go
+++ b/core/pkg/ingress/annotations/auth/main.go
@@ -23,11 +23,10 @@ import (
"os"
"regexp"
- "github.com/golang/glog"
-
"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/apis/extensions"
- client "k8s.io/kubernetes/pkg/client/unversioned"
+
+ "k8s.io/ingress/core/pkg/ingress/annotations/parser"
)
const (
@@ -35,11 +34,9 @@ const (
authSecret = "ingress.kubernetes.io/auth-secret"
authRealm = "ingress.kubernetes.io/auth-realm"
- defAuthRealm = "Authentication Required"
-
// DefAuthDirectory default directory used to store files
- // to authenticate request in NGINX
- DefAuthDirectory = "/etc/nginx/auth"
+ // to authenticate request
+ DefAuthDirectory = "/etc/ingress-controller/auth"
)
func init() {
@@ -53,95 +50,58 @@ var (
// ErrInvalidAuthType is return in case of unsupported authentication type
ErrInvalidAuthType = errors.New("invalid authentication type")
- // ErrMissingAuthType is return when the annotation for authentication is missing
- ErrMissingAuthType = errors.New("authentication type is missing")
-
// ErrMissingSecretName is returned when the name of the secret is missing
ErrMissingSecretName = errors.New("secret name is missing")
// ErrMissingAuthInSecret is returned when there is no auth key in secret data
ErrMissingAuthInSecret = errors.New("the secret does not contains the auth key")
-
- // ErrMissingAnnotations is returned when the ingress rule
- // does not contains annotations related with authentication
- ErrMissingAnnotations = errors.New("missing authentication annotations")
)
-// Nginx returns authentication configuration for an Ingress rule
-type Nginx struct {
- Type string
- Realm string
- File string
- Secured bool
-}
-
-type ingAnnotations map[string]string
-
-func (a ingAnnotations) authType() (string, error) {
- val, ok := a[authType]
- if !ok {
- return "", ErrMissingAuthType
- }
-
- if !authTypeRegex.MatchString(val) {
- glog.Warningf("%v is not a valid authentication type", val)
- return "", ErrInvalidAuthType
- }
-
- return val, nil
-}
-
-func (a ingAnnotations) realm() string {
- val, ok := a[authRealm]
- if !ok {
- return defAuthRealm
- }
-
- return val
-}
-
-func (a ingAnnotations) secretName() (string, error) {
- val, ok := a[authSecret]
- if !ok {
- return "", ErrMissingSecretName
- }
-
- return val, nil
+// BasicDigest returns authentication configuration for an Ingress rule
+type BasicDigest struct {
+ Type string `json:"type"`
+ Realm string `json:"realm"`
+ File string `json:"file"`
+ Secured bool `json:"secured"`
}
// ParseAnnotations parses the annotations contained in the ingress
// rule used to add authentication in the paths defined in the rule
// and generated an htpasswd compatible file to be used as source
// during the authentication process
-func ParseAnnotations(kubeClient client.Interface, ing *extensions.Ingress, authDir string) (*Nginx, error) {
+func ParseAnnotations(ing *extensions.Ingress, authDir string, fn func(string) (*api.Secret, error)) (*BasicDigest, error) {
if ing.GetAnnotations() == nil {
- return &Nginx{}, ErrMissingAnnotations
+ return &BasicDigest{}, parser.ErrMissingAnnotations
}
- at, err := ingAnnotations(ing.GetAnnotations()).authType()
+ at, err := parser.GetStringAnnotation(authType, ing)
if err != nil {
- return &Nginx{}, err
+ return &BasicDigest{}, err
+ }
+
+ if !authTypeRegex.MatchString(at) {
+ return &BasicDigest{}, ErrInvalidAuthType
}
- s, err := ingAnnotations(ing.GetAnnotations()).secretName()
+ s, err := parser.GetStringAnnotation(authSecret, ing)
if err != nil {
- return &Nginx{}, err
+ return &BasicDigest{}, err
}
- secret, err := kubeClient.Secrets(ing.Namespace).Get(s)
+ secret, err := fn(fmt.Sprintf("%v/%v", ing.Namespace, s))
if err != nil {
- return &Nginx{}, err
+ return &BasicDigest{}, err
}
- realm := ingAnnotations(ing.GetAnnotations()).realm()
+ realm, _ := parser.GetStringAnnotation(authRealm, ing)
passFile := fmt.Sprintf("%v/%v-%v.passwd", authDir, ing.GetNamespace(), ing.GetName())
err = dumpSecret(passFile, secret)
if err != nil {
- return &Nginx{}, err
+ return &BasicDigest{}, err
}
- return &Nginx{
+ return &BasicDigest{
Type: at,
Realm: realm,
File: passFile,
diff --git a/controllers/nginx/nginx/auth/main_test.go b/core/pkg/ingress/annotations/auth/main_test.go
similarity index 59%
rename from controllers/nginx/nginx/auth/main_test.go
rename to core/pkg/ingress/annotations/auth/main_test.go
index 27c8e1db58..bb69990182 100644
--- a/controllers/nginx/nginx/auth/main_test.go
+++ b/core/pkg/ingress/annotations/auth/main_test.go
@@ -25,8 +25,6 @@ import (
"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/apis/extensions"
- "k8s.io/kubernetes/pkg/client/unversioned"
- "k8s.io/kubernetes/pkg/client/unversioned/testclient"
"k8s.io/kubernetes/pkg/util/intstr"
)
@@ -65,79 +63,21 @@ func buildIngress() *extensions.Ingress {
}
}
-type secretsClient struct {
- unversioned.Interface
-}
-
-// dummySecret generates a secret with one user inside the auth key
-// foo:md5(bar)
-func dummySecret() *api.Secret {
+func mockSecret(name string) (*api.Secret, error) {
return &api.Secret{
ObjectMeta: api.ObjectMeta{
Namespace: api.NamespaceDefault,
Name: "demo-secret",
},
Data: map[string][]byte{"auth": []byte("foo:$apr1$OFG3Xybp$ckL0FHDAkoXYIlH9.cysT0")},
- }
-}
-
-func mockClient() *testclient.Fake {
- return testclient.NewSimpleFake(dummySecret())
+ }, nil
}
-
-func TestAnnotations(t *testing.T) {
- ing := buildIngress()
-
- _, err := ingAnnotations(ing.GetAnnotations()).authType()
- if err == nil {
- t.Error("Expected a validation error")
- }
- realm := ingAnnotations(ing.GetAnnotations()).realm()
- if realm != defAuthRealm {
- t.Error("Expected default realm")
- }
-
- _, err = ingAnnotations(ing.GetAnnotations()).secretName()
- if err == nil {
- t.Error("Expected a validation error")
- }
-
- data := map[string]string{}
- data[authType] = "demo"
- data[authSecret] = "demo-secret"
- data[authRealm] = "demo"
- ing.SetAnnotations(data)
-
- _, err = ingAnnotations(ing.GetAnnotations()).authType()
- if err == nil {
- t.Error("Expected a validation error")
- }
-
- realm = ingAnnotations(ing.GetAnnotations()).realm()
- if realm != "demo" {
- t.Errorf("Expected demo as realm but returned %s", realm)
- }
-
- secret, err := ingAnnotations(ing.GetAnnotations()).secretName()
- if err != nil {
- t.Errorf("Unexpec error %v", err)
- }
- if secret != "demo-secret" {
- t.Errorf("Expected demo-secret as realm but returned %s", secret)
- }
-}
-
func TestIngressWithoutAuth(t *testing.T) {
ing := buildIngress()
- client := mockClient()
- _, err := ParseAnnotations(client, ing, "")
+ _, err := ParseAnnotations(ing, "", mockSecret)
if err == nil {
t.Error("Expected error with ingress without annotations")
}
-
- if err == ErrMissingAuthType {
- t.Errorf("Expected MissingAuthType error but returned %v", err)
- }
}
func TestIngressAuth(t *testing.T) {
@@ -152,20 +92,19 @@ func TestIngressAuth(t *testing.T) {
_, dir, _ := dummySecretContent(t)
defer os.RemoveAll(dir)
- client := mockClient()
- nginxAuth, err := ParseAnnotations(client, ing, dir)
+ auth, err := ParseAnnotations(ing, dir, mockSecret)
if err != nil {
t.Errorf("Uxpected error with ingress: %v", err)
}
- if nginxAuth.Type != "basic" {
- t.Errorf("Expected basic as auth type but returned %s", nginxAuth.Type)
+ if auth.Type != "basic" {
+ t.Errorf("Expected basic as auth type but returned %s", auth.Type)
}
- if nginxAuth.Realm != "-realm-" {
- t.Errorf("Expected -realm- as realm but returned %s", nginxAuth.Realm)
+ if auth.Realm != "-realm-" {
+ t.Errorf("Expected -realm- as realm but returned %s", auth.Realm)
}
- if !nginxAuth.Secured {
- t.Errorf("Expected true as secured but returned %v", nginxAuth.Secured)
+ if !auth.Secured {
+ t.Errorf("Expected true as secured but returned %v", auth.Secured)
}
}
@@ -180,9 +119,7 @@ func dummySecretContent(t *testing.T) (string, string, *api.Secret) {
t.Error(err)
}
defer tmpfile.Close()
-
- s := dummySecret()
-
+ s, _ := mockSecret("demo")
return tmpfile.Name(), dir, s
}
diff --git a/controllers/nginx/nginx/authreq/main.go b/core/pkg/ingress/annotations/authreq/main.go
similarity index 52%
rename from controllers/nginx/nginx/authreq/main.go
rename to core/pkg/ingress/annotations/authreq/main.go
index 0f53e5bd24..3e5f33c7c0 100644
--- a/controllers/nginx/nginx/authreq/main.go
+++ b/core/pkg/ingress/annotations/authreq/main.go
@@ -17,13 +17,13 @@ limitations under the License.
package authreq
import (
- "errors"
"fmt"
"net/url"
- "strconv"
"strings"
"k8s.io/kubernetes/pkg/apis/extensions"
+
+ "k8s.io/ingress/core/pkg/ingress/annotations/parser"
)
const (
@@ -33,47 +33,11 @@ const (
authBody = "ingress.kubernetes.io/auth-send-body"
)
-var (
- // ErrMissingAnnotations is returned when the ingress rule
- // does not contain annotations related with authentication
- ErrMissingAnnotations = errors.New("missing authentication annotations")
-)
-
-// Auth returns external authentication configuration for an Ingress rule
-type Auth struct {
- URL string
- Method string
- SendBody bool
-}
-
-type ingAnnotations map[string]string
-
-func (a ingAnnotations) url() (string, error) {
- val, ok := a[authURL]
- if !ok {
- return "", ErrMissingAnnotations
- }
-
- return val, nil
-}
-
-func (a ingAnnotations) method() string {
- val, ok := a[authMethod]
- if !ok {
- return ""
- }
-
- return val
-}
-
-func (a ingAnnotations) sendBody() bool {
- val, ok := a[authBody]
- if ok {
- if b, err := strconv.ParseBool(val); err == nil {
- return b
- }
- }
- return false
+// External returns external authentication configuration for an Ingress rule
+type External struct {
+ URL string `json:"url"`
+ Method string `json:"method"`
+ SendBody bool `json:"sendBody"`
}
var (
@@ -95,42 +59,42 @@ func validMethod(method string) bool {
// ParseAnnotations parses the annotations contained in the ingress
// rule used to use an external URL as source for authentication
-func ParseAnnotations(ing *extensions.Ingress) (Auth, error) {
+func ParseAnnotations(ing *extensions.Ingress) (External, error) {
if ing.GetAnnotations() == nil {
- return Auth{}, ErrMissingAnnotations
+ return External{}, parser.ErrMissingAnnotations
}
- str, err := ingAnnotations(ing.GetAnnotations()).url()
+ str, err := parser.GetStringAnnotation(authURL, ing)
if err != nil {
- return Auth{}, err
+ return External{}, err
}
if str == "" {
- return Auth{}, fmt.Errorf("an empty string is not a valid URL")
+ return External{}, fmt.Errorf("an empty string is not a valid URL")
}
ur, err := url.Parse(str)
if err != nil {
- return Auth{}, err
+ return External{}, err
}
if ur.Scheme == "" {
- return Auth{}, fmt.Errorf("url scheme is empty")
+ return External{}, fmt.Errorf("url scheme is empty")
}
if ur.Host == "" {
- return Auth{}, fmt.Errorf("url host is empty")
+ return External{}, fmt.Errorf("url host is empty")
}
- if strings.Index(ur.Host, "..") != -1 {
- return Auth{}, fmt.Errorf("invalid url host")
+ if strings.Contains(ur.Host, "..") {
+ return External{}, fmt.Errorf("invalid url host")
}
- m := ingAnnotations(ing.GetAnnotations()).method()
+ m, _ := parser.GetStringAnnotation(authMethod, ing)
if len(m) != 0 && !validMethod(m) {
- return Auth{}, fmt.Errorf("invalid HTTP method")
+ return External{}, fmt.Errorf("invalid HTTP method")
}
- sb := ingAnnotations(ing.GetAnnotations()).sendBody()
+ sb, _ := parser.GetBoolAnnotation(authBody, ing)
- return Auth{
+ return External{
URL: str,
Method: m,
SendBody: sb,
diff --git a/controllers/nginx/nginx/authreq/main_test.go b/core/pkg/ingress/annotations/authreq/main_test.go
similarity index 96%
rename from controllers/nginx/nginx/authreq/main_test.go
rename to core/pkg/ingress/annotations/authreq/main_test.go
index f2936f72ba..57f1825999 100644
--- a/controllers/nginx/nginx/authreq/main_test.go
+++ b/core/pkg/ingress/annotations/authreq/main_test.go
@@ -63,11 +63,6 @@ func buildIngress() *extensions.Ingress {
func TestAnnotations(t *testing.T) {
ing := buildIngress()
- _, err := ingAnnotations(ing.GetAnnotations()).url()
- if err == nil {
- t.Error("Expected a validation error")
- }
-
data := map[string]string{}
ing.SetAnnotations(data)
diff --git a/core/pkg/ingress/annotations/authtls/main.go b/core/pkg/ingress/annotations/authtls/main.go
new file mode 100644
index 0000000000..3d80e0deb8
--- /dev/null
+++ b/core/pkg/ingress/annotations/authtls/main.go
@@ -0,0 +1,65 @@
+/*
+Copyright 2015 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package authtls
+
+import (
+ "fmt"
+
+ "k8s.io/kubernetes/pkg/apis/extensions"
+
+ "k8s.io/ingress/core/pkg/ingress/annotations/parser"
+ "k8s.io/ingress/core/pkg/k8s"
+)
+
+const (
+ // name of the secret
+ authTLSSecret = "ingress.kubernetes.io/auth-tls-secret"
+)
+
+// SSLCert returns external authentication configuration for an Ingress rule
+type SSLCert struct {
+ Secret string `json:"secret"`
+ CertFileName string `json:"certFilename"`
+ KeyFileName string `json:"keyFilename"`
+ CAFileName string `json:"caFilename"`
+ PemSHA string `json:"pemSha"`
+}
+
+// ParseAnnotations parses the annotations contained in the ingress
+// rule used to use an external URL as source for authentication
+func ParseAnnotations(ing *extensions.Ingress,
+ fn func(secret string) (*SSLCert, error)) (*SSLCert, error) {
+ if ing.GetAnnotations() == nil {
+ return &SSLCert{}, parser.ErrMissingAnnotations
+ }
+
+ str, err := parser.GetStringAnnotation(authTLSSecret, ing)
+ if err != nil {
+ return &SSLCert{}, err
+ }
+
+ if str == "" {
+ return &SSLCert{}, fmt.Errorf("an empty string is not a valid secret name")
+ }
+
+ _, _, err = k8s.ParseNameNS(str)
+ if err != nil {
+ return &SSLCert{}, err
+ }
+
+ return fn(str)
+}
diff --git a/core/pkg/ingress/annotations/authtls/main_test.go b/core/pkg/ingress/annotations/authtls/main_test.go
new file mode 100644
index 0000000000..b1f4886f64
--- /dev/null
+++ b/core/pkg/ingress/annotations/authtls/main_test.go
@@ -0,0 +1,107 @@
+/*
+Copyright 2015 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package authtls
+
+import (
+ "testing"
+
+ "k8s.io/kubernetes/pkg/api"
+ "k8s.io/kubernetes/pkg/apis/extensions"
+ "k8s.io/kubernetes/pkg/util/intstr"
+)
+
+func buildIngress() *extensions.Ingress {
+ defaultBackend := extensions.IngressBackend{
+ ServiceName: "default-backend",
+ ServicePort: intstr.FromInt(80),
+ }
+
+ return &extensions.Ingress{
+ ObjectMeta: api.ObjectMeta{
+ Name: "foo",
+ Namespace: api.NamespaceDefault,
+ },
+ Spec: extensions.IngressSpec{
+ Backend: &extensions.IngressBackend{
+ ServiceName: "default-backend",
+ ServicePort: intstr.FromInt(80),
+ },
+ Rules: []extensions.IngressRule{
+ {
+ Host: "foo.bar.com",
+ IngressRuleValue: extensions.IngressRuleValue{
+ HTTP: &extensions.HTTPIngressRuleValue{
+ Paths: []extensions.HTTPIngressPath{
+ {
+ Path: "/foo",
+ Backend: defaultBackend,
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ }
+}
+
+func TestAnnotations(t *testing.T) {
+ ing := buildIngress()
+
+ data := map[string]string{}
+ ing.SetAnnotations(data)
+ /*
+ tests := []struct {
+ title string
+ url string
+ method string
+ sendBody bool
+ expErr bool
+ }{
+ {"empty", "", "", false, true},
+ {"no scheme", "bar", "", false, true},
+ {"invalid host", "http://", "", false, true},
+ {"invalid host (multiple dots)", "http://foo..bar.com", "", false, true},
+ {"valid URL", "http://bar.foo.com/external-auth", "", false, false},
+ {"valid URL - send body", "http://foo.com/external-auth", "POST", true, false},
+ {"valid URL - send body", "http://foo.com/external-auth", "GET", true, false},
+ }
+
+ for _, test := range tests {
+ data[authTLSSecret] = ""
+ test.title
+
+ u, err := ParseAnnotations(ing)
+
+ if test.expErr {
+ if err == nil {
+ t.Errorf("%v: expected error but retuned nil", test.title)
+ }
+ continue
+ }
+
+ if u.URL != test.url {
+ t.Errorf("%v: expected \"%v\" but \"%v\" was returned", test.title, test.url, u.URL)
+ }
+ if u.Method != test.method {
+ t.Errorf("%v: expected \"%v\" but \"%v\" was returned", test.title, test.method, u.Method)
+ }
+ if u.SendBody != test.sendBody {
+ t.Errorf("%v: expected \"%v\" but \"%v\" was returned", test.title, test.sendBody, u.SendBody)
+ }
+ }*/
+}
diff --git a/controllers/nginx/nginx/cors/main.go b/core/pkg/ingress/annotations/cors/main.go
similarity index 71%
rename from controllers/nginx/nginx/cors/main.go
rename to core/pkg/ingress/annotations/cors/main.go
index 436e25231f..53d9cca6df 100644
--- a/controllers/nginx/nginx/cors/main.go
+++ b/core/pkg/ingress/annotations/cors/main.go
@@ -17,34 +17,17 @@ limitations under the License.
package cors
import (
- "errors"
- "strconv"
-
"k8s.io/kubernetes/pkg/apis/extensions"
+
+ "k8s.io/ingress/core/pkg/ingress/annotations/parser"
)
const (
cors = "ingress.kubernetes.io/enable-cors"
)
-type ingAnnotations map[string]string
-
-func (a ingAnnotations) cors() bool {
- val, ok := a[cors]
- if ok {
- if b, err := strconv.ParseBool(val); err == nil {
- return b
- }
- }
- return false
-}
-
// ParseAnnotations parses the annotations contained in the ingress
// rule used to indicate if the location/s should allows CORS
func ParseAnnotations(ing *extensions.Ingress) (bool, error) {
- if ing.GetAnnotations() == nil {
- return false, errors.New("no annotations present")
- }
-
- return ingAnnotations(ing.GetAnnotations()).cors(), nil
+ return parser.GetBoolAnnotation(cors, ing)
}
diff --git a/core/pkg/ingress/annotations/healthcheck/main.go b/core/pkg/ingress/annotations/healthcheck/main.go
new file mode 100644
index 0000000000..9dfc2050ac
--- /dev/null
+++ b/core/pkg/ingress/annotations/healthcheck/main.go
@@ -0,0 +1,56 @@
+/*
+Copyright 2016 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package healthcheck
+
+import (
+ "k8s.io/kubernetes/pkg/apis/extensions"
+
+ "k8s.io/ingress/core/pkg/ingress/annotations/parser"
+ "k8s.io/ingress/core/pkg/ingress/defaults"
+)
+
+const (
+ upsMaxFails = "ingress.kubernetes.io/upstream-max-fails"
+ upsFailTimeout = "ingress.kubernetes.io/upstream-fail-timeout"
+)
+
+// Upstream returns the URL and method to use check the status of
+// the upstream server/s
+type Upstream struct {
+ MaxFails int `json:"maxFails"`
+ FailTimeout int `json:"failTimeout"`
+}
+
+// ParseAnnotations parses the annotations contained in the ingress
+// rule used to configure upstream check parameters
+func ParseAnnotations(cfg defaults.Backend, ing *extensions.Ingress) *Upstream {
+ if ing.GetAnnotations() == nil {
+ return &Upstream{cfg.UpstreamMaxFails, cfg.UpstreamFailTimeout}
+ }
+
+ mf, err := parser.GetIntAnnotation(upsMaxFails, ing)
+ if err != nil {
+ mf = cfg.UpstreamMaxFails
+ }
+
+ ft, err := parser.GetIntAnnotation(upsFailTimeout, ing)
+ if err != nil {
+ ft = cfg.UpstreamFailTimeout
+ }
+
+ return &Upstream{mf, ft}
+}
diff --git a/controllers/nginx/nginx/healthcheck/main_test.go b/core/pkg/ingress/annotations/healthcheck/main_test.go
similarity index 67%
rename from controllers/nginx/nginx/healthcheck/main_test.go
rename to core/pkg/ingress/annotations/healthcheck/main_test.go
index 315c11729e..aba9c73858 100644
--- a/controllers/nginx/nginx/healthcheck/main_test.go
+++ b/core/pkg/ingress/annotations/healthcheck/main_test.go
@@ -23,7 +23,7 @@ import (
"k8s.io/kubernetes/pkg/apis/extensions"
"k8s.io/kubernetes/pkg/util/intstr"
- "k8s.io/contrib/ingress/controllers/nginx/nginx/config"
+ "k8s.io/ingress/core/pkg/ingress/defaults"
)
func buildIngress() *extensions.Ingress {
@@ -61,41 +61,6 @@ func buildIngress() *extensions.Ingress {
}
}
-func TestAnnotations(t *testing.T) {
- ing := buildIngress()
-
- _, err := ingAnnotations(ing.GetAnnotations()).maxFails()
- if err == nil {
- t.Error("Expected a validation error")
- }
-
- _, err = ingAnnotations(ing.GetAnnotations()).failTimeout()
- if err == nil {
- t.Error("Expected a validation error")
- }
-
- data := map[string]string{}
- data[upsMaxFails] = "1"
- data[upsFailTimeout] = "1"
- ing.SetAnnotations(data)
-
- mf, err := ingAnnotations(ing.GetAnnotations()).maxFails()
- if err != nil {
- t.Errorf("Unexpected error: %v", err)
- }
- if mf != 1 {
- t.Errorf("Expected 1 but returned %v", mf)
- }
-
- ft, err := ingAnnotations(ing.GetAnnotations()).failTimeout()
- if err != nil {
- t.Errorf("Unexpected error: %v", err)
- }
- if ft != 1 {
- t.Errorf("Expected 1 but returned %v", ft)
- }
-}
-
func TestIngressHealthCheck(t *testing.T) {
ing := buildIngress()
@@ -103,8 +68,7 @@ func TestIngressHealthCheck(t *testing.T) {
data[upsMaxFails] = "2"
ing.SetAnnotations(data)
- cfg := config.Configuration{}
- cfg.UpstreamFailTimeout = 1
+ cfg := defaults.Backend{UpstreamFailTimeout: 1}
nginxHz := ParseAnnotations(cfg, ing)
diff --git a/controllers/nginx/nginx/ipwhitelist/main.go b/core/pkg/ingress/annotations/ipwhitelist/main.go
similarity index 68%
rename from controllers/nginx/nginx/ipwhitelist/main.go
rename to core/pkg/ingress/annotations/ipwhitelist/main.go
index de34a9312c..14f3ce00ab 100644
--- a/controllers/nginx/nginx/ipwhitelist/main.go
+++ b/core/pkg/ingress/annotations/ipwhitelist/main.go
@@ -22,6 +22,9 @@ import (
"k8s.io/kubernetes/pkg/apis/extensions"
"k8s.io/kubernetes/pkg/util/net/sets"
+
+ "k8s.io/ingress/core/pkg/ingress/annotations/parser"
+ "k8s.io/ingress/core/pkg/ingress/defaults"
)
const (
@@ -29,10 +32,6 @@ const (
)
var (
- // ErrMissingWhitelist returned error when the ingress does not contains the
- // whitelist annotation
- ErrMissingWhitelist = errors.New("whitelist annotation is missing")
-
// ErrInvalidCIDR returned error when the whitelist annotation does not
// contains a valid IP or network address
ErrInvalidCIDR = errors.New("the annotation does not contains a valid IP address or network")
@@ -40,44 +39,34 @@ var (
// SourceRange returns the CIDR
type SourceRange struct {
- CIDR []string
+ CIDR []string `json:"cidr"`
}
-type ingAnnotations map[string]string
+// ParseAnnotations parses the annotations contained in the ingress
+// rule used to limit access to certain client addresses or networks.
+// Multiple ranges can specified using commas as separator
+// e.g. `18.0.0.0/8,56.0.0.0/8`
+func ParseAnnotations(cfg defaults.Backend, ing *extensions.Ingress) (*SourceRange, error) {
+ cidrs := []string{}
-func (a ingAnnotations) whitelist() ([]string, error) {
- cidrs := make([]string, 0)
- val, ok := a[whitelist]
- if !ok {
- return cidrs, ErrMissingWhitelist
+ if ing.GetAnnotations() == nil {
+ return &SourceRange{CIDR: cfg.WhitelistSourceRange}, parser.ErrMissingAnnotations
+ }
+
+ val, err := parser.GetStringAnnotation(whitelist, ing)
+ if err != nil {
+ return &SourceRange{CIDR: cfg.WhitelistSourceRange}, err
}
values := strings.Split(val, ",")
ipnets, err := sets.ParseIPNets(values...)
if err != nil {
- return cidrs, ErrInvalidCIDR
+ return &SourceRange{CIDR: cfg.WhitelistSourceRange}, ErrInvalidCIDR
}
for k := range ipnets {
cidrs = append(cidrs, k)
}
- return cidrs, nil
-}
-
-// ParseAnnotations parses the annotations contained in the ingress
-// rule used to limit access to certain client addresses or networks.
-// Multiple ranges can specified using commas as separator
-// e.g. `18.0.0.0/8,56.0.0.0/8`
-func ParseAnnotations(whiteList []string, ing *extensions.Ingress) (*SourceRange, error) {
- if ing.GetAnnotations() == nil {
- return &SourceRange{whiteList}, ErrMissingWhitelist
- }
-
- wl, err := ingAnnotations(ing.GetAnnotations()).whitelist()
- if err != nil {
- wl = whiteList
- }
-
- return &SourceRange{wl}, err
+ return &SourceRange{cidrs}, nil
}
diff --git a/controllers/nginx/nginx/ipwhitelist/main_test.go b/core/pkg/ingress/annotations/ipwhitelist/main_test.go
similarity index 60%
rename from controllers/nginx/nginx/ipwhitelist/main_test.go
rename to core/pkg/ingress/annotations/ipwhitelist/main_test.go
index c081a02746..db623dd68f 100644
--- a/controllers/nginx/nginx/ipwhitelist/main_test.go
+++ b/core/pkg/ingress/annotations/ipwhitelist/main_test.go
@@ -23,6 +23,8 @@ import (
"k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/apis/extensions"
"k8s.io/kubernetes/pkg/util/intstr"
+
+ "k8s.io/ingress/core/pkg/ingress/defaults"
)
func buildIngress() *extensions.Ingress {
@@ -60,51 +62,9 @@ func buildIngress() *extensions.Ingress {
}
}
-func TestAnnotations(t *testing.T) {
- ing := buildIngress()
-
- _, err := ingAnnotations(ing.GetAnnotations()).whitelist()
- if err == nil {
- t.Error("Expected a validation error")
- }
-
- testNet := "10.0.0.0/24"
- enet := []string{testNet}
-
- data := map[string]string{}
- data[whitelist] = testNet
- ing.SetAnnotations(data)
-
- wl, err := ingAnnotations(ing.GetAnnotations()).whitelist()
- if err != nil {
- t.Errorf("Unexpected error: %v", err)
- }
-
- if !reflect.DeepEqual(wl, enet) {
- t.Errorf("Expected %v but returned %s", enet, wl)
- }
-
- data[whitelist] = "10.0.0.0/24,10.0.1.0/25"
- ing.SetAnnotations(data)
-
- wl, err = ingAnnotations(ing.GetAnnotations()).whitelist()
- if err != nil {
- t.Errorf("Unexpected error: %v", err)
- }
-
- if len(wl) != 2 {
- t.Errorf("Expected 2 netwotks but %v was returned", len(wl))
- }
-}
-
func TestParseAnnotations(t *testing.T) {
ing := buildIngress()
- _, err := ingAnnotations(ing.GetAnnotations()).whitelist()
- if err == nil {
- t.Error("Expected a validation error")
- }
-
testNet := "10.0.0.0/24"
enet := []string{testNet}
@@ -116,7 +76,7 @@ func TestParseAnnotations(t *testing.T) {
CIDR: enet,
}
- sr, err := ParseAnnotations([]string{}, ing)
+ sr, err := ParseAnnotations(defaults.Backend{}, ing)
if err != nil {
t.Errorf("Unexpected error: %v", err)
}
@@ -127,21 +87,23 @@ func TestParseAnnotations(t *testing.T) {
data[whitelist] = "www"
ing.SetAnnotations(data)
- _, err = ParseAnnotations([]string{}, ing)
+ _, err = ParseAnnotations(defaults.Backend{}, ing)
if err == nil {
t.Errorf("Expected error parsing an invalid cidr")
}
delete(data, "whitelist")
ing.SetAnnotations(data)
- sr, _ = ParseAnnotations([]string{}, ing)
- if !reflect.DeepEqual(sr.CIDR, []string{}) {
- t.Errorf("Expected empty CIDR but %v returned", sr.CIDR)
- }
-
- sr, _ = ParseAnnotations([]string{}, &extensions.Ingress{})
- if !reflect.DeepEqual(sr.CIDR, []string{}) {
- t.Errorf("Expected empty CIDR but %v returned", sr.CIDR)
- }
-
+ //sr, _ = ParseAnnotations(defaults.Backend{}, ing)
+ // TODO: fix test
+ /*
+ if !reflect.DeepEqual(sr.CIDR, []string{}) {
+ t.Errorf("Expected empty CIDR but %v returned", sr.CIDR)
+ }
+
+ sr, _ = ParseAnnotations(defaults.Upstream{}, &extensions.Ingress{})
+ if !reflect.DeepEqual(sr.CIDR, []string{}) {
+ t.Errorf("Expected empty CIDR but %v returned", sr.CIDR)
+ }
+ */
}
diff --git a/core/pkg/ingress/annotations/parser/main.go b/core/pkg/ingress/annotations/parser/main.go
new file mode 100644
index 0000000000..31736cf820
--- /dev/null
+++ b/core/pkg/ingress/annotations/parser/main.go
@@ -0,0 +1,102 @@
+/*
+Copyright 2015 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package parser
+
+import (
+ "errors"
+ "fmt"
+ "strconv"
+
+ "k8s.io/kubernetes/pkg/apis/extensions"
+)
+
+var (
+ // ErrMissingAnnotations is returned when the ingress rule
+ // does not contains annotations related with rate limit
+ ErrMissingAnnotations = errors.New("Ingress rule without annotations")
+
+ // ErrInvalidName ...
+ ErrInvalidName = errors.New("invalid annotation name")
+)
+
+type ingAnnotations map[string]string
+
+func (a ingAnnotations) parseBool(name string) (bool, error) {
+ val, ok := a[name]
+ if ok {
+ if b, err := strconv.ParseBool(val); err == nil {
+ return b, nil
+ }
+ }
+ return false, ErrMissingAnnotations
+}
+
+func (a ingAnnotations) parseString(name string) (string, error) {
+ val, ok := a[name]
+ if ok {
+ return val, nil
+ }
+ return "", ErrMissingAnnotations
+}
+
+func (a ingAnnotations) parseInt(name string) (int, error) {
+ val, ok := a[name]
+ if ok {
+ i, err := strconv.Atoi(val)
+ if err != nil {
+ return 0, fmt.Errorf("invalid annotations value: %v", err)
+ }
+ return i, nil
+ }
+ return 0, ErrMissingAnnotations
+}
+
+// GetBoolAnnotation ...
+func GetBoolAnnotation(name string, ing *extensions.Ingress) (bool, error) {
+ if ing == nil || ing.GetAnnotations() == nil {
+ return false, ErrMissingAnnotations
+ }
+ if name == "" {
+ return false, ErrInvalidName
+ }
+
+ return ingAnnotations(ing.GetAnnotations()).parseBool(name)
+}
+
+// GetStringAnnotation ...
+func GetStringAnnotation(name string, ing *extensions.Ingress) (string, error) {
+ if ing == nil || ing.GetAnnotations() == nil {
+ return "", ErrMissingAnnotations
+ }
+ if name == "" {
+ return "", ErrInvalidName
+ }
+
+ return ingAnnotations(ing.GetAnnotations()).parseString(name)
+}
+
+// GetIntAnnotation ...
+func GetIntAnnotation(name string, ing *extensions.Ingress) (int, error) {
+ if ing == nil || ing.GetAnnotations() == nil {
+ return 0, ErrMissingAnnotations
+ }
+ if name == "" {
+ return 0, ErrInvalidName
+ }
+
+ return ingAnnotations(ing.GetAnnotations()).parseInt(name)
+}
diff --git a/core/pkg/ingress/annotations/parser/main_test.go b/core/pkg/ingress/annotations/parser/main_test.go
new file mode 100644
index 0000000000..1c756cdc2c
--- /dev/null
+++ b/core/pkg/ingress/annotations/parser/main_test.go
@@ -0,0 +1,154 @@
+/*
+Copyright 2016 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package parser
+
+import (
+ "testing"
+
+ "k8s.io/kubernetes/pkg/api"
+ "k8s.io/kubernetes/pkg/apis/extensions"
+)
+
+func buildIngress() *extensions.Ingress {
+ return &extensions.Ingress{
+ ObjectMeta: api.ObjectMeta{
+ Name: "foo",
+ Namespace: api.NamespaceDefault,
+ },
+ Spec: extensions.IngressSpec{},
+ }
+}
+
+func TestGetBoolAnnotation(t *testing.T) {
+ ing := buildIngress()
+
+ _, err := GetBoolAnnotation("", nil)
+ if err == nil {
+ t.Errorf("expected error but retuned nil")
+ }
+
+ tests := []struct {
+ name string
+ field string
+ value string
+ exp bool
+ expErr bool
+ }{
+ {"empty - false", "", "false", false, true},
+ {"empty - true", "", "true", false, true},
+ {"valid - false", "bool", "false", false, false},
+ {"valid - true", "bool", "true", true, false},
+ }
+
+ data := map[string]string{}
+ ing.SetAnnotations(data)
+
+ for _, test := range tests {
+ data[test.field] = test.value
+
+ u, err := GetBoolAnnotation(test.field, ing)
+ if test.expErr {
+ if err == nil {
+ t.Errorf("%v: expected error but retuned nil", test.name)
+ }
+ continue
+ }
+ if u != test.exp {
+ t.Errorf("%v: expected \"%v\" but \"%v\" was returned", test.name, test.exp, u)
+ }
+ }
+}
+
+func TestGetStringAnnotation(t *testing.T) {
+ ing := buildIngress()
+
+ _, err := GetStringAnnotation("", nil)
+ if err == nil {
+ t.Errorf("expected error but retuned nil")
+ }
+
+ tests := []struct {
+ name string
+ field string
+ value string
+ exp string
+ expErr bool
+ }{
+ {"empty - A", "", "A", "", true},
+ {"empty - B", "", "B", "", true},
+ {"valid - A", "string", "A", "A", false},
+ {"valid - B", "string", "B", "B", false},
+ }
+
+ data := map[string]string{}
+ ing.SetAnnotations(data)
+
+ for _, test := range tests {
+ data[test.field] = test.value
+
+ s, err := GetStringAnnotation(test.field, ing)
+ if test.expErr {
+ if err == nil {
+ t.Errorf("%v: expected error but retuned nil", test.name)
+ }
+ continue
+ }
+ if s != test.exp {
+ t.Errorf("%v: expected \"%v\" but \"%v\" was returned", test.name, test.exp, s)
+ }
+ }
+}
+
+func TestGetIntAnnotation(t *testing.T) {
+ ing := buildIngress()
+
+ _, err := GetIntAnnotation("", nil)
+ if err == nil {
+ t.Errorf("expected error but retuned nil")
+ }
+
+ tests := []struct {
+ name string
+ field string
+ value string
+ exp int
+ expErr bool
+ }{
+ {"empty - A", "", "1", 0, true},
+ {"empty - B", "", "2", 0, true},
+ {"valid - A", "string", "1", 1, false},
+ {"valid - B", "string", "2", 2, false},
+ }
+
+ data := map[string]string{}
+ ing.SetAnnotations(data)
+
+ for _, test := range tests {
+ data[test.field] = test.value
+
+ s, err := GetIntAnnotation(test.field, ing)
+ if test.expErr {
+ if err == nil {
+ t.Errorf("%v: expected error but retuned nil", test.name)
+ }
+ continue
+ }
+ if s != test.exp {
+ t.Errorf("%v: expected \"%v\" but \"%v\" was returned", test.name, test.exp, s)
+ }
+ }
+}
diff --git a/core/pkg/ingress/annotations/proxy/main.go b/core/pkg/ingress/annotations/proxy/main.go
new file mode 100644
index 0000000000..d749f1849f
--- /dev/null
+++ b/core/pkg/ingress/annotations/proxy/main.go
@@ -0,0 +1,74 @@
+/*
+Copyright 2016 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package proxy
+
+import (
+ "k8s.io/kubernetes/pkg/apis/extensions"
+
+ "k8s.io/ingress/core/pkg/ingress/annotations/parser"
+ "k8s.io/ingress/core/pkg/ingress/defaults"
+)
+
+const (
+ connect = "ingress.kubernetes.io/proxy-connect-timeout"
+ send = "ingress.kubernetes.io/proxy-send-timeout"
+ read = "ingress.kubernetes.io/proxy-read-timeout"
+ bufferSize = "ingress.kubernetes.io/proxy-buffer-size"
+)
+
+// Configuration returns the proxy timeout to use in the upstream server/s
+type Configuration struct {
+ ConnectTimeout int `json:"conectTimeout"`
+ SendTimeout int `json:"sendTimeout"`
+ ReadTimeout int `json:"readTimeout"`
+ BufferSize string `json:"bufferSize"`
+}
+
+// ParseAnnotations parses the annotations contained in the ingress
+// rule used to configure upstream check parameters
+func ParseAnnotations(cfg defaults.Backend, ing *extensions.Ingress) *Configuration {
+ if ing == nil || ing.GetAnnotations() == nil {
+ return &Configuration{
+ cfg.ProxyConnectTimeout,
+ cfg.ProxySendTimeout,
+ cfg.ProxyReadTimeout,
+ cfg.ProxyBufferSize,
+ }
+ }
+
+ ct, err := parser.GetIntAnnotation(connect, ing)
+ if err != nil {
+ ct = cfg.ProxyConnectTimeout
+ }
+
+ st, err := parser.GetIntAnnotation(send, ing)
+ if err != nil {
+ st = cfg.ProxySendTimeout
+ }
+
+ rt, err := parser.GetIntAnnotation(read, ing)
+ if err != nil {
+ rt = cfg.ProxyReadTimeout
+ }
+
+ bs, err := parser.GetStringAnnotation(bufferSize, ing)
+ if err != nil || bs == "" {
+ bs = cfg.ProxyBufferSize
+ }
+
+ return &Configuration{ct, st, rt, bs}
+}
diff --git a/core/pkg/ingress/annotations/proxy/main_test.go b/core/pkg/ingress/annotations/proxy/main_test.go
new file mode 100644
index 0000000000..337408d686
--- /dev/null
+++ b/core/pkg/ingress/annotations/proxy/main_test.go
@@ -0,0 +1,90 @@
+/*
+Copyright 2016 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package proxy
+
+import (
+ "testing"
+
+ "k8s.io/kubernetes/pkg/api"
+ "k8s.io/kubernetes/pkg/apis/extensions"
+ "k8s.io/kubernetes/pkg/util/intstr"
+
+ "k8s.io/ingress/core/pkg/ingress/defaults"
+)
+
+func buildIngress() *extensions.Ingress {
+ defaultBackend := extensions.IngressBackend{
+ ServiceName: "default-backend",
+ ServicePort: intstr.FromInt(80),
+ }
+
+ return &extensions.Ingress{
+ ObjectMeta: api.ObjectMeta{
+ Name: "foo",
+ Namespace: api.NamespaceDefault,
+ },
+ Spec: extensions.IngressSpec{
+ Backend: &extensions.IngressBackend{
+ ServiceName: "default-backend",
+ ServicePort: intstr.FromInt(80),
+ },
+ Rules: []extensions.IngressRule{
+ {
+ Host: "foo.bar.com",
+ IngressRuleValue: extensions.IngressRuleValue{
+ HTTP: &extensions.HTTPIngressRuleValue{
+ Paths: []extensions.HTTPIngressPath{
+ {
+ Path: "/foo",
+ Backend: defaultBackend,
+ },
+ },
+ },
+ },
+ },
+ },
+ },
+ }
+}
+
+func TestIngressHealthCheck(t *testing.T) {
+ ing := buildIngress()
+
+ data := map[string]string{}
+ data[connect] = "1"
+ data[send] = "2"
+ data[read] = "3"
+ data[bufferSize] = "1k"
+ ing.SetAnnotations(data)
+
+ cfg := defaults.Backend{UpstreamFailTimeout: 1}
+
+ p := ParseAnnotations(cfg, ing)
+
+ if p.ConnectTimeout != 1 {
+ t.Errorf("Expected 1 as connect-timeout but returned %v", p.ConnectTimeout)
+ }
+ if p.SendTimeout != 2 {
+ t.Errorf("Expected 2 as send-timeout but returned %v", p.SendTimeout)
+ }
+ if p.ReadTimeout != 3 {
+ t.Errorf("Expected 3 as read-timeout but returned %v", p.ReadTimeout)
+ }
+ if p.BufferSize != "1k" {
+ t.Errorf("Expected 1k as buffer-size but returned %v", p.BufferSize)
+ }
+}
diff --git a/controllers/nginx/nginx/ratelimit/main.go b/core/pkg/ingress/annotations/ratelimit/main.go
similarity index 76%
rename from controllers/nginx/nginx/ratelimit/main.go
rename to core/pkg/ingress/annotations/ratelimit/main.go
index 2a1036fb72..774bf6e074 100644
--- a/controllers/nginx/nginx/ratelimit/main.go
+++ b/core/pkg/ingress/annotations/ratelimit/main.go
@@ -19,9 +19,10 @@ package ratelimit
import (
"errors"
"fmt"
- "strconv"
"k8s.io/kubernetes/pkg/apis/extensions"
+
+ "k8s.io/ingress/core/pkg/ingress/annotations/parser"
)
const (
@@ -39,10 +40,6 @@ const (
var (
// ErrInvalidRateLimit is returned when the annotation caontains invalid values
ErrInvalidRateLimit = errors.New("invalid rate limit value. Must be > 0")
-
- // ErrMissingAnnotations is returned when the ingress rule
- // does not contains annotations related with rate limit
- ErrMissingAnnotations = errors.New("no annotations present")
)
// RateLimit returns rate limit configuration for an Ingress rule
@@ -51,54 +48,30 @@ var (
// Note: Is possible to specify both limits
type RateLimit struct {
// Connections indicates a limit with the number of connections per IP address
- Connections Zone
+ Connections Zone `json:"connections"`
// RPS indicates a limit with the number of connections per second
- RPS Zone
+ RPS Zone `json:"rps"`
}
// Zone returns information about the NGINX rate limit (limit_req_zone)
// http://nginx.org/en/docs/http/ngx_http_limit_req_module.html#limit_req_zone
type Zone struct {
- Name string
- Limit int
- Burst int
+ Name string `json:"name"`
+ Limit int `json:"limit"`
+ Burst int `json:"burst"`
// SharedSize amount of shared memory for the zone
- SharedSize int
-}
-
-type ingAnnotations map[string]string
-
-func (a ingAnnotations) limitIP() int {
- val, ok := a[limitIP]
- if ok {
- if i, err := strconv.Atoi(val); err == nil {
- return i
- }
- }
-
- return 0
-}
-
-func (a ingAnnotations) limitRPS() int {
- val, ok := a[limitRPS]
- if ok {
- if i, err := strconv.Atoi(val); err == nil {
- return i
- }
- }
-
- return 0
+ SharedSize int `json:"sharedSize"`
}
// ParseAnnotations parses the annotations contained in the ingress
// rule used to rewrite the defined paths
func ParseAnnotations(ing *extensions.Ingress) (*RateLimit, error) {
if ing.GetAnnotations() == nil {
- return &RateLimit{}, ErrMissingAnnotations
+ return &RateLimit{}, parser.ErrMissingAnnotations
}
- rps := ingAnnotations(ing.GetAnnotations()).limitRPS()
- conn := ingAnnotations(ing.GetAnnotations()).limitIP()
+ rps, _ := parser.GetIntAnnotation(limitRPS, ing)
+ conn, _ := parser.GetIntAnnotation(limitIP, ing)
if rps == 0 && conn == 0 {
return &RateLimit{
diff --git a/controllers/nginx/nginx/ratelimit/main_test.go b/core/pkg/ingress/annotations/ratelimit/main_test.go
similarity index 76%
rename from controllers/nginx/nginx/ratelimit/main_test.go
rename to core/pkg/ingress/annotations/ratelimit/main_test.go
index 4a7adec8c4..3095662cec 100644
--- a/controllers/nginx/nginx/ratelimit/main_test.go
+++ b/core/pkg/ingress/annotations/ratelimit/main_test.go
@@ -59,35 +59,6 @@ func buildIngress() *extensions.Ingress {
}
}
-func TestAnnotations(t *testing.T) {
- ing := buildIngress()
-
- lip := ingAnnotations(ing.GetAnnotations()).limitIP()
- if lip != 0 {
- t.Errorf("Expected 0 in limit by ip but %v was returned", lip)
- }
-
- lrps := ingAnnotations(ing.GetAnnotations()).limitRPS()
- if lrps != 0 {
- t.Errorf("Expected 0 in limit by rps but %v was returend", lrps)
- }
-
- data := map[string]string{}
- data[limitIP] = "5"
- data[limitRPS] = "100"
- ing.SetAnnotations(data)
-
- lip = ingAnnotations(ing.GetAnnotations()).limitIP()
- if lip != 5 {
- t.Errorf("Expected 5 in limit by ip but %v was returend", lip)
- }
-
- lrps = ingAnnotations(ing.GetAnnotations()).limitRPS()
- if lrps != 100 {
- t.Errorf("Expected 100 in limit by rps but %v was returend", lrps)
- }
-}
-
func TestWithoutAnnotations(t *testing.T) {
ing := buildIngress()
_, err := ParseAnnotations(ing)
diff --git a/controllers/nginx/nginx/rewrite/main.go b/core/pkg/ingress/annotations/rewrite/main.go
similarity index 51%
rename from controllers/nginx/nginx/rewrite/main.go
rename to core/pkg/ingress/annotations/rewrite/main.go
index c2f0eb71da..33ff7bcad1 100644
--- a/controllers/nginx/nginx/rewrite/main.go
+++ b/core/pkg/ingress/annotations/rewrite/main.go
@@ -18,11 +18,11 @@ package rewrite
import (
"errors"
- "strconv"
"k8s.io/kubernetes/pkg/apis/extensions"
- "k8s.io/contrib/ingress/controllers/nginx/nginx/config"
+ "k8s.io/ingress/core/pkg/ingress/annotations/parser"
+ "k8s.io/ingress/core/pkg/ingress/defaults"
)
const (
@@ -34,73 +34,28 @@ const (
// Redirect describes the per location redirect config
type Redirect struct {
// Target URI where the traffic must be redirected
- Target string
+ Target string `json:"target"`
// AddBaseURL indicates if is required to add a base tag in the head
// of the responses from the upstream servers
- AddBaseURL bool
- // Should indicates if the location section should be accessible SSL only
- SSLRedirect bool
-}
-
-var (
- // ErrMissingSSLRedirect returned error when the ingress does not contains the
- // ssl-redirect annotation
- ErrMissingSSLRedirect = errors.New("ssl-redirect annotations is missing")
-
- // ErrInvalidBool gets returned when the str value is not convertible to a bool
- ErrInvalidBool = errors.New("ssl-redirect annotations has invalid value")
-)
-
-type ingAnnotations map[string]string
-
-func (a ingAnnotations) addBaseURL() bool {
- val, ok := a[addBaseURL]
- if ok {
- if b, err := strconv.ParseBool(val); err == nil {
- return b
- }
- }
- return false
-}
-
-func (a ingAnnotations) rewriteTo() string {
- val, ok := a[rewriteTo]
- if ok {
- return val
- }
- return ""
-}
-
-func (a ingAnnotations) sslRedirect() (bool, error) {
- val, ok := a[sslRedirect]
- if !ok {
- return false, ErrMissingSSLRedirect
- }
-
- sr, err := strconv.ParseBool(val)
- if err != nil {
- return false, ErrInvalidBool
- }
-
- return sr, nil
+ AddBaseURL bool `json:"addBaseUrl"`
+ // SSLRedirect indicates if the location section is accessible SSL only
+ SSLRedirect bool `json:"sslRedirect"`
}
// ParseAnnotations parses the annotations contained in the ingress
// rule used to rewrite the defined paths
-func ParseAnnotations(cfg config.Configuration, ing *extensions.Ingress) (*Redirect, error) {
+func ParseAnnotations(cfg defaults.Backend, ing *extensions.Ingress) (*Redirect, error) {
if ing.GetAnnotations() == nil {
return &Redirect{}, errors.New("no annotations present")
}
- annotations := ingAnnotations(ing.GetAnnotations())
-
- sslRe, err := annotations.sslRedirect()
+ sslRe, err := parser.GetBoolAnnotation(sslRedirect, ing)
if err != nil {
sslRe = cfg.SSLRedirect
}
- rt := annotations.rewriteTo()
- abu := annotations.addBaseURL()
+ rt, _ := parser.GetStringAnnotation(rewriteTo, ing)
+ abu, _ := parser.GetBoolAnnotation(addBaseURL, ing)
return &Redirect{
Target: rt,
AddBaseURL: abu,
diff --git a/controllers/nginx/nginx/rewrite/main_test.go b/core/pkg/ingress/annotations/rewrite/main_test.go
similarity index 72%
rename from controllers/nginx/nginx/rewrite/main_test.go
rename to core/pkg/ingress/annotations/rewrite/main_test.go
index 0d38315ffb..c20919fd94 100644
--- a/controllers/nginx/nginx/rewrite/main_test.go
+++ b/core/pkg/ingress/annotations/rewrite/main_test.go
@@ -23,7 +23,7 @@ import (
"k8s.io/kubernetes/pkg/apis/extensions"
"k8s.io/kubernetes/pkg/util/intstr"
- "k8s.io/contrib/ingress/controllers/nginx/nginx/config"
+ "k8s.io/ingress/core/pkg/ingress/defaults"
)
const (
@@ -65,38 +65,9 @@ func buildIngress() *extensions.Ingress {
}
}
-func TestAnnotations(t *testing.T) {
- ing := buildIngress()
-
- r := ingAnnotations(ing.GetAnnotations()).rewriteTo()
- if r != "" {
- t.Error("Expected no redirect")
- }
-
- f := ingAnnotations(ing.GetAnnotations()).addBaseURL()
- if f {
- t.Errorf("Expected false in add-base-url but %v was returend", f)
- }
-
- data := map[string]string{}
- data[rewriteTo] = defRoute
- data[addBaseURL] = "true"
- ing.SetAnnotations(data)
-
- r = ingAnnotations(ing.GetAnnotations()).rewriteTo()
- if r != defRoute {
- t.Errorf("Expected %v in rewrite but %v was returend", defRoute, r)
- }
-
- f = ingAnnotations(ing.GetAnnotations()).addBaseURL()
- if !f {
- t.Errorf("Expected true in add-base-url but %v was returend", f)
- }
-}
-
func TestWithoutAnnotations(t *testing.T) {
ing := buildIngress()
- _, err := ParseAnnotations(config.NewDefault(), ing)
+ _, err := ParseAnnotations(defaults.Backend{}, ing)
if err == nil {
t.Error("Expected error with ingress without annotations")
}
@@ -109,7 +80,7 @@ func TestRedirect(t *testing.T) {
data[rewriteTo] = defRoute
ing.SetAnnotations(data)
- redirect, err := ParseAnnotations(config.NewDefault(), ing)
+ redirect, err := ParseAnnotations(defaults.Backend{}, ing)
if err != nil {
t.Errorf("Uxpected error with ingress: %v", err)
}
@@ -122,7 +93,7 @@ func TestRedirect(t *testing.T) {
func TestSSLRedirect(t *testing.T) {
ing := buildIngress()
- cfg := config.Configuration{SSLRedirect: true}
+ cfg := defaults.Backend{SSLRedirect: true}
data := map[string]string{}
diff --git a/controllers/nginx/nginx/secureupstream/main.go b/core/pkg/ingress/annotations/secureupstream/main.go
similarity index 69%
rename from controllers/nginx/nginx/secureupstream/main.go
rename to core/pkg/ingress/annotations/secureupstream/main.go
index 61e00a9437..32240df32e 100644
--- a/controllers/nginx/nginx/secureupstream/main.go
+++ b/core/pkg/ingress/annotations/secureupstream/main.go
@@ -17,34 +17,17 @@ limitations under the License.
package secureupstream
import (
- "errors"
- "strconv"
-
"k8s.io/kubernetes/pkg/apis/extensions"
+
+ "k8s.io/ingress/core/pkg/ingress/annotations/parser"
)
const (
secureUpstream = "ingress.kubernetes.io/secure-backends"
)
-type ingAnnotations map[string]string
-
-func (a ingAnnotations) secureUpstream() bool {
- val, ok := a[secureUpstream]
- if ok {
- if b, err := strconv.ParseBool(val); err == nil {
- return b
- }
- }
- return false
-}
-
// ParseAnnotations parses the annotations contained in the ingress
// rule used to indicate if the upstream servers should use SSL
func ParseAnnotations(ing *extensions.Ingress) (bool, error) {
- if ing.GetAnnotations() == nil {
- return false, errors.New("no annotations present")
- }
-
- return ingAnnotations(ing.GetAnnotations()).secureUpstream(), nil
+ return parser.GetBoolAnnotation(secureUpstream, ing)
}
diff --git a/controllers/nginx/nginx/secureupstream/main_test.go b/core/pkg/ingress/annotations/secureupstream/main_test.go
similarity index 92%
rename from controllers/nginx/nginx/secureupstream/main_test.go
rename to core/pkg/ingress/annotations/secureupstream/main_test.go
index d2a2b67e3e..eeb319600c 100644
--- a/controllers/nginx/nginx/secureupstream/main_test.go
+++ b/core/pkg/ingress/annotations/secureupstream/main_test.go
@@ -65,9 +65,9 @@ func TestAnnotations(t *testing.T) {
data[secureUpstream] = "true"
ing.SetAnnotations(data)
- su := ingAnnotations(ing.GetAnnotations()).secureUpstream()
- if !su {
- t.Errorf("Expected true in secure-backends but %v was returned", su)
+ _, err := ParseAnnotations(ing)
+ if err != nil {
+ t.Error("Expected error with ingress without annotations")
}
}
diff --git a/core/pkg/ingress/annotations/service/service.go b/core/pkg/ingress/annotations/service/service.go
new file mode 100644
index 0000000000..0615645c80
--- /dev/null
+++ b/core/pkg/ingress/annotations/service/service.go
@@ -0,0 +1,73 @@
+/*
+Copyright 2015 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package service
+
+import (
+ "encoding/json"
+ "fmt"
+ "strconv"
+
+ "k8s.io/kubernetes/pkg/api"
+
+ "github.com/golang/glog"
+)
+
+const (
+ // NamedPortAnnotation annotation used to map named port in services
+ NamedPortAnnotation = "ingress.kubernetes.io/named-ports"
+)
+
+type namedPortMapping map[string]string
+
+// getPort returns the port defined in a named port
+func (npm namedPortMapping) getPort(name string) (string, bool) {
+ val, ok := npm.getPortMappings()[name]
+ return val, ok
+}
+
+// getPortMappings returns a map containing the mapping of named ports names and number
+func (npm namedPortMapping) getPortMappings() map[string]string {
+ data := npm[NamedPortAnnotation]
+ var mapping map[string]string
+ if data == "" {
+ return mapping
+ }
+ if err := json.Unmarshal([]byte(data), &mapping); err != nil {
+ glog.Errorf("unexpected error reading annotations: %v", err)
+ }
+
+ return mapping
+}
+
+// GetPortMapping returns the number of the named port or an error if is not valid
+func GetPortMapping(name string, s *api.Service) (int32, error) {
+ if s == nil {
+ return -1, fmt.Errorf("impossible to extract por mapping from %v (missing service)", name)
+ }
+ namedPorts := s.ObjectMeta.Annotations
+ val, ok := namedPortMapping(namedPorts).getPort(name)
+ if ok {
+ port, err := strconv.Atoi(val)
+ if err != nil {
+ return -1, fmt.Errorf("service %v contains an invalid port mapping for %v (%v), %v", s.Name, name, val, err)
+ }
+
+ return int32(port), nil
+ }
+
+ return -1, fmt.Errorf("there is no port with name %v", name)
+}
diff --git a/core/pkg/ingress/annotations/sslpassthrough/main.go b/core/pkg/ingress/annotations/sslpassthrough/main.go
new file mode 100644
index 0000000000..765cca227d
--- /dev/null
+++ b/core/pkg/ingress/annotations/sslpassthrough/main.go
@@ -0,0 +1,45 @@
+/*
+Copyright 2016 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package sslpassthrough
+
+import (
+ "fmt"
+
+ "k8s.io/kubernetes/pkg/apis/extensions"
+
+ "k8s.io/ingress/core/pkg/ingress/annotations/parser"
+ "k8s.io/ingress/core/pkg/ingress/defaults"
+)
+
+const (
+ passthrough = "ingress.kubernetes.io/ssl-passthrough"
+)
+
+// ParseAnnotations parses the annotations contained in the ingress
+// rule used to indicate if is required to configure
+func ParseAnnotations(cfg defaults.Backend, ing *extensions.Ingress) (bool, error) {
+
+ if ing.GetAnnotations() == nil {
+ return false, parser.ErrMissingAnnotations
+ }
+
+ if len(ing.Spec.TLS) == 0 {
+ return false, fmt.Errorf("ingres rule %v/%v does not contains a TLS section", ing.Name, ing.Namespace)
+ }
+
+ return parser.GetBoolAnnotation(passthrough, ing)
+}
diff --git a/core/pkg/ingress/annotations/sslpassthrough/main_test.go b/core/pkg/ingress/annotations/sslpassthrough/main_test.go
new file mode 100644
index 0000000000..1ae6d64b36
--- /dev/null
+++ b/core/pkg/ingress/annotations/sslpassthrough/main_test.go
@@ -0,0 +1,74 @@
+/*
+Copyright 2016 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package sslpassthrough
+
+import (
+ "testing"
+
+ "k8s.io/kubernetes/pkg/api"
+ "k8s.io/kubernetes/pkg/apis/extensions"
+ "k8s.io/kubernetes/pkg/util/intstr"
+
+ "k8s.io/ingress/core/pkg/ingress/defaults"
+)
+
+func buildIngress() *extensions.Ingress {
+ return &extensions.Ingress{
+ ObjectMeta: api.ObjectMeta{
+ Name: "foo",
+ Namespace: api.NamespaceDefault,
+ },
+ Spec: extensions.IngressSpec{
+ Backend: &extensions.IngressBackend{
+ ServiceName: "default-backend",
+ ServicePort: intstr.FromInt(80),
+ },
+ },
+ }
+}
+
+func TestParseAnnotations(t *testing.T) {
+ ing := buildIngress()
+
+ _, err := ParseAnnotations(defaults.Backend{}, ing)
+ if err == nil {
+ t.Errorf("unexpected error: %v", err)
+ }
+
+ data := map[string]string{}
+ data[passthrough] = "true"
+ ing.SetAnnotations(data)
+ // test ingress using the annotation without a TLS section
+ val, err := ParseAnnotations(defaults.Backend{}, ing)
+ if err == nil {
+ t.Errorf("expected error parsing an invalid cidr")
+ }
+
+ // test with a valid host
+ ing.Spec.TLS = []extensions.IngressTLS{
+ {
+ Hosts: []string{"foo.bar.com"},
+ },
+ }
+ val, err = ParseAnnotations(defaults.Backend{}, ing)
+ if err != nil {
+ t.Errorf("expected error parsing an invalid cidr")
+ }
+ if !val {
+ t.Errorf("expected true but false returned")
+ }
+}
diff --git a/core/pkg/ingress/controller/backend_ssl.go b/core/pkg/ingress/controller/backend_ssl.go
new file mode 100644
index 0000000000..92c32fc8c8
--- /dev/null
+++ b/core/pkg/ingress/controller/backend_ssl.go
@@ -0,0 +1,162 @@
+/*
+Copyright 2015 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package controller
+
+import (
+ "fmt"
+ "strings"
+ "time"
+
+ "github.com/golang/glog"
+
+ "k8s.io/kubernetes/pkg/api"
+ "k8s.io/kubernetes/pkg/apis/extensions"
+ "k8s.io/kubernetes/pkg/client/cache"
+
+ "k8s.io/ingress/core/pkg/ingress"
+ "k8s.io/ingress/core/pkg/ingress/annotations/parser"
+ ssl "k8s.io/ingress/core/pkg/net/ssl"
+)
+
+// syncSecret keeps in sync Secrets used by Ingress rules with the files on
+// disk to allow being used in controllers.
+func (ic *GenericController) syncSecret(k interface{}) error {
+ if ic.secretQueue.IsShuttingDown() {
+ return nil
+ }
+ if !ic.controllersInSync() {
+ time.Sleep(podStoreSyncedPollPeriod)
+ return fmt.Errorf("deferring sync till endpoints controller has synced")
+ }
+
+ // check if the default certificate is configured
+ key := fmt.Sprintf("default/%v", defServerName)
+ _, exists := ic.sslCertTracker.Get(key)
+ var cert *ingress.SSLCert
+ var err error
+ if !exists {
+ if ic.cfg.DefaultSSLCertificate != "" {
+ cert, err = ic.getPemCertificate(ic.cfg.DefaultSSLCertificate)
+ if err != nil {
+ return err
+ }
+ } else {
+ defCert, defKey := ssl.GetFakeSSLCert()
+ cert, err = ssl.AddOrUpdateCertAndKey("system-snake-oil-certificate", defCert, defKey, []byte{})
+ if err != nil {
+ return nil
+ }
+ }
+ cert.Name = defServerName
+ cert.Namespace = api.NamespaceDefault
+ ic.sslCertTracker.Add(key, cert)
+ }
+
+ key = k.(string)
+
+ secObj, exists, err := ic.secrLister.Store.GetByKey(key)
+ if err != nil {
+ return fmt.Errorf("error getting secret %v: %v", key, err)
+ }
+ if !exists {
+ return fmt.Errorf("secret %v was not found", key)
+ }
+ sec := secObj.(*api.Secret)
+ if !ic.secrReferenced(sec.Name, sec.Namespace) {
+ glog.V(3).Infof("secret %v/%v is not used in Ingress rules. skipping ", sec.Namespace, sec.Name)
+ return nil
+ }
+
+ cert, err = ic.getPemCertificate(key)
+ if err != nil {
+ return err
+ }
+
+ // create certificates and add or update the item in the store
+ _, exists = ic.sslCertTracker.Get(key)
+ if exists {
+ glog.V(3).Infof("updating secret %v/%v in the store ", sec.Namespace, sec.Name)
+ ic.sslCertTracker.Update(key, cert)
+ return nil
+ }
+ glog.V(3).Infof("adding secret %v/%v to the store ", sec.Namespace, sec.Name)
+ ic.sslCertTracker.Add(key, cert)
+ return nil
+}
+
+func (ic *GenericController) getPemCertificate(secretName string) (*ingress.SSLCert, error) {
+ secretInterface, exists, err := ic.secrLister.Store.GetByKey(secretName)
+ if err != nil {
+ return nil, fmt.Errorf("error retriveing secret %v: %v", secretName, err)
+ }
+ if !exists {
+ return nil, fmt.Errorf("secret named %v does not exists", secretName)
+ }
+
+ secret := secretInterface.(*api.Secret)
+ cert, ok := secret.Data[api.TLSCertKey]
+ if !ok {
+ return nil, fmt.Errorf("secret named %v has no private key", secretName)
+ }
+ key, ok := secret.Data[api.TLSPrivateKeyKey]
+ if !ok {
+ return nil, fmt.Errorf("secret named %v has no cert", secretName)
+ }
+
+ ca := secret.Data["ca.crt"]
+
+ nsSecName := strings.Replace(secretName, "/", "-", -1)
+ s, err := ssl.AddOrUpdateCertAndKey(nsSecName, cert, key, ca)
+ if err != nil {
+ return nil, err
+ }
+
+ s.Name = secret.Name
+ s.Namespace = secret.Namespace
+ return s, nil
+}
+
+// secrReferenced checks if a secret is referenced or not by one or more Ingress rules
+func (ic *GenericController) secrReferenced(name, namespace string) bool {
+ for _, ingIf := range ic.ingLister.Store.List() {
+ ing := ingIf.(*extensions.Ingress)
+ str, err := parser.GetStringAnnotation("ingress.kubernetes.io/auth-tls-secret", ing)
+ if err == nil && str == fmt.Sprintf("%v/%v", namespace, name) {
+ return true
+ }
+ if ing.Namespace != namespace {
+ continue
+ }
+ for _, tls := range ing.Spec.TLS {
+ if tls.SecretName == name {
+ return true
+ }
+ }
+ }
+ return false
+}
+
+// sslCertTracker holds a store of referenced Secrets in Ingress rules
+type sslCertTracker struct {
+ cache.ThreadSafeStore
+}
+
+func newSSLCertTracker() *sslCertTracker {
+ return &sslCertTracker{
+ cache.NewThreadSafeStore(cache.Indexers{}, cache.Indices{}),
+ }
+}
diff --git a/core/pkg/ingress/controller/controller.go b/core/pkg/ingress/controller/controller.go
new file mode 100644
index 0000000000..1306e4e014
--- /dev/null
+++ b/core/pkg/ingress/controller/controller.go
@@ -0,0 +1,1061 @@
+/*
+Copyright 2015 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package controller
+
+import (
+ "fmt"
+ "net/http"
+ "reflect"
+ "sort"
+ "strconv"
+ "strings"
+ "sync"
+ "time"
+
+ "github.com/golang/glog"
+
+ "k8s.io/kubernetes/pkg/api"
+ "k8s.io/kubernetes/pkg/apis/extensions"
+ "k8s.io/kubernetes/pkg/client/cache"
+ clientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset"
+ unversionedcore "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/typed/core/internalversion"
+ "k8s.io/kubernetes/pkg/client/record"
+ "k8s.io/kubernetes/pkg/fields"
+ "k8s.io/kubernetes/pkg/healthz"
+ "k8s.io/kubernetes/pkg/util/flowcontrol"
+ "k8s.io/kubernetes/pkg/util/intstr"
+
+ cache_store "k8s.io/ingress/core/pkg/cache"
+ "k8s.io/ingress/core/pkg/ingress"
+ "k8s.io/ingress/core/pkg/ingress/annotations/auth"
+ "k8s.io/ingress/core/pkg/ingress/annotations/authreq"
+ "k8s.io/ingress/core/pkg/ingress/annotations/authtls"
+ "k8s.io/ingress/core/pkg/ingress/annotations/cors"
+ "k8s.io/ingress/core/pkg/ingress/annotations/healthcheck"
+ "k8s.io/ingress/core/pkg/ingress/annotations/ipwhitelist"
+ "k8s.io/ingress/core/pkg/ingress/annotations/proxy"
+ "k8s.io/ingress/core/pkg/ingress/annotations/ratelimit"
+ "k8s.io/ingress/core/pkg/ingress/annotations/rewrite"
+ "k8s.io/ingress/core/pkg/ingress/annotations/secureupstream"
+ "k8s.io/ingress/core/pkg/ingress/annotations/service"
+ "k8s.io/ingress/core/pkg/ingress/annotations/sslpassthrough"
+ "k8s.io/ingress/core/pkg/ingress/status"
+ "k8s.io/ingress/core/pkg/k8s"
+ local_strings "k8s.io/ingress/core/pkg/strings"
+ "k8s.io/ingress/core/pkg/task"
+)
+
+const (
+ defUpstreamName = "upstream-default-backend"
+ defServerName = "_"
+ podStoreSyncedPollPeriod = 1 * time.Second
+ rootLocation = "/"
+
+ // ingressClassKey picks a specific "class" for the Ingress. The controller
+ // only processes Ingresses with this annotation either unset, or set
+ // to either the configured value or the empty string.
+ ingressClassKey = "kubernetes.io/ingress.class"
+)
+
+var (
+ // list of ports that cannot be used by TCP or UDP services
+ reservedPorts = []string{"80", "443", "8181", "18080"}
+)
+
+// GenericController holds the boilerplate code required to build an Ingress controlller.
+type GenericController struct {
+ healthz.HealthzChecker
+
+ cfg *Configuration
+
+ ingController *cache.Controller
+ endpController *cache.Controller
+ svcController *cache.Controller
+ secrController *cache.Controller
+ mapController *cache.Controller
+
+ ingLister cache_store.StoreToIngressLister
+ svcLister cache.StoreToServiceLister
+ endpLister cache.StoreToEndpointsLister
+ secrLister cache_store.StoreToSecretsLister
+ mapLister cache_store.StoreToConfigmapLister
+
+ recorder record.EventRecorder
+
+ syncQueue *task.Queue
+
+ syncStatus status.Sync
+
+ // local store of SSL certificates
+ // (only certificates used in ingress)
+ sslCertTracker *sslCertTracker
+ // TaskQueue in charge of keep the secrets referenced from Ingress
+ // in sync with the files on disk
+ secretQueue *task.Queue
+
+ syncRateLimiter flowcontrol.RateLimiter
+
+ // stopLock is used to enforce only a single call to Stop is active.
+ // Needed because we allow stopping through an http endpoint and
+ // allowing concurrent stoppers leads to stack traces.
+ stopLock *sync.Mutex
+
+ stopCh chan struct{}
+}
+
+// Configuration contains all the settings required by an Ingress controller
+type Configuration struct {
+ Client *clientset.Clientset
+
+ ResyncPeriod time.Duration
+ DefaultService string
+ IngressClass string
+ Namespace string
+ ConfigMapName string
+ // optional
+ TCPConfigMapName string
+ // optional
+ UDPConfigMapName string
+ DefaultSSLCertificate string
+ DefaultHealthzURL string
+ // optional
+ PublishService string
+ // Backend is the particular implementation to be used.
+ // (for instance NGINX)
+ Backend ingress.Controller
+}
+
+// newIngressController creates an Ingress controller
+func newIngressController(config *Configuration) *GenericController {
+
+ eventBroadcaster := record.NewBroadcaster()
+ eventBroadcaster.StartLogging(glog.Infof)
+ eventBroadcaster.StartRecordingToSink(unversionedcore.EventSinkImpl{
+ Interface: config.Client.Core().Events(config.Namespace),
+ })
+
+ ic := GenericController{
+ cfg: config,
+ stopLock: &sync.Mutex{},
+ stopCh: make(chan struct{}),
+ syncRateLimiter: flowcontrol.NewTokenBucketRateLimiter(0.1, 1),
+ recorder: eventBroadcaster.NewRecorder(api.EventSource{
+ Component: "ingress-controller",
+ }),
+ sslCertTracker: newSSLCertTracker(),
+ }
+
+ ic.syncQueue = task.NewTaskQueue(ic.sync)
+ ic.secretQueue = task.NewTaskQueue(ic.syncSecret)
+
+ // from here to the end of the method all the code is just boilerplate
+ // required to watch Ingress, Secrets, ConfigMaps and Endoints.
+ // This is used to detect new content, updates or removals and act accordingly
+ ingEventHandler := cache.ResourceEventHandlerFuncs{
+ AddFunc: func(obj interface{}) {
+ addIng := obj.(*extensions.Ingress)
+ if !IsValidClass(addIng, config.IngressClass) {
+ glog.Infof("ignoring add for ingress %v based on annotation %v", addIng.Name, ingressClassKey)
+ return
+ }
+ ic.recorder.Eventf(addIng, api.EventTypeNormal, "CREATE", fmt.Sprintf("Ingress %s/%s", addIng.Namespace, addIng.Name))
+ ic.syncQueue.Enqueue(obj)
+ },
+ DeleteFunc: func(obj interface{}) {
+ delIng := obj.(*extensions.Ingress)
+ if !IsValidClass(delIng, config.IngressClass) {
+ glog.Infof("ignoring add for ingress %v based on annotation %v", delIng.Name, ingressClassKey)
+ return
+ }
+ ic.recorder.Eventf(delIng, api.EventTypeNormal, "DELETE", fmt.Sprintf("Ingress %s/%s", delIng.Namespace, delIng.Name))
+ ic.syncQueue.Enqueue(obj)
+ },
+ UpdateFunc: func(old, cur interface{}) {
+ curIng := cur.(*extensions.Ingress)
+ if !IsValidClass(curIng, config.IngressClass) {
+ return
+ }
+
+ if !reflect.DeepEqual(old, cur) {
+ upIng := cur.(*extensions.Ingress)
+ ic.recorder.Eventf(upIng, api.EventTypeNormal, "UPDATE", fmt.Sprintf("Ingress %s/%s", upIng.Namespace, upIng.Name))
+ ic.syncQueue.Enqueue(cur)
+ }
+ },
+ }
+
+ secrEventHandler := cache.ResourceEventHandlerFuncs{
+ AddFunc: func(obj interface{}) {
+ sec := obj.(*api.Secret)
+ ic.secretQueue.Enqueue(sec)
+ },
+ DeleteFunc: func(obj interface{}) {
+ sec := obj.(*api.Secret)
+ ic.sslCertTracker.Delete(fmt.Sprintf("%v/%v", sec.Namespace, sec.Name))
+ },
+ UpdateFunc: func(old, cur interface{}) {
+ if !reflect.DeepEqual(old, cur) {
+ sec := cur.(*api.Secret)
+ ic.secretQueue.Enqueue(sec)
+ }
+ },
+ }
+
+ eventHandler := cache.ResourceEventHandlerFuncs{
+ AddFunc: func(obj interface{}) {
+ ic.syncQueue.Enqueue(obj)
+ },
+ DeleteFunc: func(obj interface{}) {
+ ic.syncQueue.Enqueue(obj)
+ },
+ UpdateFunc: func(old, cur interface{}) {
+ if !reflect.DeepEqual(old, cur) {
+ ic.syncQueue.Enqueue(cur)
+ }
+ },
+ }
+
+ mapEventHandler := cache.ResourceEventHandlerFuncs{
+ UpdateFunc: func(old, cur interface{}) {
+ if !reflect.DeepEqual(old, cur) {
+ upCmap := cur.(*api.ConfigMap)
+ mapKey := fmt.Sprintf("%s/%s", upCmap.Namespace, upCmap.Name)
+ // updates to configuration configmaps can trigger an update
+ if mapKey == ic.cfg.ConfigMapName || mapKey == ic.cfg.TCPConfigMapName || mapKey == ic.cfg.UDPConfigMapName {
+ ic.recorder.Eventf(upCmap, api.EventTypeNormal, "UPDATE", fmt.Sprintf("ConfigMap %v", mapKey))
+ ic.syncQueue.Enqueue(cur)
+ }
+ }
+ },
+ }
+
+ ic.ingLister.Store, ic.ingController = cache.NewInformer(
+ cache.NewListWatchFromClient(ic.cfg.Client.Extensions().RESTClient(), "ingresses", ic.cfg.Namespace, fields.Everything()),
+ &extensions.Ingress{}, ic.cfg.ResyncPeriod, ingEventHandler)
+
+ ic.endpLister.Store, ic.endpController = cache.NewInformer(
+ cache.NewListWatchFromClient(ic.cfg.Client.Core().RESTClient(), "endpoints", ic.cfg.Namespace, fields.Everything()),
+ &api.Endpoints{}, ic.cfg.ResyncPeriod, eventHandler)
+
+ ic.secrLister.Store, ic.secrController = cache.NewInformer(
+ cache.NewListWatchFromClient(ic.cfg.Client.Core().RESTClient(), "secrets", ic.cfg.Namespace, fields.Everything()),
+ &api.Secret{}, ic.cfg.ResyncPeriod, secrEventHandler)
+
+ ic.mapLister.Store, ic.mapController = cache.NewInformer(
+ cache.NewListWatchFromClient(ic.cfg.Client.Core().RESTClient(), "configmaps", ic.cfg.Namespace, fields.Everything()),
+ &api.ConfigMap{}, ic.cfg.ResyncPeriod, mapEventHandler)
+
+ ic.svcLister.Indexer, ic.svcController = cache.NewIndexerInformer(
+ cache.NewListWatchFromClient(ic.cfg.Client.Core().RESTClient(), "services", ic.cfg.Namespace, fields.Everything()),
+ &api.Service{},
+ ic.cfg.ResyncPeriod,
+ cache.ResourceEventHandlerFuncs{},
+ cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc})
+
+ ic.syncStatus = status.NewStatusSyncer(status.Config{
+ Client: config.Client,
+ PublishService: ic.cfg.PublishService,
+ IngressLister: ic.ingLister,
+ })
+
+ return &ic
+}
+
+func (ic *GenericController) controllersInSync() bool {
+ return ic.ingController.HasSynced() &&
+ ic.svcController.HasSynced() &&
+ ic.endpController.HasSynced() &&
+ ic.secrController.HasSynced() &&
+ ic.mapController.HasSynced()
+}
+
+// Name returns the healthcheck name
+func (ic GenericController) Name() string {
+ return "Ingress Controller"
+}
+
+// Check returns if the nginx healthz endpoint is returning ok (status code 200)
+func (ic GenericController) Check(_ *http.Request) error {
+ res, err := http.Get("http://127.0.0.1:18080/healthz")
+ if err != nil {
+ return err
+ }
+ defer res.Body.Close()
+ if res.StatusCode != 200 {
+ return fmt.Errorf("Ingress controller is not healthy")
+ }
+ return nil
+}
+
+// Info returns information about the backend
+func (ic GenericController) Info() *ingress.BackendInfo {
+ return ic.cfg.Backend.Info()
+}
+
+// IngressClass returns information about the backend
+func (ic GenericController) IngressClass() string {
+ return ic.cfg.IngressClass
+}
+
+// getSecret searchs for a secret in the local secrets Store
+func (ic *GenericController) getSecret(name string) (*api.Secret, error) {
+ s, exists, err := ic.secrLister.Store.GetByKey(name)
+ if err != nil {
+ return nil, err
+ }
+ if !exists {
+ return nil, fmt.Errorf("secret %v was not found", name)
+ }
+ return s.(*api.Secret), nil
+}
+
+func (ic *GenericController) getConfigMap(ns, name string) (*api.ConfigMap, error) {
+ // TODO: check why ic.mapLister.Store.GetByKey(mapKey) is not stable (random content)
+ return ic.cfg.Client.ConfigMaps(ns).Get(name)
+}
+
+// sync collects all the pieces required to assemble the configuration file and
+// then sends the content to the backend (OnUpdate) receiving the populated
+// template as response reloading the backend if is required.
+func (ic *GenericController) sync(key interface{}) error {
+ ic.syncRateLimiter.Accept()
+
+ if ic.syncQueue.IsShuttingDown() {
+ return nil
+ }
+
+ if !ic.controllersInSync() {
+ time.Sleep(podStoreSyncedPollPeriod)
+ return fmt.Errorf("deferring sync till endpoints controller has synced")
+ }
+
+ // by default no custom configuration
+ cfg := &api.ConfigMap{}
+
+ if ic.cfg.ConfigMapName != "" {
+ // search for custom configmap (defined in main args)
+ var err error
+ ns, name, _ := k8s.ParseNameNS(ic.cfg.ConfigMapName)
+ cfg, err = ic.getConfigMap(ns, name)
+ if err != nil {
+ // requeue
+ return fmt.Errorf("unexpected error searching configmap %v: %v", ic.cfg.ConfigMapName, err)
+ }
+ }
+
+ upstreams, servers := ic.getBackendServers()
+ var passUpstreams []*ingress.SSLPassthroughBackend
+ for _, server := range servers {
+ if !server.SSLPassthrough {
+ continue
+ }
+
+ for _, loc := range server.Locations {
+ if loc.Path != rootLocation {
+ continue
+ }
+ passUpstreams = append(passUpstreams, &ingress.SSLPassthroughBackend{
+ Backend: loc.Backend,
+ Hostname: server.Hostname,
+ })
+ break
+ }
+ }
+
+ data, err := ic.cfg.Backend.OnUpdate(cfg, ingress.Configuration{
+ Backends: upstreams,
+ Servers: servers,
+ TCPEndpoints: ic.getTCPServices(),
+ UPDEndpoints: ic.getUDPServices(),
+ PassthroughBackends: passUpstreams,
+ })
+ if err != nil {
+ return err
+ }
+
+ out, reloaded, err := ic.cfg.Backend.Reload(data)
+ if err != nil {
+ incReloadErrorCount()
+ glog.Errorf("unexpected failure restarting the backend: \n%v", string(out))
+ return err
+ }
+ if reloaded {
+ glog.Infof("ingress backend successfully reloaded...")
+ incReloadCount()
+ }
+ return nil
+}
+
+func (ic *GenericController) getTCPServices() []*ingress.Location {
+ if ic.cfg.TCPConfigMapName == "" {
+ // no configmap for TCP services
+ return []*ingress.Location{}
+ }
+
+ ns, name, err := k8s.ParseNameNS(ic.cfg.TCPConfigMapName)
+ if err != nil {
+ glog.Warningf("%v", err)
+ return []*ingress.Location{}
+ }
+ tcpMap, err := ic.getConfigMap(ns, name)
+ if err != nil {
+ glog.V(5).Infof("no configured tcp services found: %v", err)
+ return []*ingress.Location{}
+ }
+
+ return ic.getStreamServices(tcpMap.Data, api.ProtocolTCP)
+}
+
+func (ic *GenericController) getUDPServices() []*ingress.Location {
+ if ic.cfg.UDPConfigMapName == "" {
+ // no configmap for TCP services
+ return []*ingress.Location{}
+ }
+
+ ns, name, err := k8s.ParseNameNS(ic.cfg.UDPConfigMapName)
+ if err != nil {
+ glog.Warningf("%v", err)
+ return []*ingress.Location{}
+ }
+ tcpMap, err := ic.getConfigMap(ns, name)
+ if err != nil {
+ glog.V(3).Infof("no configured tcp services found: %v", err)
+ return []*ingress.Location{}
+ }
+
+ return ic.getStreamServices(tcpMap.Data, api.ProtocolUDP)
+}
+
+func (ic *GenericController) getStreamServices(data map[string]string, proto api.Protocol) []*ingress.Location {
+ var svcs []*ingress.Location
+ // k -> port to expose
+ // v -> /:
+ for k, v := range data {
+ port, err := strconv.Atoi(k)
+ if err != nil {
+ glog.Warningf("%v is not valid as a TCP port", k)
+ continue
+ }
+
+ // this ports used by the backend
+ if local_strings.StringInSlice(k, reservedPorts) {
+ glog.Warningf("port %v cannot be used for TCP or UDP services. It is reserved for the Ingress controller", k)
+ continue
+ }
+
+ nsSvcPort := strings.Split(v, ":")
+ if len(nsSvcPort) != 2 {
+ glog.Warningf("invalid format (namespace/name:port) '%v'", k)
+ continue
+ }
+
+ nsName := nsSvcPort[0]
+ svcPort := nsSvcPort[1]
+
+ svcNs, svcName, err := k8s.ParseNameNS(nsName)
+ if err != nil {
+ glog.Warningf("%v", err)
+ continue
+ }
+
+ svcObj, svcExists, err := ic.svcLister.Indexer.GetByKey(nsName)
+ if err != nil {
+ glog.Warningf("error getting service %v: %v", nsName, err)
+ continue
+ }
+
+ if !svcExists {
+ glog.Warningf("service %v was not found", nsName)
+ continue
+ }
+
+ svc := svcObj.(*api.Service)
+
+ var endps []ingress.Endpoint
+ targetPort, err := strconv.Atoi(svcPort)
+ if err != nil {
+ for _, sp := range svc.Spec.Ports {
+ if sp.Name == svcPort {
+ endps = ic.getEndpoints(svc, sp.TargetPort, proto, &healthcheck.Upstream{})
+ break
+ }
+ }
+ } else {
+ // we need to use the TargetPort (where the endpoints are running)
+ for _, sp := range svc.Spec.Ports {
+ if sp.Port == int32(targetPort) {
+ endps = ic.getEndpoints(svc, sp.TargetPort, proto, &healthcheck.Upstream{})
+ break
+ }
+ }
+ }
+
+ sort.Sort(ingress.EndpointByAddrPort(endps))
+
+ // tcp upstreams cannot contain empty upstreams and there is no
+ // default backend equivalent for TCP
+ if len(endps) == 0 {
+ glog.Warningf("service %v/%v does not have any active endpoints", svcNs, svcName)
+ continue
+ }
+
+ svcs = append(svcs, &ingress.Location{
+ Path: k,
+ Backend: fmt.Sprintf("%v-%v-%v", svcNs, svcName, port),
+ })
+ }
+
+ return svcs
+}
+
+// getDefaultUpstream returns an upstream associated with the
+// default backend service. In case of error retrieving information
+// configure the upstream to return http code 503.
+func (ic *GenericController) getDefaultUpstream() *ingress.Backend {
+ upstream := &ingress.Backend{
+ Name: defUpstreamName,
+ }
+ svcKey := ic.cfg.DefaultService
+ svcObj, svcExists, err := ic.svcLister.Indexer.GetByKey(svcKey)
+ if err != nil {
+ glog.Warningf("unexpected error searching the default backend %v: %v", ic.cfg.DefaultService, err)
+ upstream.Endpoints = append(upstream.Endpoints, newDefaultServer())
+ return upstream
+ }
+
+ if !svcExists {
+ glog.Warningf("service %v does not exists", svcKey)
+ upstream.Endpoints = append(upstream.Endpoints, newDefaultServer())
+ return upstream
+ }
+
+ svc := svcObj.(*api.Service)
+ endps := ic.getEndpoints(svc, svc.Spec.Ports[0].TargetPort, api.ProtocolTCP, &healthcheck.Upstream{})
+ if len(endps) == 0 {
+ glog.Warningf("service %v does not have any active endpoints", svcKey)
+ endps = []ingress.Endpoint{newDefaultServer()}
+ }
+
+ upstream.Endpoints = append(upstream.Endpoints, endps...)
+ return upstream
+}
+
+type ingressByRevision []interface{}
+
+func (c ingressByRevision) Len() int { return len(c) }
+func (c ingressByRevision) Swap(i, j int) { c[i], c[j] = c[j], c[i] }
+func (c ingressByRevision) Less(i, j int) bool {
+ ir := c[i].(*extensions.Ingress).ResourceVersion
+ jr := c[j].(*extensions.Ingress).ResourceVersion
+ return ir < jr
+}
+
+// getBackendServers returns a list of Upstream and Server to be used by the backend
+// An upstream can be used in multiple servers if the namespace, service name and port are the same
+func (ic *GenericController) getBackendServers() ([]*ingress.Backend, []*ingress.Server) {
+ ings := ic.ingLister.Store.List()
+ sort.Sort(ingressByRevision(ings))
+
+ upstreams := ic.createUpstreams(ings)
+ servers := ic.createServers(ings, upstreams)
+
+ upsDefaults := ic.cfg.Backend.BackendDefaults()
+
+ for _, ingIf := range ings {
+ ing := ingIf.(*extensions.Ingress)
+
+ nginxAuth, err := auth.ParseAnnotations(ing, auth.DefAuthDirectory, ic.getSecret)
+ glog.V(5).Infof("auth annotation: %v", nginxAuth)
+ if err != nil {
+ glog.V(5).Infof("error reading authentication in Ingress %v/%v: %v", ing.GetNamespace(), ing.GetName(), err)
+ }
+
+ rl, err := ratelimit.ParseAnnotations(ing)
+ glog.V(5).Infof("rate limit annotation: %v", rl)
+ if err != nil {
+ glog.V(5).Infof("error reading rate limit annotation in Ingress %v/%v: %v", ing.GetNamespace(), ing.GetName(), err)
+ }
+
+ locRew, err := rewrite.ParseAnnotations(upsDefaults, ing)
+ if err != nil {
+ glog.V(5).Infof("error parsing rewrite annotations for Ingress rule %v/%v: %v", ing.GetNamespace(), ing.GetName(), err)
+ }
+
+ wl, err := ipwhitelist.ParseAnnotations(upsDefaults, ing)
+ glog.V(5).Infof("white list annotation: %v", wl)
+ if err != nil {
+ glog.V(5).Infof("error reading white list annotation in Ingress %v/%v: %v", ing.GetNamespace(), ing.GetName(), err)
+ }
+
+ eCORS, err := cors.ParseAnnotations(ing)
+ if err != nil {
+ glog.V(5).Infof("error reading CORS annotation in Ingress %v/%v: %v", ing.GetNamespace(), ing.GetName(), err)
+ }
+
+ ra, err := authreq.ParseAnnotations(ing)
+ glog.V(5).Infof("auth request annotation: %v", ra)
+ if err != nil {
+ glog.V(5).Infof("error reading auth request annotation in Ingress %v/%v: %v", ing.GetNamespace(), ing.GetName(), err)
+ }
+
+ prx := proxy.ParseAnnotations(upsDefaults, ing)
+ glog.V(5).Infof("proxy timeouts annotation: %v", prx)
+
+ certAuth, err := authtls.ParseAnnotations(ing, ic.getAuthCertificate)
+ glog.V(5).Infof("auth request annotation: %v", certAuth)
+ if err != nil {
+ glog.V(5).Infof("error reading certificate auth annotation in Ingress %v/%v: %v", ing.GetNamespace(), ing.GetName(), err)
+ }
+
+ for _, rule := range ing.Spec.Rules {
+ host := rule.Host
+ if host == "" {
+ host = defServerName
+ }
+ server := servers[host]
+ if server == nil {
+ server = servers[defServerName]
+ }
+
+ // use default upstream
+ defBackend := upstreams[defUpstreamName]
+ // we need to check if the spec contains the default backend
+ if ing.Spec.Backend != nil {
+ glog.V(3).Infof("ingress rule %v/%v defines a default Backend %v/%v",
+ ing.Namespace,
+ ing.Name,
+ ing.Spec.Backend.ServiceName,
+ ing.Spec.Backend.ServicePort.String())
+
+ name := fmt.Sprintf("%v-%v-%v",
+ ing.GetNamespace(),
+ ing.Spec.Backend.ServiceName,
+ ing.Spec.Backend.ServicePort.String())
+
+ if defUps, ok := upstreams[name]; ok {
+ defBackend = defUps
+ }
+ }
+
+ if rule.HTTP == nil &&
+ len(ing.Spec.TLS) == 0 &&
+ host != defServerName {
+ glog.V(3).Infof("ingress rule %v/%v does not contains HTTP or TLS rules. using default backend", ing.Namespace, ing.Name)
+ server.Locations[0].Backend = defBackend.Name
+ continue
+ }
+
+ for _, path := range rule.HTTP.Paths {
+ upsName := fmt.Sprintf("%v-%v-%v",
+ ing.GetNamespace(),
+ path.Backend.ServiceName,
+ path.Backend.ServicePort.String())
+
+ ups := upstreams[upsName]
+
+ // if there's no path defined we assume /
+ nginxPath := rootLocation
+ if path.Path != "" {
+ nginxPath = path.Path
+ }
+
+ addLoc := true
+ for _, loc := range server.Locations {
+ if loc.Path == nginxPath {
+ addLoc = false
+
+ if !loc.IsDefBackend {
+ glog.V(3).Infof("avoiding replacement of ingress rule %v/%v location %v upstream %v (%v)", ing.Namespace, ing.Name, loc.Path, ups.Name, loc.Backend)
+ break
+ }
+
+ glog.V(3).Infof("replacing ingress rule %v/%v location %v upstream %v (%v)", ing.Namespace, ing.Name, loc.Path, ups.Name, loc.Backend)
+ loc.Backend = ups.Name
+ loc.IsDefBackend = false
+ loc.BasicDigestAuth = *nginxAuth
+ loc.RateLimit = *rl
+ loc.Redirect = *locRew
+ loc.Whitelist = *wl
+ loc.Backend = ups.Name
+ loc.EnableCORS = eCORS
+ loc.ExternalAuth = ra
+ loc.Proxy = *prx
+ loc.CertificateAuth = *certAuth
+ break
+ }
+ }
+ // is a new location
+ if addLoc {
+ glog.V(3).Infof("adding location %v in ingress rule %v/%v upstream %v", nginxPath, ing.Namespace, ing.Name, ups.Name)
+ server.Locations = append(server.Locations, &ingress.Location{
+ Path: nginxPath,
+ Backend: ups.Name,
+ IsDefBackend: false,
+ BasicDigestAuth: *nginxAuth,
+ RateLimit: *rl,
+ Redirect: *locRew,
+ Whitelist: *wl,
+ EnableCORS: eCORS,
+ ExternalAuth: ra,
+ Proxy: *prx,
+ CertificateAuth: *certAuth,
+ })
+ }
+ }
+ }
+ }
+
+ // TODO: find a way to make this more readable
+ // The structs must be ordered to always generate the same file
+ // if the content does not change.
+ aUpstreams := make([]*ingress.Backend, 0, len(upstreams))
+ for _, value := range upstreams {
+ if len(value.Endpoints) == 0 {
+ glog.V(3).Infof("upstream %v does not have any active endpoints. Using default backend", value.Name)
+ value.Endpoints = append(value.Endpoints, newDefaultServer())
+ }
+ sort.Sort(ingress.EndpointByAddrPort(value.Endpoints))
+ aUpstreams = append(aUpstreams, value)
+ }
+ sort.Sort(ingress.BackendByNameServers(aUpstreams))
+
+ aServers := make([]*ingress.Server, 0, len(servers))
+ for _, value := range servers {
+ sort.Sort(ingress.LocationByPath(value.Locations))
+ aServers = append(aServers, value)
+ }
+ sort.Sort(ingress.ServerByName(aServers))
+
+ return aUpstreams, aServers
+}
+
+func (ic *GenericController) getAuthCertificate(secretName string) (*authtls.SSLCert, error) {
+ bc, exists := ic.sslCertTracker.Get(secretName)
+ if !exists {
+ return &authtls.SSLCert{}, fmt.Errorf("secret %v does not exists", secretName)
+ }
+ cert := bc.(*ingress.SSLCert)
+ return &authtls.SSLCert{
+ Secret: secretName,
+ CertFileName: cert.PemFileName,
+ CAFileName: cert.CAFileName,
+ PemSHA: cert.PemSHA,
+ }, nil
+}
+
+// createUpstreams creates the NGINX upstreams for each service referenced in
+// Ingress rules. The servers inside the upstream are endpoints.
+func (ic *GenericController) createUpstreams(data []interface{}) map[string]*ingress.Backend {
+ upstreams := make(map[string]*ingress.Backend)
+ upstreams[defUpstreamName] = ic.getDefaultUpstream()
+
+ upsDefaults := ic.cfg.Backend.BackendDefaults()
+ for _, ingIf := range data {
+ ing := ingIf.(*extensions.Ingress)
+
+ secUpstream, err := secureupstream.ParseAnnotations(ing)
+ if err != nil {
+ glog.V(5).Infof("error reading secure upstream in Ingress %v/%v: %v", ing.GetNamespace(), ing.GetName(), err)
+ }
+
+ hz := healthcheck.ParseAnnotations(upsDefaults, ing)
+
+ var defBackend string
+ if ing.Spec.Backend != nil {
+ defBackend = fmt.Sprintf("%v-%v-%v",
+ ing.GetNamespace(),
+ ing.Spec.Backend.ServiceName,
+ ing.Spec.Backend.ServicePort.String())
+
+ glog.V(3).Infof("creating upstream %v", defBackend)
+ upstreams[defBackend] = newUpstream(defBackend)
+
+ svcKey := fmt.Sprintf("%v/%v", ing.GetNamespace(), ing.Spec.Backend.ServiceName)
+ endps, err := ic.serviceEndpoints(svcKey, ing.Spec.Backend.ServicePort.String(), hz)
+ upstreams[defBackend].Endpoints = append(upstreams[defBackend].Endpoints, endps...)
+ if err != nil {
+ glog.Warningf("error creating upstream %v: %v", defBackend, err)
+ }
+ }
+
+ for _, rule := range ing.Spec.Rules {
+ if rule.HTTP == nil {
+ continue
+ }
+
+ for _, path := range rule.HTTP.Paths {
+ name := fmt.Sprintf("%v-%v-%v",
+ ing.GetNamespace(),
+ path.Backend.ServiceName,
+ path.Backend.ServicePort.String())
+
+ if _, ok := upstreams[name]; ok {
+ continue
+ }
+
+ glog.V(3).Infof("creating upstream %v", name)
+ upstreams[name] = newUpstream(name)
+ if !upstreams[name].Secure {
+ upstreams[name].Secure = secUpstream
+ }
+ svcKey := fmt.Sprintf("%v/%v", ing.GetNamespace(), path.Backend.ServiceName)
+ endp, err := ic.serviceEndpoints(svcKey, path.Backend.ServicePort.String(), hz)
+ if err != nil {
+ glog.Warningf("error obtaining service endpoints: %v", err)
+ continue
+ }
+ upstreams[name].Endpoints = endp
+ }
+ }
+ }
+
+ return upstreams
+}
+
+// serviceEndpoints returns the upstream servers (endpoints) associated
+// to a service.
+func (ic *GenericController) serviceEndpoints(svcKey, backendPort string,
+ hz *healthcheck.Upstream) ([]ingress.Endpoint, error) {
+ svcObj, svcExists, err := ic.svcLister.Indexer.GetByKey(svcKey)
+
+ var upstreams []ingress.Endpoint
+ if err != nil {
+ return upstreams, fmt.Errorf("error getting service %v from the cache: %v", svcKey, err)
+ }
+
+ if !svcExists {
+ err = fmt.Errorf("service %v does not exists", svcKey)
+ return upstreams, err
+ }
+
+ svc := svcObj.(*api.Service)
+ glog.V(3).Infof("obtaining port information for service %v", svcKey)
+ for _, servicePort := range svc.Spec.Ports {
+ // targetPort could be a string, use the name or the port (int)
+ if strconv.Itoa(int(servicePort.Port)) == backendPort ||
+ servicePort.TargetPort.String() == backendPort ||
+ servicePort.Name == backendPort {
+
+ endps := ic.getEndpoints(svc, servicePort.TargetPort, api.ProtocolTCP, hz)
+ if len(endps) == 0 {
+ glog.Warningf("service %v does not have any active endpoints", svcKey)
+ }
+
+ upstreams = append(upstreams, endps...)
+ break
+ }
+ }
+
+ return upstreams, nil
+}
+
+func (ic *GenericController) createServers(data []interface{}, upstreams map[string]*ingress.Backend) map[string]*ingress.Server {
+ servers := make(map[string]*ingress.Server)
+ ngxProxy := *proxy.ParseAnnotations(ic.cfg.Backend.BackendDefaults(), nil)
+
+ upsDefaults := ic.cfg.Backend.BackendDefaults()
+
+ // default server
+ servers[defServerName] = &ingress.Server{
+ Hostname: defServerName,
+ Locations: []*ingress.Location{
+ {
+ Path: rootLocation,
+ IsDefBackend: true,
+ Backend: ic.getDefaultUpstream().Name,
+ Proxy: ngxProxy,
+ },
+ }}
+
+ // initialize all the servers
+ for _, ingIf := range data {
+ ing := ingIf.(*extensions.Ingress)
+ // check if ssl passthrough is configured
+ sslpt, err := sslpassthrough.ParseAnnotations(upsDefaults, ing)
+ if err != nil {
+ glog.V(5).Infof("error reading ssl passthrough annotation in Ingress %v/%v: %v", ing.GetNamespace(), ing.GetName(), err)
+ }
+
+ for _, rule := range ing.Spec.Rules {
+ host := rule.Host
+ if host == "" {
+ host = defServerName
+ }
+ if _, ok := servers[host]; ok {
+ // server already configured
+ continue
+ }
+ servers[host] = &ingress.Server{
+ Hostname: host,
+ Locations: []*ingress.Location{
+ {
+ Path: rootLocation,
+ IsDefBackend: true,
+ Backend: ic.getDefaultUpstream().Name,
+ Proxy: ngxProxy,
+ },
+ }, SSLPassthrough: sslpt}
+ }
+ }
+
+ // configure default location and SSL
+ for _, ingIf := range data {
+ ing := ingIf.(*extensions.Ingress)
+
+ for _, rule := range ing.Spec.Rules {
+ host := rule.Host
+ if host == "" {
+ host = defServerName
+ }
+
+ // only add a certificate if the server does not have one previously configured
+ // TODO: TLS without secret?
+ if len(ing.Spec.TLS) > 0 && servers[host].SSLCertificate == "" && ing.Spec.TLS[0].SecretName != "" {
+ key := fmt.Sprintf("%v/%v", ing.Namespace, ing.Spec.TLS[0].SecretName)
+ bc, exists := ic.sslCertTracker.Get(key)
+ if exists {
+ cert := bc.(*ingress.SSLCert)
+ if isHostValid(host, cert) {
+ servers[host].SSLCertificate = cert.PemFileName
+ servers[host].SSLPemChecksum = cert.PemSHA
+ }
+ } else {
+ glog.Warningf("secret %v does not exists", key)
+ }
+ }
+
+ if ing.Spec.Backend != nil {
+ defUpstream := fmt.Sprintf("%v-%v-%v", ing.GetNamespace(), ing.Spec.Backend.ServiceName, ing.Spec.Backend.ServicePort.String())
+ if backendUpstream, ok := upstreams[defUpstream]; ok {
+ if host == "" || host == defServerName {
+ ic.recorder.Eventf(ing, api.EventTypeWarning, "MAPPING", "error: rules with Spec.Backend are allowed only with hostnames")
+ continue
+ }
+ servers[host].Locations[0].Backend = backendUpstream.Name
+ }
+ }
+ }
+ }
+
+ return servers
+}
+
+// getEndpoints returns a list of : for a given service/target port combination.
+func (ic *GenericController) getEndpoints(
+ s *api.Service,
+ servicePort intstr.IntOrString,
+ proto api.Protocol,
+ hz *healthcheck.Upstream) []ingress.Endpoint {
+ glog.V(3).Infof("getting endpoints for service %v/%v and port %v", s.Namespace, s.Name, servicePort.String())
+ ep, err := ic.endpLister.GetServiceEndpoints(s)
+ if err != nil {
+ glog.Warningf("unexpected error obtaining service endpoints: %v", err)
+ return []ingress.Endpoint{}
+ }
+
+ upsServers := []ingress.Endpoint{}
+
+ for _, ss := range ep.Subsets {
+ for _, epPort := range ss.Ports {
+
+ if !reflect.DeepEqual(epPort.Protocol, proto) {
+ continue
+ }
+
+ var targetPort int32
+
+ switch servicePort.Type {
+ case intstr.Int:
+ if int(epPort.Port) == servicePort.IntValue() {
+ targetPort = epPort.Port
+ }
+ case intstr.String:
+ port, err := service.GetPortMapping(servicePort.StrVal, s)
+ if err == nil {
+ targetPort = port
+ continue
+ }
+
+ glog.Warningf("error mapping service port: %v", err)
+ err = ic.checkSvcForUpdate(s)
+ if err != nil {
+ glog.Warningf("error mapping service ports: %v", err)
+ continue
+ }
+
+ port, err = service.GetPortMapping(servicePort.StrVal, s)
+ if err == nil {
+ targetPort = port
+ }
+ }
+
+ // check for invalid port value
+ if targetPort == -1 {
+ continue
+ }
+
+ for _, epAddress := range ss.Addresses {
+ ups := ingress.Endpoint{
+ Address: epAddress.IP,
+ Port: fmt.Sprintf("%v", targetPort),
+ MaxFails: hz.MaxFails,
+ FailTimeout: hz.FailTimeout,
+ }
+ upsServers = append(upsServers, ups)
+ }
+ }
+ }
+
+ glog.V(3).Infof("endpoints found: %v", upsServers)
+ return upsServers
+}
+
+// Stop stops the loadbalancer controller.
+func (ic GenericController) Stop() error {
+ ic.stopLock.Lock()
+ defer ic.stopLock.Unlock()
+
+ // Only try draining the workqueue if we haven't already.
+ if !ic.syncQueue.IsShuttingDown() {
+ glog.Infof("shutting down controller queues")
+ close(ic.stopCh)
+ go ic.syncQueue.Shutdown()
+ go ic.secretQueue.Shutdown()
+ ic.syncStatus.Shutdown()
+ return nil
+ }
+
+ return fmt.Errorf("shutdown already in progress")
+}
+
+// Start starts the Ingress controller.
+func (ic GenericController) Start() {
+ glog.Infof("starting Ingress controller")
+
+ go ic.ingController.Run(ic.stopCh)
+ go ic.endpController.Run(ic.stopCh)
+ go ic.svcController.Run(ic.stopCh)
+ go ic.secrController.Run(ic.stopCh)
+ go ic.mapController.Run(ic.stopCh)
+
+ go ic.secretQueue.Run(5*time.Second, ic.stopCh)
+ go ic.syncQueue.Run(5*time.Second, ic.stopCh)
+
+ go ic.syncStatus.Run(ic.stopCh)
+
+ <-ic.stopCh
+}
diff --git a/core/pkg/ingress/controller/launch.go b/core/pkg/ingress/controller/launch.go
new file mode 100644
index 0000000000..41dbaf284f
--- /dev/null
+++ b/core/pkg/ingress/controller/launch.go
@@ -0,0 +1,184 @@
+package controller
+
+import (
+ "encoding/json"
+ "flag"
+ "fmt"
+ "net/http"
+ "net/http/pprof"
+ "os"
+ "syscall"
+ "time"
+
+ "github.com/golang/glog"
+ "github.com/spf13/pflag"
+
+ "github.com/prometheus/client_golang/prometheus"
+ "k8s.io/kubernetes/pkg/api"
+ clientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset"
+ "k8s.io/kubernetes/pkg/client/restclient"
+ "k8s.io/kubernetes/pkg/healthz"
+ kubectl_util "k8s.io/kubernetes/pkg/kubectl/cmd/util"
+
+ "k8s.io/ingress/core/pkg/ingress"
+ "k8s.io/ingress/core/pkg/k8s"
+)
+
+// NewIngressController returns a configured Ingress controller
+func NewIngressController(backend ingress.Controller) *GenericController {
+ var (
+ flags = pflag.NewFlagSet("", pflag.ExitOnError)
+
+ defaultSvc = flags.String("default-backend-service", "",
+ `Service used to serve a 404 page for the default backend. Takes the form
+ namespace/name. The controller uses the first node port of this Service for
+ the default backend.`)
+
+ ingressClass = flags.String("ingress-class", "",
+ `Name of the ingress class to route through this controller.`)
+
+ configMap = flags.String("configmap", "",
+ `Name of the ConfigMap that contains the custom configuration to use`)
+
+ publishSvc = flags.String("publish-service", "",
+ `Service fronting the ingress controllers. Takes the form
+ namespace/name. The controller will set the endpoint records on the
+ ingress objects to reflect those on the service.`)
+
+ tcpConfigMapName = flags.String("tcp-services-configmap", "",
+ `Name of the ConfigMap that contains the definition of the TCP services to expose.
+ The key in the map indicates the external port to be used. The value is the name of the
+ service with the format namespace/serviceName and the port of the service could be a
+ number of the name of the port.
+ The ports 80 and 443 are not allowed as external ports. This ports are reserved for the backend`)
+
+ udpConfigMapName = flags.String("udp-services-configmap", "",
+ `Name of the ConfigMap that contains the definition of the UDP services to expose.
+ The key in the map indicates the external port to be used. The value is the name of the
+ service with the format namespace/serviceName and the port of the service could be a
+ number of the name of the port.`)
+
+ resyncPeriod = flags.Duration("sync-period", 60*time.Second,
+ `Relist and confirm cloud resources this often.`)
+
+ watchNamespace = flags.String("watch-namespace", api.NamespaceAll,
+ `Namespace to watch for Ingress. Default is to watch all namespaces`)
+
+ healthzPort = flags.Int("healthz-port", 10254, "port for healthz endpoint.")
+
+ profiling = flags.Bool("profiling", true, `Enable profiling via web interface host:port/debug/pprof/`)
+
+ defSSLCertificate = flags.String("default-ssl-certificate", "", `Name of the secret
+ that contains a SSL certificate to be used as default for a HTTPS catch-all server`)
+
+ defHealthzURL = flags.String("health-check-path", "/healthz", `Defines
+ the URL to be used as health check inside in the default server in NGINX.`)
+ )
+
+ flags.AddGoFlagSet(flag.CommandLine)
+ flags.Parse(os.Args)
+ clientConfig := kubectl_util.DefaultClientConfig(flags)
+
+ flag.Set("logtostderr", "true")
+
+ glog.Info(backend.Info())
+
+ if *ingressClass != "" {
+ glog.Infof("Watching for ingress class: %s", *ingressClass)
+ }
+
+ if *defaultSvc == "" {
+ glog.Fatalf("Please specify --default-backend-service")
+ }
+
+ kubeconfig, err := restclient.InClusterConfig()
+ if err != nil {
+ kubeconfig, err = clientConfig.ClientConfig()
+ if err != nil {
+ glog.Fatalf("error configuring the client: %v", err)
+ }
+ }
+
+ kubeClient, err := clientset.NewForConfig(kubeconfig)
+ if err != nil {
+ glog.Fatalf("failed to create client: %v", err)
+ }
+
+ _, err = k8s.IsValidService(kubeClient, *defaultSvc)
+ if err != nil {
+ glog.Fatalf("no service with name %v found: %v", *defaultSvc, err)
+ }
+ glog.Infof("validated %v as the default backend", *defaultSvc)
+
+ if *publishSvc != "" {
+ svc, err := k8s.IsValidService(kubeClient, *publishSvc)
+ if err != nil {
+ glog.Fatalf("no service with name %v found: %v", *publishSvc, err)
+ }
+
+ if len(svc.Status.LoadBalancer.Ingress) == 0 {
+ // We could poll here, but we instead just exit and rely on k8s to restart us
+ glog.Fatalf("service %s does not (yet) have ingress points", *publishSvc)
+ }
+
+ glog.Infof("service %v validated as source of Ingress status", *publishSvc)
+ }
+
+ if *configMap != "" {
+ _, _, err = k8s.ParseNameNS(*configMap)
+ if err != nil {
+ glog.Fatalf("configmap error: %v", err)
+ }
+ }
+
+ os.MkdirAll(ingress.DefaultSSLDirectory, 0655)
+
+ config := &Configuration{
+ Client: kubeClient,
+ ResyncPeriod: *resyncPeriod,
+ DefaultService: *defaultSvc,
+ IngressClass: *ingressClass,
+ Namespace: *watchNamespace,
+ ConfigMapName: *configMap,
+ TCPConfigMapName: *tcpConfigMapName,
+ UDPConfigMapName: *udpConfigMapName,
+ DefaultSSLCertificate: *defSSLCertificate,
+ DefaultHealthzURL: *defHealthzURL,
+ PublishService: *publishSvc,
+ Backend: backend,
+ }
+
+ ic := newIngressController(config)
+ go registerHandlers(*profiling, *healthzPort, ic)
+ return ic
+}
+
+func registerHandlers(enableProfiling bool, port int, ic *GenericController) {
+ mux := http.NewServeMux()
+ healthz.InstallHandler(mux, ic)
+
+ mux.Handle("/metrics", prometheus.Handler())
+
+ mux.HandleFunc("/build", func(w http.ResponseWriter, r *http.Request) {
+ w.WriteHeader(http.StatusOK)
+ b, _ := json.Marshal(ic.Info())
+ w.Write(b)
+ })
+
+ mux.HandleFunc("/stop", func(w http.ResponseWriter, r *http.Request) {
+ syscall.Kill(syscall.Getpid(), syscall.SIGTERM)
+ })
+
+ if enableProfiling {
+ mux.HandleFunc("/debug/pprof/", pprof.Index)
+ mux.HandleFunc("/debug/pprof/profile", pprof.Profile)
+ mux.HandleFunc("/debug/pprof/symbol", pprof.Symbol)
+ mux.HandleFunc("/debug/pprof/trace", pprof.Trace)
+ }
+
+ server := &http.Server{
+ Addr: fmt.Sprintf(":%v", port),
+ Handler: mux,
+ }
+ glog.Fatal(server.ListenAndServe())
+}
diff --git a/core/pkg/ingress/controller/metrics.go b/core/pkg/ingress/controller/metrics.go
new file mode 100644
index 0000000000..1b22b5bed5
--- /dev/null
+++ b/core/pkg/ingress/controller/metrics.go
@@ -0,0 +1,60 @@
+/*
+Copyright 2015 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package controller
+
+import "github.com/prometheus/client_golang/prometheus"
+
+const (
+ ns = "ingress_controller"
+ operation = "count"
+ reloadLabel = "reloads"
+)
+
+func init() {
+ prometheus.MustRegister(reloadOperation)
+ prometheus.MustRegister(reloadOperationErrors)
+
+ reloadOperationErrors.WithLabelValues(reloadLabel).Set(0)
+ reloadOperation.WithLabelValues(reloadLabel).Set(0)
+}
+
+var (
+ reloadOperation = prometheus.NewCounterVec(
+ prometheus.CounterOpts{
+ Namespace: ns,
+ Name: "success",
+ Help: "Cumulative number of Ingress controller reload operations",
+ },
+ []string{operation},
+ )
+ reloadOperationErrors = prometheus.NewCounterVec(
+ prometheus.CounterOpts{
+ Namespace: ns,
+ Name: "errors",
+ Help: "Cumulative number of Ingress controller errors during reload operations",
+ },
+ []string{operation},
+ )
+)
+
+func incReloadCount() {
+ reloadOperation.WithLabelValues(reloadLabel).Inc()
+}
+
+func incReloadErrorCount() {
+ reloadOperationErrors.WithLabelValues(reloadLabel).Inc()
+}
diff --git a/core/pkg/ingress/controller/named_port.go b/core/pkg/ingress/controller/named_port.go
new file mode 100644
index 0000000000..c1cdeb6e22
--- /dev/null
+++ b/core/pkg/ingress/controller/named_port.go
@@ -0,0 +1,105 @@
+/*
+Copyright 2015 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package controller
+
+import (
+ "encoding/json"
+ "fmt"
+ "reflect"
+ "strconv"
+
+ "github.com/golang/glog"
+
+ "k8s.io/kubernetes/pkg/api"
+ podutil "k8s.io/kubernetes/pkg/api/pod"
+ "k8s.io/kubernetes/pkg/labels"
+
+ "k8s.io/ingress/core/pkg/ingress/annotations/service"
+)
+
+// checkSvcForUpdate verifies if one of the running pods for a service contains
+// named port. If the annotation in the service does not exists or is not equals
+// to the port mapping obtained from the pod the service must be updated to reflect
+// the current state
+func (ic *GenericController) checkSvcForUpdate(svc *api.Service) error {
+ // get the pods associated with the service
+ // TODO: switch this to a watch
+ pods, err := ic.cfg.Client.Pods(svc.Namespace).List(api.ListOptions{
+ LabelSelector: labels.Set(svc.Spec.Selector).AsSelector(),
+ })
+
+ if err != nil {
+ return fmt.Errorf("error searching service pods %v/%v: %v", svc.Namespace, svc.Name, err)
+ }
+
+ if len(pods.Items) == 0 {
+ return nil
+ }
+
+ namedPorts := map[string]string{}
+
+ // we need to check only one pod searching for named ports
+ pod := &pods.Items[0]
+ glog.V(4).Infof("checking pod %v/%v for named port information", pod.Namespace, pod.Name)
+ for i := range svc.Spec.Ports {
+ servicePort := &svc.Spec.Ports[i]
+
+ _, err := strconv.Atoi(servicePort.TargetPort.StrVal)
+ if err != nil {
+ portNum, err := podutil.FindPort(pod, servicePort)
+ if err != nil {
+ glog.V(4).Infof("failed to find port for service %s/%s: %v", portNum, svc.Namespace, svc.Name, err)
+ continue
+ }
+
+ if servicePort.TargetPort.StrVal == "" {
+ continue
+ }
+
+ namedPorts[servicePort.TargetPort.StrVal] = fmt.Sprintf("%v", portNum)
+ }
+ }
+
+ if svc.ObjectMeta.Annotations == nil {
+ svc.ObjectMeta.Annotations = map[string]string{}
+ }
+
+ curNamedPort := svc.ObjectMeta.Annotations[service.NamedPortAnnotation]
+ if len(namedPorts) > 0 && !reflect.DeepEqual(curNamedPort, namedPorts) {
+ data, _ := json.Marshal(namedPorts)
+
+ newSvc, err := ic.cfg.Client.Services(svc.Namespace).Get(svc.Name)
+ if err != nil {
+ return fmt.Errorf("error getting service %v/%v: %v", svc.Namespace, svc.Name, err)
+ }
+
+ if newSvc.ObjectMeta.Annotations == nil {
+ newSvc.ObjectMeta.Annotations = map[string]string{}
+ }
+
+ newSvc.ObjectMeta.Annotations[service.NamedPortAnnotation] = string(data)
+ glog.Infof("updating service %v with new named port mappings", svc.Name)
+ _, err = ic.cfg.Client.Services(svc.Namespace).Update(newSvc)
+ if err != nil {
+ return fmt.Errorf("error syncing service %v/%v: %v", svc.Namespace, svc.Name, err)
+ }
+
+ return nil
+ }
+
+ return nil
+}
diff --git a/core/pkg/ingress/controller/util.go b/core/pkg/ingress/controller/util.go
new file mode 100644
index 0000000000..c3e4f249ca
--- /dev/null
+++ b/core/pkg/ingress/controller/util.go
@@ -0,0 +1,95 @@
+/*
+Copyright 2015 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package controller
+
+import (
+ "strings"
+
+ "k8s.io/kubernetes/pkg/apis/extensions"
+
+ "k8s.io/ingress/core/pkg/ingress"
+ "k8s.io/ingress/core/pkg/ingress/annotations/parser"
+)
+
+// newDefaultServer return an BackendServer to be use as default server that returns 503.
+func newDefaultServer() ingress.Endpoint {
+ return ingress.Endpoint{Address: "127.0.0.1", Port: "8181"}
+}
+
+// newUpstream creates an upstream without servers.
+func newUpstream(name string) *ingress.Backend {
+ return &ingress.Backend{
+ Name: name,
+ Endpoints: []ingress.Endpoint{},
+ }
+}
+
+func isHostValid(host string, cert *ingress.SSLCert) bool {
+ if cert == nil {
+ return false
+ }
+ for _, cn := range cert.CN {
+ if matchHostnames(cn, host) {
+ return true
+ }
+ }
+
+ return false
+}
+
+func matchHostnames(pattern, host string) bool {
+ host = strings.TrimSuffix(host, ".")
+ pattern = strings.TrimSuffix(pattern, ".")
+
+ if len(pattern) == 0 || len(host) == 0 {
+ return false
+ }
+
+ patternParts := strings.Split(pattern, ".")
+ hostParts := strings.Split(host, ".")
+
+ if len(patternParts) != len(hostParts) {
+ return false
+ }
+
+ for i, patternPart := range patternParts {
+ if i == 0 && patternPart == "*" {
+ continue
+ }
+ if patternPart != hostParts[i] {
+ return false
+ }
+ }
+
+ return true
+}
+
+// IsValidClass returns true if the given Ingress either doesn't specify
+// the ingress.class annotation, or it's set to the configured in the
+// ingress controller.
+func IsValidClass(ing *extensions.Ingress, class string) bool {
+ if class == "" {
+ return true
+ }
+
+ cc, _ := parser.GetStringAnnotation(ingressClassKey, ing)
+ if cc == "" {
+ return true
+ }
+
+ return cc == class
+}
diff --git a/core/pkg/ingress/controller/util_test.go b/core/pkg/ingress/controller/util_test.go
new file mode 100644
index 0000000000..ba19ea8304
--- /dev/null
+++ b/core/pkg/ingress/controller/util_test.go
@@ -0,0 +1,50 @@
+/*
+Copyright 2015 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package controller
+
+import (
+ "testing"
+
+ "k8s.io/kubernetes/pkg/api"
+ "k8s.io/kubernetes/pkg/apis/extensions"
+)
+
+func TestIsValidClass(t *testing.T) {
+ ing := &extensions.Ingress{
+ ObjectMeta: api.ObjectMeta{
+ Name: "foo",
+ Namespace: api.NamespaceDefault,
+ },
+ }
+
+ b := IsValidClass(ing, "")
+ if !b {
+ t.Error("Expected a valid class (missing annotation)")
+ }
+
+ data := map[string]string{}
+ data[ingressClassKey] = "custom"
+ ing.SetAnnotations(data)
+ b = IsValidClass(ing, "custom")
+ if !b {
+ t.Errorf("Expected valid class but %v returned", b)
+ }
+ b = IsValidClass(ing, "nginx")
+ if b {
+ t.Errorf("Expected invalid class but %v returned", b)
+ }
+}
diff --git a/core/pkg/ingress/defaults/main.go b/core/pkg/ingress/defaults/main.go
new file mode 100644
index 0000000000..9c85ba4046
--- /dev/null
+++ b/core/pkg/ingress/defaults/main.go
@@ -0,0 +1,60 @@
+package defaults
+
+// Backend defines the mandatory configuration that an Ingress controller must provide
+// The reason of this requirements is the annotations are generic. If some implementation do not supports
+// one or more annotations it just can provides defaults
+type Backend struct {
+ // enables which HTTP codes should be passed for processing with the error_page directive
+ // http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_intercept_errors
+ // http://nginx.org/en/docs/http/ngx_http_core_module.html#error_page
+ // By default this is disabled
+ CustomHTTPErrors []int `structs:"custom-http-errors,-"`
+
+ // Defines a timeout for establishing a connection with a proxied server.
+ // It should be noted that this timeout cannot usually exceed 75 seconds.
+ // http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_connect_timeout
+ ProxyConnectTimeout int `structs:"proxy-connect-timeout"`
+
+ // Timeout in seconds for reading a response from the proxied server. The timeout is set only between
+ // two successive read operations, not for the transmission of the whole response
+ // http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_read_timeout
+ ProxyReadTimeout int `structs:"proxy-read-timeout"`
+
+ // Timeout in seconds for transmitting a request to the proxied server. The timeout is set only between
+ // two successive write operations, not for the transmission of the whole request.
+ // http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_send_timeout
+ ProxySendTimeout int `structs:"proxy-send-timeout"`
+
+ // Sets the size of the buffer used for reading the first part of the response received from the
+ // proxied server. This part usually contains a small response header.
+ // http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_buffer_size)
+ ProxyBufferSize string `structs:"proxy-buffer-size"`
+
+ // Configures name servers used to resolve names of upstream servers into addresses
+ // http://nginx.org/en/docs/http/ngx_http_core_module.html#resolver
+ Resolver string `structs:"resolver"`
+
+ // SkipAccessLogURLs sets a list of URLs that should not appear in the NGINX access log
+ // This is useful with urls like `/health` or `health-check` that make "complex" reading the logs
+ // By default this list is empty
+ SkipAccessLogURLs []string `structs:"skip-access-log-urls,-"`
+
+ // Enables or disables the redirect (301) to the HTTPS port
+ SSLRedirect bool `structs:"ssl-redirect"`
+
+ // Number of unsuccessful attempts to communicate with the server that should happen in the
+ // duration set by the fail_timeout parameter to consider the server unavailable
+ // http://nginx.org/en/docs/http/ngx_http_upstream_module.html#upstream
+ // Default: 0, ie use platform liveness probe
+ UpstreamMaxFails int `structs:"upstream-max-fails"`
+
+ // Time during which the specified number of unsuccessful attempts to communicate with
+ // the server should happen to consider the server unavailable
+ // http://nginx.org/en/docs/http/ngx_http_upstream_module.html#upstream
+ // Default: 0, ie use platform liveness probe
+ UpstreamFailTimeout int `structs:"upstream-fail-timeout"`
+
+ // WhitelistSourceRange allows limiting access to certain client addresses
+ // http://nginx.org/en/docs/http/ngx_http_access_module.html
+ WhitelistSourceRange []string `structs:"whitelist-source-range,-"`
+}
diff --git a/core/pkg/ingress/doc.go b/core/pkg/ingress/doc.go
new file mode 100644
index 0000000000..54ddb718f9
--- /dev/null
+++ b/core/pkg/ingress/doc.go
@@ -0,0 +1,63 @@
+/*
+Copyright 2016 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package ingress
+
+// This package contains the interface is required to implement to build an Ingress controller
+// A dummy implementation could be
+//
+// func main() {
+// dc := newDummyController()
+// controller.NewIngressController(dc)
+// glog.Infof("shutting down Ingress controller...")
+// }
+//
+//where newDummyController returns and implementation of the Controller interface:
+//
+// func newDummyController() ingress.Controller {
+// return &DummyController{}
+// }
+//
+// type DummyController struct {
+// }
+//
+// func (dc DummyController) Reload(data []byte) ([]byte, error) {
+// err := ioutil.WriteFile("/arbitrary-path", data, 0644)
+// if err != nil {
+// return nil, err
+// }
+//
+// return exec.Command("some command", "--reload").CombinedOutput()
+// }
+//
+// func (dc DummyController) Test(file string) *exec.Cmd {
+// return exec.Command("some command", "--config-file", file)
+// }
+//
+// func (dc DummyController) OnUpdate(*api.ConfigMap, Configuration) ([]byte, error) {
+// return []byte(``)
+// }
+//
+// func (dc DummyController) BackendDefaults() defaults.Backend {
+// return ingress.NewStandardDefaults()
+// }
+//
+// func (dc DummyController) Info() *BackendInfo {
+// Name: "dummy",
+// Release: "0.0.0",
+// Build: "git-00000000",
+// Repository: "git://foo.bar.com",
+// }
diff --git a/core/pkg/ingress/sort_ingress.go b/core/pkg/ingress/sort_ingress.go
new file mode 100644
index 0000000000..cc5f2d76d8
--- /dev/null
+++ b/core/pkg/ingress/sort_ingress.go
@@ -0,0 +1,85 @@
+/*
+Copyright 2016 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package ingress
+
+import (
+ "k8s.io/kubernetes/pkg/api"
+ "k8s.io/kubernetes/pkg/api/unversioned"
+)
+
+// BackendByNameServers sorts upstreams by name
+type BackendByNameServers []*Backend
+
+func (c BackendByNameServers) Len() int { return len(c) }
+func (c BackendByNameServers) Swap(i, j int) { c[i], c[j] = c[j], c[i] }
+func (c BackendByNameServers) Less(i, j int) bool {
+
+ return c[i].Name < c[j].Name
+}
+
+// EndpointByAddrPort sorts endpoints by address and port
+type EndpointByAddrPort []Endpoint
+
+func (c EndpointByAddrPort) Len() int { return len(c) }
+func (c EndpointByAddrPort) Swap(i, j int) { c[i], c[j] = c[j], c[i] }
+func (c EndpointByAddrPort) Less(i, j int) bool {
+ iName := c[i].Address
+ jName := c[j].Address
+ if iName != jName {
+ return iName < jName
+ }
+
+ iU := c[i].Port
+ jU := c[j].Port
+ return iU < jU
+}
+
+// ServerByName sorts servers by name
+type ServerByName []*Server
+
+func (c ServerByName) Len() int { return len(c) }
+func (c ServerByName) Swap(i, j int) { c[i], c[j] = c[j], c[i] }
+func (c ServerByName) Less(i, j int) bool {
+ return c[i].Hostname < c[j].Hostname
+}
+
+// LocationByPath sorts location by path in descending order
+// Location / is the last one
+type LocationByPath []*Location
+
+func (c LocationByPath) Len() int { return len(c) }
+func (c LocationByPath) Swap(i, j int) { c[i], c[j] = c[j], c[i] }
+func (c LocationByPath) Less(i, j int) bool {
+ return c[i].Path > c[j].Path
+}
+
+// SSLCert describes a SSL certificate to be used in a server
+type SSLCert struct {
+ api.ObjectMeta `json:"metadata,omitempty"`
+ // CAFileName contains the path to the file with the root certificate
+ CAFileName string `json:"caFileName"`
+ // PemFileName contains the path to the file with the certificate and key concatenated
+ PemFileName string `json:"pemFileName"`
+ // PemSHA contains the sha1 of the pem file.
+ // This is used to detect changes in the secret that contains the certificates
+ PemSHA string `json:"pemSha"`
+ // CN contains all the common names defined in the SSL certificate
+ CN []string `json:"cn"`
+}
+
+// GetObjectKind implements the ObjectKind interface as a noop
+func (s SSLCert) GetObjectKind() unversioned.ObjectKind { return unversioned.EmptyObjectKind }
diff --git a/core/pkg/ingress/status/election.go b/core/pkg/ingress/status/election.go
new file mode 100644
index 0000000000..0710f1d825
--- /dev/null
+++ b/core/pkg/ingress/status/election.go
@@ -0,0 +1,119 @@
+/*
+Copyright 2015 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package status
+
+import (
+ "encoding/json"
+ "os"
+ "time"
+
+ "github.com/golang/glog"
+
+ "k8s.io/kubernetes/pkg/api"
+ "k8s.io/kubernetes/pkg/api/errors"
+ client "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset"
+ "k8s.io/kubernetes/pkg/client/leaderelection"
+ "k8s.io/kubernetes/pkg/client/leaderelection/resourcelock"
+ "k8s.io/kubernetes/pkg/client/record"
+)
+
+func getCurrentLeader(electionID, namespace string, c client.Interface) (string, *api.Endpoints, error) {
+ endpoints, err := c.Core().Endpoints(namespace).Get(electionID)
+ if err != nil {
+ return "", nil, err
+ }
+ val, found := endpoints.Annotations[resourcelock.LeaderElectionRecordAnnotationKey]
+ if !found {
+ return "", endpoints, nil
+ }
+ electionRecord := resourcelock.LeaderElectionRecord{}
+ if err = json.Unmarshal([]byte(val), &electionRecord); err != nil {
+ return "", nil, err
+ }
+ return electionRecord.HolderIdentity, endpoints, err
+}
+
+// NewElection creates an election. 'namespace'/'election' should be an existing Kubernetes Service
+// 'id' is the id if this leader, should be unique.
+func NewElection(electionID,
+ id,
+ namespace string,
+ ttl time.Duration,
+ callback func(leader string),
+ c client.Interface) (*leaderelection.LeaderElector, error) {
+
+ _, err := c.Core().Endpoints(namespace).Get(electionID)
+ if err != nil {
+ if errors.IsNotFound(err) {
+ _, err = c.Core().Endpoints(namespace).Create(&api.Endpoints{
+ ObjectMeta: api.ObjectMeta{
+ Name: electionID,
+ },
+ })
+ if err != nil && !errors.IsConflict(err) {
+ return nil, err
+ }
+ } else {
+ return nil, err
+ }
+ }
+
+ callbacks := leaderelection.LeaderCallbacks{
+ OnStartedLeading: func(stop <-chan struct{}) {
+ callback(id)
+ },
+ OnStoppedLeading: func() {
+ leader, _, err := getCurrentLeader(electionID, namespace, c)
+ if err != nil {
+ glog.Errorf("failed to get leader: %v", err)
+ // empty string means leader is unknown
+ callback("")
+ return
+ }
+ callback(leader)
+ },
+ }
+
+ broadcaster := record.NewBroadcaster()
+ hostname, err := os.Hostname()
+ if err != nil {
+ return nil, err
+ }
+ recorder := broadcaster.NewRecorder(api.EventSource{
+ Component: "ingress-leader-elector",
+ Host: hostname,
+ })
+
+ lock := resourcelock.EndpointsLock{
+ EndpointsMeta: api.ObjectMeta{Namespace: namespace, Name: electionID},
+ Client: c,
+ LockConfig: resourcelock.ResourceLockConfig{
+ Identity: id,
+ EventRecorder: recorder,
+ },
+ }
+
+ config := leaderelection.LeaderElectionConfig{
+ Lock: &lock,
+ LeaseDuration: ttl,
+ RenewDeadline: ttl / 2,
+ RetryPeriod: ttl / 4,
+ Callbacks: callbacks,
+ }
+
+ return leaderelection.NewLeaderElector(config)
+}
diff --git a/core/pkg/ingress/status/status.go b/core/pkg/ingress/status/status.go
new file mode 100644
index 0000000000..3a00aa7630
--- /dev/null
+++ b/core/pkg/ingress/status/status.go
@@ -0,0 +1,283 @@
+/*
+Copyright 2015 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package status
+
+import (
+ "sort"
+ "sync"
+ "time"
+
+ "github.com/golang/glog"
+
+ "k8s.io/kubernetes/pkg/api"
+ "k8s.io/kubernetes/pkg/apis/extensions"
+ clientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset"
+ "k8s.io/kubernetes/pkg/client/leaderelection"
+ "k8s.io/kubernetes/pkg/labels"
+ "k8s.io/kubernetes/pkg/util/wait"
+
+ cache_store "k8s.io/ingress/core/pkg/cache"
+ "k8s.io/ingress/core/pkg/k8s"
+ strings "k8s.io/ingress/core/pkg/strings"
+ "k8s.io/ingress/core/pkg/task"
+)
+
+const (
+ updateInterval = 30 * time.Second
+)
+
+// Sync ...
+type Sync interface {
+ Run(stopCh <-chan struct{})
+ Shutdown()
+}
+
+// Config ...
+type Config struct {
+ Client clientset.Interface
+ PublishService string
+ IngressLister cache_store.StoreToIngressLister
+}
+
+// statusSync keeps the status IP in each Ingress rule updated executing a periodic check
+// in all the defined rules. To simplify the process leader election is used so the update
+// is executed only in one node (Ingress controllers can be scaled to more than one)
+// If the controller is running with the flag --publish-service (with a valid service)
+// the IP address behind the service is used, if not the source is the IP/s of the node/s
+type statusSync struct {
+ Config
+ // pod contains runtime information about this pod
+ pod *k8s.PodInfo
+
+ elector *leaderelection.LeaderElector
+ // workqueue used to keep in sync the status IP/s
+ // in the Ingress rules
+ syncQueue *task.Queue
+
+ runLock *sync.Mutex
+}
+
+// Run starts the loop to keep the status in sync
+func (s statusSync) Run(stopCh <-chan struct{}) {
+ go wait.Forever(s.elector.Run, 0)
+ go s.run()
+
+ go s.syncQueue.Run(time.Second, stopCh)
+
+ <-stopCh
+}
+
+// Shutdown stop the sync. In case the instance is the leader it will remove the current IP
+// if there is no other instances running.
+func (s statusSync) Shutdown() {
+ go s.syncQueue.Shutdown()
+ // remove IP from Ingress
+ if !s.elector.IsLeader() {
+ return
+ }
+
+ glog.Infof("updating status of Ingress rules (remove)")
+
+ ips, err := s.getRunningIPs()
+ if err != nil {
+ glog.Errorf("error obtaining running IPs: %v", ips)
+ return
+ }
+
+ if len(ips) > 1 {
+ // leave the job to the next leader
+ glog.Infof("leaving status update for next leader (%v)", len(ips))
+ return
+ }
+
+ glog.Infof("removing my ip (%v)", ips)
+ s.updateStatus([]api.LoadBalancerIngress{})
+}
+
+func (s *statusSync) run() {
+ err := wait.PollInfinite(updateInterval, func() (bool, error) {
+ if s.syncQueue.IsShuttingDown() {
+ return true, nil
+ }
+ // send a dummy object to the queue to force a sync
+ s.syncQueue.Enqueue("dummy")
+ return false, nil
+ })
+ if err != nil {
+ glog.Errorf("error waiting shutdown: %v", err)
+ }
+}
+
+func (s *statusSync) sync(key interface{}) error {
+ s.runLock.Lock()
+ defer s.runLock.Unlock()
+
+ if !s.elector.IsLeader() {
+ glog.V(2).Infof("skipping Ingress status update (I am not the current leader)")
+ return nil
+ }
+
+ ips, err := s.getRunningIPs()
+ if err != nil {
+ return err
+ }
+ s.updateStatus(sliceToStatus(ips))
+
+ return nil
+}
+
+// callback invoked function when a new leader is elected
+func (s *statusSync) callback(leader string) {
+ if s.syncQueue.IsShuttingDown() {
+ return
+ }
+
+ glog.V(2).Infof("new leader elected (%v)", leader)
+ if leader == s.pod.Name {
+ glog.V(2).Infof("I am the new status update leader")
+ }
+}
+
+func (s statusSync) keyfunc(input interface{}) (interface{}, error) {
+ return input, nil
+}
+
+// NewStatusSyncer returns a new Sync instance
+func NewStatusSyncer(config Config) Sync {
+ pod, err := k8s.GetPodDetails(config.Client)
+ if err != nil {
+ glog.Fatalf("unexpected error obtaining pod information: %v", err)
+ }
+
+ st := statusSync{
+ pod: pod,
+ runLock: &sync.Mutex{},
+ Config: config,
+ }
+ st.syncQueue = task.NewCustomTaskQueue(st.sync, st.keyfunc)
+
+ le, err := NewElection("ingress-controller-leader",
+ pod.Name, pod.Namespace, 30*time.Second,
+ st.callback, config.Client)
+ if err != nil {
+ glog.Fatalf("unexpected error starting leader election: %v", err)
+ }
+ st.elector = le
+ return st
+}
+
+func (s *statusSync) getRunningIPs() ([]string, error) {
+ if s.PublishService != "" {
+ ns, name, _ := k8s.ParseNameNS(s.PublishService)
+ svc, err := s.Client.Core().Services(ns).Get(name)
+ if err != nil {
+ return nil, err
+ }
+
+ ips := []string{}
+ for _, ip := range svc.Status.LoadBalancer.Ingress {
+ ips = append(ips, ip.IP)
+ }
+
+ return ips, nil
+ }
+
+ // get information about all the pods running the ingress controller
+ pods, err := s.Client.Core().Pods(s.pod.Namespace).List(api.ListOptions{
+ LabelSelector: labels.SelectorFromSet(s.pod.Labels),
+ })
+ if err != nil {
+ return nil, err
+ }
+
+ ips := []string{}
+ for _, pod := range pods.Items {
+ if !strings.StringInSlice(pod.Status.HostIP, ips) {
+ ips = append(ips, pod.Status.HostIP)
+ }
+ }
+ return ips, nil
+}
+
+func sliceToStatus(ips []string) []api.LoadBalancerIngress {
+ lbi := []api.LoadBalancerIngress{}
+ for _, ip := range ips {
+ lbi = append(lbi, api.LoadBalancerIngress{IP: ip})
+ }
+
+ sort.Sort(loadBalancerIngressByIP(lbi))
+ return lbi
+}
+
+func (s *statusSync) updateStatus(newIPs []api.LoadBalancerIngress) {
+ ings := s.IngressLister.List()
+ var wg sync.WaitGroup
+ wg.Add(len(ings))
+ for _, cur := range ings {
+ ing := cur.(*extensions.Ingress)
+ go func(wg *sync.WaitGroup) {
+ defer wg.Done()
+ ingClient := s.Client.Extensions().Ingresses(ing.Namespace)
+ currIng, err := ingClient.Get(ing.Name)
+ if err != nil {
+ glog.Errorf("unexpected error searching Ingress %v/%v: %v", ing.Namespace, ing.Name, err)
+ return
+ }
+
+ curIPs := ing.Status.LoadBalancer.Ingress
+ sort.Sort(loadBalancerIngressByIP(curIPs))
+ if ingressSliceEqual(newIPs, curIPs) {
+ glog.V(3).Infof("skipping update of Ingress %v/%v (there is no change)", currIng.Namespace, currIng.Name)
+ return
+ }
+
+ glog.Infof("updating Ingress %v/%v status to %v", currIng.Namespace, currIng.Name, newIPs)
+ currIng.Status.LoadBalancer.Ingress = newIPs
+ _, err = ingClient.UpdateStatus(currIng)
+ if err != nil {
+ glog.Warningf("error updating ingress rule: %v", err)
+ }
+ }(&wg)
+ }
+
+ wg.Wait()
+}
+
+func ingressSliceEqual(lhs, rhs []api.LoadBalancerIngress) bool {
+ if len(lhs) != len(rhs) {
+ return false
+ }
+
+ for i := range lhs {
+ if lhs[i].IP != rhs[i].IP {
+ return false
+ }
+ if lhs[i].Hostname != rhs[i].Hostname {
+ return false
+ }
+ }
+ return true
+}
+
+// loadBalancerIngressByIP sorts LoadBalancerIngress using the field IP
+type loadBalancerIngressByIP []api.LoadBalancerIngress
+
+func (c loadBalancerIngressByIP) Len() int { return len(c) }
+func (c loadBalancerIngressByIP) Swap(i, j int) { c[i], c[j] = c[j], c[i] }
+func (c loadBalancerIngressByIP) Less(i, j int) bool {
+ return c[i].IP < c[j].IP
+}
diff --git a/core/pkg/ingress/types.go b/core/pkg/ingress/types.go
new file mode 100644
index 0000000000..c1dfc0fa20
--- /dev/null
+++ b/core/pkg/ingress/types.go
@@ -0,0 +1,239 @@
+/*
+Copyright 2016 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package ingress
+
+import (
+ "k8s.io/kubernetes/pkg/api"
+
+ "k8s.io/ingress/core/pkg/ingress/annotations/auth"
+ "k8s.io/ingress/core/pkg/ingress/annotations/authreq"
+ "k8s.io/ingress/core/pkg/ingress/annotations/authtls"
+ "k8s.io/ingress/core/pkg/ingress/annotations/ipwhitelist"
+ "k8s.io/ingress/core/pkg/ingress/annotations/proxy"
+ "k8s.io/ingress/core/pkg/ingress/annotations/ratelimit"
+ "k8s.io/ingress/core/pkg/ingress/annotations/rewrite"
+ "k8s.io/ingress/core/pkg/ingress/defaults"
+)
+
+var (
+ // DefaultSSLDirectory defines the location where the SSL certificates will be generated
+ // This directory contains all the SSL certificates that are specified in Ingress rules.
+ // The name of each file is -.pem. The content is the concatenated
+ // certificate and key.
+ DefaultSSLDirectory = "/ingress-controller/ssl"
+)
+
+// Controller holds the methods to handle an Ingress backend
+// TODO (#18): Make sure this is sufficiently supportive of other backends.
+type Controller interface {
+ // Reload takes a byte array representing the new loadbalancer configuration,
+ // and returns a byte array containing any output/errors from the backend and
+ // if a reload was required.
+ // Before returning the backend must load the configuration in the given array
+ // into the loadbalancer and restart it, or fail with an error and message string.
+ // If reloading fails, there should be not change in the running configuration or
+ // the given byte array.
+ Reload(data []byte) ([]byte, bool, error)
+ // OnUpdate callback invoked from the sync queue https://k8s.io/ingress/core/blob/master/pkg/ingress/controller/controller.go#L387
+ // when an update occurs. This is executed frequently because Ingress
+ // controllers watches changes in:
+ // - Ingresses: main work
+ // - Secrets: referenced from Ingress rules with TLS configured
+ // - ConfigMaps: where the controller reads custom configuration
+ // - Services: referenced from Ingress rules and required to obtain
+ // information about ports and annotations
+ // - Endpoints: referenced from Services and what the backend uses
+ // to route traffic
+ // Any update to services, endpoints, secrets (only those referenced from Ingress)
+ // and ingress trigger the execution.
+ // Notifications of type Add, Update and Delete:
+ // https://github.com/kubernetes/kubernetes/blob/master/pkg/client/cache/controller.go#L164
+ //
+ // ConfigMap content of --configmap
+ // Configuration returns the translation from Ingress rules containing
+ // information about all the upstreams (service endpoints ) "virtual"
+ // servers (FQDN) and all the locations inside each server. Each
+ // location contains information about all the annotations were configured
+ // https://k8s.io/ingress/core/blob/master/pkg/ingress/types.go#L83
+ // The backend returns the contents of the configuration file or an error
+ // with the reason why was not possible to generate the file.
+ //
+ // The returned configuration is then passed to test, and then to reload
+ // if there is no errors.
+ OnUpdate(*api.ConfigMap, Configuration) ([]byte, error)
+ // BackendDefaults returns the minimum settings required to configure the
+ // communication to endpoints
+ BackendDefaults() defaults.Backend
+ // Info returns information about the ingress controller
+ Info() *BackendInfo
+}
+
+// BackendInfo returns information about the backend.
+// This fields contains information that helps to track issues or to
+// map the running ingress controller to source code
+type BackendInfo struct {
+ // Name returns the name of the backend implementation
+ Name string `json:"name"`
+ // Release returns the running version (semver)
+ Release string `json:"release"`
+ // Build returns information about the git commit
+ Build string `json:"build"`
+ // Repository return information about the git repository
+ Repository string `json:"repository"`
+}
+
+// Configuration holds the definition of all the parts required to describe all
+// ingresses reachable by the ingress controller (using a filter by namespace)
+type Configuration struct {
+ // Backends are a list of backends used by all the Ingress rules in the
+ // ingress controller. This list includes the default backend
+ Backends []*Backend `json:"namespace"`
+ // Servers
+ Servers []*Server `json:"servers"`
+ // TCPEndpoints contain endpoints for tcp streams handled by this backend
+ // +optional
+ TCPEndpoints []*Location `json:"tcpEndpoints,omitempty"`
+ // UPDEndpoints contain endpoints for udp streams handled by this backend
+ // +optional
+ UPDEndpoints []*Location `json:"udpEndpoints,omitempty"`
+ // PassthroughBackend contains the backends used for SSL passthrough.
+ // It contains information about the associated Server Name Indication (SNI).
+ // +optional
+ PassthroughBackends []*SSLPassthroughBackend `json:"passthroughBackends,omitempty"`
+}
+
+// Backend describes one or more remote server/s (endpoints) associated with a service
+type Backend struct {
+ // Name represents an unique api.Service name formatted as --
+ Name string `json:"name"`
+ // This indicates if the communication protocol between the backend and the endpoint is HTTP or HTTPS
+ // Allowing the use of HTTPS
+ // The endpoint/s must provide a TLS connection.
+ // The certificate used in the endpoint cannot be a self signed certificate
+ // TODO: add annotation to allow the load of ca certificate
+ Secure bool `json:"secure"`
+ // Endpoints contains the list of endpoints currently running
+ Endpoints []Endpoint `json:"endpoints"`
+}
+
+// Endpoint describes a kubernetes endpoint in an backend
+type Endpoint struct {
+ // Address IP address of the endpoint
+ Address string `json:"address"`
+ // Port number of the TCP port
+ Port string `json:"port"`
+ // MaxFails returns the number of unsuccessful attempts to communicate
+ // allowed before this should be considered dow.
+ // Setting 0 indicates that the check is performed by a Kubernetes probe
+ MaxFails int `json:"maxFails"`
+ // FailTimeout returns the time in seconds during which the specified number
+ // of unsuccessful attempts to communicate with the server should happen
+ // to consider the endpoint unavailable
+ FailTimeout int `json:"failTimeout"`
+}
+
+// Server describes a website
+type Server struct {
+ // Hostname returns the FQDN of the server
+ Hostname string `json:"hostname"`
+ // SSLPassthrough indicates if the TLS termination is realized in
+ // the server or in the remote endpoint
+ SSLPassthrough bool `json:"sslPassthrough"`
+ // SSLCertificate path to the SSL certificate on disk
+ SSLCertificate string `json:"sslCertificate"`
+ // SSLPemChecksum returns the checksum of the certificate file on disk.
+ // There is no restriction in the hash generator. This checksim can be
+ // used to determine if the secret changed without the use of file
+ // system notifications
+ SSLPemChecksum string `json:"sslPemChecksum"`
+ // Locations list of URIs configured in the server.
+ Locations []*Location `json:"locations,omitempty"`
+}
+
+// Location describes an URI inside a server.
+// Also contains additional information about annotations in the Ingress.
+//
+// Important:
+// The implementation of annotations is optional
+//
+// In some cases when more than one annotations is defined a particular order in the execution
+// is required.
+// The chain in the execution order of annotations should be:
+// - CertificateAuth
+// - Whitelist
+// - RateLimit
+// - BasicDigestAuth
+// - ExternalAuth
+// - Redirect
+type Location struct {
+ // Path is an extended POSIX regex as defined by IEEE Std 1003.1,
+ // (i.e this follows the egrep/unix syntax, not the perl syntax)
+ // matched against the path of an incoming request. Currently it can
+ // contain characters disallowed from the conventional "path"
+ // part of a URL as defined by RFC 3986. Paths must begin with
+ // a '/'. If unspecified, the path defaults to a catch all sending
+ // traffic to the backend.
+ Path string `json:"path"`
+ // IsDefBackend indicates if service specified in the Ingress
+ // contains active endpoints or not. Returning true means the location
+ // uses the default backend.
+ IsDefBackend bool `json:"isDefBackend"`
+ // Backend describes the name of the backend to use.
+ Backend string `json:"backend"`
+ // BasicDigestAuth returns authentication configuration for
+ // an Ingress rule.
+ // +optional
+ BasicDigestAuth auth.BasicDigest `json:"basicDigestAuth,omitempty"`
+ // EnableCORS indicates if path must support CORS
+ // +optional
+ EnableCORS bool `json:"enableCors,omitempty"`
+ // ExternalAuth indicates the access to this location requires
+ // authentication using an external provider
+ // +optional
+ ExternalAuth authreq.External `json:"externalAuth,omitempty"`
+ // RateLimit describes a limit in the number of connections per IP
+ // address or connections per second.
+ // The Redirect annotation precedes RateLimit
+ // +optional
+ RateLimit ratelimit.RateLimit `json:"rateLimit,omitempty"`
+ // Redirect describes the redirection this location.
+ // +optional
+ Redirect rewrite.Redirect `json:"redirect,omitempty"`
+ // Whitelist indicates only connections from certain client
+ // addresses or networks are allowed.
+ // +optional
+ Whitelist ipwhitelist.SourceRange `json:"whitelist,omitempty"`
+ // Proxy contains information about timeouts and buffer sizes
+ // to be used in connections against endpoints
+ // +optional
+ Proxy proxy.Configuration `json:"proxy,omitempty"`
+ // CertificateAuth indicates the access to this location requires
+ // external authentication
+ // +optional
+ CertificateAuth authtls.SSLCert `json:"certificateAuth,omitempty"`
+}
+
+// SSLPassthroughBackend describes a SSL upstream server configured
+// as passthrough (no TLS termination in the ingress controller)
+// The endpoints must provide the TLS termination exposing the required SSL certificate.
+// The ingress controller only pipes the underlying TCP connection
+type SSLPassthroughBackend struct {
+ // Backend describes the endpoints to use.
+ Backend string `json:"namespace,omitempty"`
+ // Hostname returns the FQDN of the server
+ Hostname string `json:"hostname"`
+}
diff --git a/core/pkg/k8s/main.go b/core/pkg/k8s/main.go
new file mode 100644
index 0000000000..2f0caf5e52
--- /dev/null
+++ b/core/pkg/k8s/main.go
@@ -0,0 +1,110 @@
+/*
+Copyright 2015 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package k8s
+
+import (
+ "fmt"
+ "os"
+ "strings"
+
+ "k8s.io/kubernetes/pkg/api"
+ clientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset"
+)
+
+// IsValidService checks if exists a service with the specified name
+func IsValidService(kubeClient clientset.Interface, name string) (*api.Service, error) {
+ ns, name, err := ParseNameNS(name)
+ if err != nil {
+ return nil, err
+ }
+ return kubeClient.Core().Services(ns).Get(name)
+}
+
+// IsValidSecret checks if exists a secret with the specified name
+func IsValidSecret(kubeClient clientset.Interface, name string) (*api.Secret, error) {
+ ns, name, err := ParseNameNS(name)
+ if err != nil {
+ return nil, err
+ }
+ return kubeClient.Core().Secrets(ns).Get(name)
+}
+
+// ParseNameNS parses a string searching a namespace and name
+func ParseNameNS(input string) (string, string, error) {
+ nsName := strings.Split(input, "/")
+ if len(nsName) != 2 {
+ return "", "", fmt.Errorf("invalid format (namespace/name) found in '%v'", input)
+ }
+
+ return nsName[0], nsName[1], nil
+}
+
+// GetNodeIP returns the IP address of a node in the cluster
+func GetNodeIP(kubeClient clientset.Interface, name string) string {
+ var externalIP string
+ node, err := kubeClient.Core().Nodes().Get(name)
+ if err != nil {
+ return externalIP
+ }
+
+ for _, address := range node.Status.Addresses {
+ if address.Type == api.NodeExternalIP {
+ if address.Address != "" {
+ externalIP = address.Address
+ break
+ }
+ }
+
+ if externalIP == "" && address.Type == api.NodeLegacyHostIP {
+ externalIP = address.Address
+ }
+ }
+ return externalIP
+}
+
+// PodInfo contains runtime information about the pod running the Ingres controller
+type PodInfo struct {
+ Name string
+ Namespace string
+ NodeIP string
+ // Labels selectors of the running pod
+ // This is used to search for other Ingress controller pods
+ Labels map[string]string
+}
+
+// GetPodDetails returns runtime information about the pod:
+// name, namespace and IP of the node where it is running
+func GetPodDetails(kubeClient clientset.Interface) (*PodInfo, error) {
+ podName := os.Getenv("POD_NAME")
+ podNs := os.Getenv("POD_NAMESPACE")
+
+ if podName == "" && podNs == "" {
+ return nil, fmt.Errorf("unable to get POD information (missing POD_NAME or POD_NAMESPACE environment variable")
+ }
+
+ pod, _ := kubeClient.Core().Pods(podNs).Get(podName)
+ if pod == nil {
+ return nil, fmt.Errorf("unable to get POD information")
+ }
+
+ return &PodInfo{
+ Name: podName,
+ Namespace: podNs,
+ NodeIP: GetNodeIP(kubeClient, pod.Spec.NodeName),
+ Labels: pod.GetLabels(),
+ }, nil
+}
diff --git a/core/pkg/k8s/main_test.go b/core/pkg/k8s/main_test.go
new file mode 100644
index 0000000000..fa9cce573e
--- /dev/null
+++ b/core/pkg/k8s/main_test.go
@@ -0,0 +1,116 @@
+/*
+Copyright 2015 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package k8s
+
+import (
+ "testing"
+
+ "k8s.io/kubernetes/pkg/api"
+ testclient "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/fake"
+)
+
+func TestParseNameNS(t *testing.T) {
+
+ tests := []struct {
+ title string
+ input string
+ ns string
+ name string
+ expErr bool
+ }{
+ {"empty string", "", "", "", true},
+ {"demo", "demo", "", "", true},
+ {"kube-system", "kube-system", "", "", true},
+ {"default/kube-system", "default/kube-system", "default", "kube-system", false},
+ }
+
+ for _, test := range tests {
+ ns, name, err := ParseNameNS(test.input)
+ if test.expErr {
+ if err == nil {
+ t.Errorf("%v: expected error but retuned nil", test.title)
+ }
+ continue
+ }
+ if test.ns != ns {
+ t.Errorf("%v: expected %v but retuned %v", test.title, test.ns, ns)
+ }
+ if test.name != name {
+ t.Errorf("%v: expected %v but retuned %v", test.title, test.name, name)
+ }
+ }
+}
+
+func TestIsValidService(t *testing.T) {
+ fk := testclient.NewSimpleClientset(&api.Service{
+ ObjectMeta: api.ObjectMeta{
+ Namespace: api.NamespaceDefault,
+ Name: "demo",
+ },
+ })
+
+ _, err := IsValidService(fk, "")
+ if err == nil {
+ t.Errorf("expected error but retuned nil")
+ }
+ s, err := IsValidService(fk, "default/demo")
+ if err != nil {
+ t.Errorf("unexpected error: %v", err)
+ }
+ if s == nil {
+ t.Errorf("expected a Service but retuned nil")
+ }
+
+ fk = testclient.NewSimpleClientset()
+ s, err = IsValidService(fk, "default/demo")
+ if err == nil {
+ t.Errorf("expected an error but retuned nil")
+ }
+ if s != nil {
+ t.Errorf("unexpected Service returned: %v", s)
+ }
+}
+
+func TestIsValidSecret(t *testing.T) {
+ fk := testclient.NewSimpleClientset(&api.Secret{
+ ObjectMeta: api.ObjectMeta{
+ Namespace: api.NamespaceDefault,
+ Name: "demo",
+ },
+ })
+
+ _, err := IsValidSecret(fk, "")
+ if err == nil {
+ t.Errorf("expected error but retuned nil")
+ }
+ s, err := IsValidSecret(fk, "default/demo")
+ if err != nil {
+ t.Errorf("unexpected error: %v", err)
+ }
+ if s == nil {
+ t.Errorf("expected a Secret but retuned nil")
+ }
+
+ fk = testclient.NewSimpleClientset()
+ s, err = IsValidSecret(fk, "default/demo")
+ if err == nil {
+ t.Errorf("expected an error but retuned nil")
+ }
+ if s != nil {
+ t.Errorf("unexpected Secret returned: %v", s)
+ }
+}
diff --git a/core/pkg/net/dns/dns.go b/core/pkg/net/dns/dns.go
new file mode 100644
index 0000000000..1988d987c4
--- /dev/null
+++ b/core/pkg/net/dns/dns.go
@@ -0,0 +1,52 @@
+/*
+Copyright 2015 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package dns
+
+import (
+ "io/ioutil"
+ "strings"
+
+ "github.com/golang/glog"
+)
+
+// GetSystemNameServers returns the list of nameservers located in the file /etc/resolv.conf
+func GetSystemNameServers() ([]string, error) {
+ var nameservers []string
+ file, err := ioutil.ReadFile("/etc/resolv.conf")
+ if err != nil {
+ return nameservers, err
+ }
+
+ // Lines of the form "nameserver 1.2.3.4" accumulate.
+ lines := strings.Split(string(file), "\n")
+ for l := range lines {
+ trimmed := strings.TrimSpace(lines[l])
+ if strings.HasPrefix(trimmed, "#") {
+ continue
+ }
+ fields := strings.Fields(trimmed)
+ if len(fields) == 0 {
+ continue
+ }
+ if fields[0] == "nameserver" {
+ nameservers = append(nameservers, fields[1:]...)
+ }
+ }
+
+ glog.V(3).Infof("nameservers to use: %v", nameservers)
+ return nameservers, nil
+}
diff --git a/core/pkg/net/dns/dns_test.go b/core/pkg/net/dns/dns_test.go
new file mode 100644
index 0000000000..488929e880
--- /dev/null
+++ b/core/pkg/net/dns/dns_test.go
@@ -0,0 +1,31 @@
+/*
+Copyright 2015 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package dns
+
+import (
+ "testing"
+)
+
+func TestGetDNSServers(t *testing.T) {
+ s, err := GetSystemNameServers()
+ if err != nil {
+ t.Fatalf("unexpected error reading /etc/resolv.conf file: %v", err)
+ }
+ if len(s) < 1 {
+ t.Error("expected at least 1 nameserver in /etc/resolv.conf")
+ }
+}
diff --git a/core/pkg/net/ssl/ssl.go b/core/pkg/net/ssl/ssl.go
new file mode 100644
index 0000000000..14a6fbef3d
--- /dev/null
+++ b/core/pkg/net/ssl/ssl.go
@@ -0,0 +1,181 @@
+/*
+Copyright 2015 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package ssl
+
+import (
+ "crypto/sha1"
+ "crypto/x509"
+ "encoding/hex"
+ "encoding/pem"
+ "errors"
+ "fmt"
+ "io/ioutil"
+ "os"
+
+ "github.com/golang/glog"
+
+ "k8s.io/ingress/core/pkg/ingress"
+)
+
+// AddOrUpdateCertAndKey creates a .pem file wth the cert and the key with the specified name
+func AddOrUpdateCertAndKey(name string, cert, key, ca []byte) (*ingress.SSLCert, error) {
+ pemName := fmt.Sprintf("%v.pem", name)
+ pemFileName := fmt.Sprintf("%v/%v", ingress.DefaultSSLDirectory, pemName)
+
+ tempPemFile, err := ioutil.TempFile("", pemName)
+ if err != nil {
+ return nil, fmt.Errorf("could not create temp pem file %v: %v", tempPemFile.Name(), err)
+ }
+
+ _, err = tempPemFile.Write(cert)
+ if err != nil {
+ return nil, fmt.Errorf("could not write to pem file %v: %v", tempPemFile.Name(), err)
+ }
+ _, err = tempPemFile.Write([]byte("\n"))
+ if err != nil {
+ return nil, fmt.Errorf("could not write to pem file %v: %v", tempPemFile.Name(), err)
+ }
+ _, err = tempPemFile.Write(key)
+ if err != nil {
+ return nil, fmt.Errorf("could not write to pem file %v: %v", tempPemFile.Name(), err)
+ }
+
+ err = tempPemFile.Close()
+ if err != nil {
+ return nil, fmt.Errorf("could not close temp pem file %v: %v", tempPemFile.Name(), err)
+ }
+
+ pemCerts, err := ioutil.ReadFile(tempPemFile.Name())
+ if err != nil {
+ return nil, err
+ }
+
+ pembBock, _ := pem.Decode(pemCerts)
+ if pembBock == nil {
+ return nil, fmt.Errorf("No valid PEM formatted block found")
+ }
+
+ pemCert, err := x509.ParseCertificate(pembBock.Bytes)
+ if err != nil {
+ return nil, err
+ }
+
+ cn := []string{pemCert.Subject.CommonName}
+ if len(pemCert.DNSNames) > 0 {
+ cn = append(cn, pemCert.DNSNames...)
+ }
+
+ err = os.Rename(tempPemFile.Name(), pemFileName)
+ if err != nil {
+ return nil, fmt.Errorf("could not move temp pem file %v to destination %v: %v", tempPemFile.Name(), pemFileName, err)
+ }
+
+ if len(ca) > 0 {
+ bundle := x509.NewCertPool()
+ bundle.AppendCertsFromPEM(ca)
+ opts := x509.VerifyOptions{
+ Roots: bundle,
+ }
+
+ _, err := pemCert.Verify(opts)
+ if err != nil {
+ oe := fmt.Sprintf("failed to verify certificate chain: \n\t%s\n", err)
+ return nil, errors.New(oe)
+ }
+
+ caName := fmt.Sprintf("ca-%v.pem", name)
+ caFileName := fmt.Sprintf("%v/%v", ingress.DefaultSSLDirectory, caName)
+ f, err := os.Create(caFileName)
+ if err != nil {
+ return nil, fmt.Errorf("could not create ca pem file %v: %v", caFileName, err)
+ }
+ defer f.Close()
+ _, err = f.Write(ca)
+ if err != nil {
+ return nil, fmt.Errorf("could not create ca pem file %v: %v", caFileName, err)
+ }
+ f.Write([]byte("\n"))
+
+ return &ingress.SSLCert{
+ CAFileName: caFileName,
+ PemFileName: pemFileName,
+ PemSHA: pemSHA1(pemFileName),
+ CN: cn,
+ }, nil
+ }
+
+ return &ingress.SSLCert{
+ PemFileName: pemFileName,
+ PemSHA: pemSHA1(pemFileName),
+ CN: cn,
+ }, nil
+}
+
+// SearchDHParamFile iterates all the secrets mounted inside the /etc/nginx-ssl directory
+// in order to find a file with the name dhparam.pem. If such file exists it will
+// returns the path. If not it just returns an empty string
+func SearchDHParamFile(baseDir string) string {
+ files, _ := ioutil.ReadDir(baseDir)
+ for _, file := range files {
+ if !file.IsDir() {
+ continue
+ }
+
+ dhPath := fmt.Sprintf("%v/%v/dhparam.pem", baseDir, file.Name())
+ if _, err := os.Stat(dhPath); err == nil {
+ glog.Infof("using file '%v' for parameter ssl_dhparam", dhPath)
+ return dhPath
+ }
+ }
+
+ glog.Warning("no file dhparam.pem found in secrets")
+ return ""
+}
+
+// pemSHA1 returns the SHA1 of a pem file. This is used to
+// reload NGINX in case a secret with a SSL certificate changed.
+func pemSHA1(filename string) string {
+ hasher := sha1.New()
+ s, err := ioutil.ReadFile(filename)
+ if err != nil {
+ return ""
+ }
+
+ hasher.Write(s)
+ return hex.EncodeToString(hasher.Sum(nil))
+}
+
+const (
+ snakeOilPem = "/etc/ssl/certs/ssl-cert-snakeoil.pem"
+ snakeOilKey = "/etc/ssl/private/ssl-cert-snakeoil.key"
+)
+
+// GetFakeSSLCert returns the snake oil ssl certificate created by the command
+// make-ssl-cert generate-default-snakeoil --force-overwrite
+func GetFakeSSLCert() ([]byte, []byte) {
+ cert, err := ioutil.ReadFile(snakeOilPem)
+ if err != nil {
+ return nil, nil
+ }
+
+ key, err := ioutil.ReadFile(snakeOilKey)
+ if err != nil {
+ return nil, nil
+ }
+
+ return cert, key
+}
diff --git a/controllers/nginx/nginx/ssl_test.go b/core/pkg/net/ssl/ssl_test.go
similarity index 94%
rename from controllers/nginx/nginx/ssl_test.go
rename to core/pkg/net/ssl/ssl_test.go
index 7cab68ce49..b4d3c5effa 100644
--- a/controllers/nginx/nginx/ssl_test.go
+++ b/core/pkg/net/ssl/ssl_test.go
@@ -14,20 +14,25 @@ See the License for the specific language governing permissions and
limitations under the License.
*/
-package nginx
+package ssl
import (
"encoding/base64"
"fmt"
- "os"
+ "io/ioutil"
"testing"
"time"
- "k8s.io/contrib/ingress/controllers/nginx/nginx/config"
+ "k8s.io/ingress/core/pkg/ingress"
)
func TestAddOrUpdateCertAndKey(t *testing.T) {
- config.SSLDirectory = os.TempDir()
+ td, err := ioutil.TempDir("", "ssl")
+ if err != nil {
+ t.Fatalf("Unexpected error creating temporal directory: %v", err)
+ }
+ ingress.DefaultSSLDirectory = td
+
// openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /tmp/tls.key -out /tmp/tls.crt -subj "/CN=echoheaders/O=echoheaders"
tlsCrt := "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURhakNDQWxLZ0F3SUJBZ0lKQUxHUXR5VVBKTFhYTUEwR0NTcUdTSWIzRFFFQkJRVUFNQ3d4RkRBU0JnTlYKQkFNVEMyVmphRzlvWldGa1pYSnpNUlF3RWdZRFZRUUtFd3RsWTJodmFHVmhaR1Z5Y3pBZUZ3MHhOakF6TXpFeQpNekU1TkRoYUZ3MHhOekF6TXpFeU16RTVORGhhTUN3eEZEQVNCZ05WQkFNVEMyVmphRzlvWldGa1pYSnpNUlF3CkVnWURWUVFLRXd0bFkyaHZhR1ZoWkdWeWN6Q0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0MKZ2dFQkFONzVmS0N5RWwxanFpMjUxTlNabDYzeGQweG5HMHZTVjdYL0xxTHJveVNraW5nbnI0NDZZWlE4UEJWOAo5TUZzdW5RRGt1QVoyZzA3NHM1YWhLSm9BRGJOMzhld053RXNsVDJkRzhRTUw0TktrTUNxL1hWbzRQMDFlWG1PCmkxR2txZFA1ZUExUHlPZCtHM3gzZmxPN2xOdmtJdHVHYXFyc0tvMEhtMHhqTDVtRUpwWUlOa0tGSVhsWWVLZS8KeHRDR25CU2tLVHFMTG0yeExKSGFFcnJpaDZRdkx4NXF5U2gzZTU2QVpEcTlkTERvcWdmVHV3Z2IzekhQekc2NwppZ0E0dkYrc2FRNHpZUE1NMHQyU1NiVkx1M2pScWNvL3lxZysrOVJBTTV4bjRubnorL0hUWFhHKzZ0RDBaeGI1CmVVRDNQakVhTnlXaUV2dTN6UFJmdysyNURMY0NBd0VBQWFPQmpqQ0JpekFkQmdOVkhRNEVGZ1FVcktMZFhHeUUKNUlEOGRvd2lZNkdzK3dNMHFKc3dYQVlEVlIwakJGVXdVNEFVcktMZFhHeUU1SUQ4ZG93aVk2R3Mrd00wcUp1aApNS1F1TUN3eEZEQVNCZ05WQkFNVEMyVmphRzlvWldGa1pYSnpNUlF3RWdZRFZRUUtFd3RsWTJodmFHVmhaR1Z5CmM0SUpBTEdRdHlVUEpMWFhNQXdHQTFVZEV3UUZNQU1CQWY4d0RRWUpLb1pJaHZjTkFRRUZCUUFEZ2dFQkFNZVMKMHFia3VZa3Z1enlSWmtBeE1PdUFaSDJCK0Evb3N4ODhFRHB1ckV0ZWN5RXVxdnRvMmpCSVdCZ2RkR3VBYU5jVQorUUZDRm9NakJOUDVWVUxIWVhTQ3VaczN2Y25WRDU4N3NHNlBaLzhzbXJuYUhTUjg1ZVpZVS80bmFyNUErdWErClIvMHJrSkZnOTlQSmNJd3JmcWlYOHdRcWdJVVlLNE9nWEJZcUJRL0VZS2YvdXl6UFN3UVZYRnVJTTZTeDBXcTYKTUNML3d2RlhLS0FaWDBqb3J4cHRjcldkUXNCcmYzWVRnYmx4TE1sN20zL2VuR1drcEhDUHdYeVRCOC9rRkw3SApLL2ZHTU1NWGswUkVSbGFPM1hTSUhrZUQ2SXJiRnRNV3R1RlJwZms2ZFA2TXlMOHRmTmZ6a3VvUHVEWUFaWllWCnR1NnZ0c0FRS0xWb0pGaGV0b1k9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K"
tlsKey := "LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFb3dJQkFBS0NBUUVBM3ZsOG9MSVNYV09xTGJuVTFKbVhyZkYzVEdjYlM5Slh0Zjh1b3V1akpLU0tlQ2V2CmpqcGhsRHc4Rlh6MHdXeTZkQU9TNEJuYURUdml6bHFFb21nQU5zM2Z4N0EzQVN5VlBaMGJ4QXd2ZzBxUXdLcjkKZFdqZy9UVjVlWTZMVWFTcDAvbDREVS9JNTM0YmZIZCtVN3VVMitRaTI0WnFxdXdxalFlYlRHTXZtWVFtbGdnMgpRb1VoZVZoNHA3L0cwSWFjRktRcE9vc3ViYkVza2RvU3V1S0hwQzh2SG1ySktIZDdub0JrT3IxMHNPaXFCOU83CkNCdmZNYy9NYnJ1S0FEaThYNnhwRGpOZzh3elMzWkpKdFV1N2VOR3B5ai9LcUQ3NzFFQXpuR2ZpZWZQNzhkTmQKY2I3cTBQUm5Gdmw1UVBjK01SbzNKYUlTKzdmTTlGL0Q3YmtNdHdJREFRQUJBb0lCQUViNmFEL0hMNjFtMG45bgp6bVkyMWwvYW83MUFmU0h2dlZnRCtWYUhhQkY4QjFBa1lmQUdpWlZrYjBQdjJRSFJtTERoaWxtb0lROWhadHVGCldQOVIxKythTFlnbGdmenZzanBBenR2amZTUndFaEFpM2pnSHdNY1p4S2Q3UnNJZ2hxY2huS093S0NYNHNNczQKUnBCbEFBZlhZWGs4R3F4NkxUbGptSDRDZk42QzZHM1EwTTlLMUxBN2lsck1Na3hwcngxMnBlVTNkczZMVmNpOQptOFdBL21YZ2I0c3pEbVNaWVpYRmNZMEhYNTgyS3JKRHpQWEVJdGQwZk5wd3I0eFIybzdzMEwvK2RnZCtqWERjCkh2SDBKZ3NqODJJaTIxWGZGM2tST3FxR3BKNmhVcncxTUZzVWRyZ29GL3pFck0vNWZKMDdVNEhodGFlalVzWTIKMFJuNXdpRUNnWUVBKzVUTVRiV084Wkg5K2pIdVQwc0NhZFBYcW50WTZYdTZmYU04Tm5CZWNoeTFoWGdlQVN5agpSWERlZGFWM1c0SjU5eWxIQ3FoOVdseVh4cDVTWWtyQU41RnQ3elFGYi91YmorUFIyWWhMTWZpYlBSYlYvZW1MCm5YaGF6MmtlNUUxT1JLY0x6QUVwSmpuZGQwZlZMZjdmQzFHeStnS2YyK3hTY1hjMHJqRE5iNGtDZ1lFQTR1UVEKQk91TlJQS3FKcDZUZS9zUzZrZitHbEpjQSs3RmVOMVlxM0E2WEVZVm9ydXhnZXQ4a2E2ZEo1QjZDOWtITGtNcQpwdnFwMzkxeTN3YW5uWC9ONC9KQlU2M2RxZEcyd1BWRUQ0REduaE54Qm1oaWZpQ1I0R0c2ZnE4MUV6ZE1vcTZ4CklTNHA2RVJaQnZkb1RqNk9pTHl6aUJMckpxeUhIMWR6c0hGRlNqOENnWUVBOWlSSEgyQ2JVazU4SnVYak8wRXcKUTBvNG4xdS9TZkQ4TFNBZ01VTVBwS1hpRTR2S0Qyd1U4a1BUNDFiWXlIZUh6UUpkdDFmU0RTNjZjR0ZHU1ZUSgphNVNsOG5yN051ejg3bkwvUmMzTGhFQ3Y0YjBOOFRjbW1oSy9CbDdiRXBOd0dFczNoNGs3TVdNOEF4QU15c3VxCmZmQ1pJM0tkNVJYNk0zbGwyV2QyRjhFQ2dZQlQ5RU9oTG0vVmhWMUVjUVR0cVZlMGJQTXZWaTVLSGozZm5UZkUKS0FEUVIvYVZncElLR3RLN0xUdGxlbVpPbi8yeU5wUS91UnpHZ3pDUUtldzNzU1RFSmMzYVlzbFVudzdhazJhZAp2ZTdBYXowMU84YkdHTk1oamNmdVBIS05LN2Nsc3pKRHJzcys4SnRvb245c0JHWEZYdDJuaWlpTTVPWVN5TTg4CkNJMjFEUUtCZ0hEQVRZbE84UWlDVWFBQlVqOFBsb1BtMDhwa3cyc1VmQW0xMzJCY00wQk9BN1hqYjhtNm1ManQKOUlteU5kZ2ZiM080UjlKVUxTb1pZSTc1dUxIL3k2SDhQOVlpWHZOdzMrTXl6VFU2b2d1YU8xSTNya2pna29NeAo5cU5pYlJFeGswS1A5MVZkckVLSEdHZEFwT05ES1N4VzF3ektvbUxHdmtYSTVKV05KRXFkCi0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCg=="
@@ -43,10 +48,8 @@ func TestAddOrUpdateCertAndKey(t *testing.T) {
t.Fatalf("Unexpected error: %+v", err)
}
- ngx := &Manager{}
-
name := fmt.Sprintf("test-%v", time.Now().UnixNano())
- ngxCert, err := ngx.AddOrUpdateCertAndKey(name, string(dCrt), string(dKey))
+ ngxCert, err := AddOrUpdateCertAndKey(name, dCrt, dKey, []byte{})
if err != nil {
t.Fatalf("unexpected error checking SSL certificate: %v", err)
}
diff --git a/core/pkg/strings/string.go b/core/pkg/strings/string.go
new file mode 100644
index 0000000000..f866e6a461
--- /dev/null
+++ b/core/pkg/strings/string.go
@@ -0,0 +1,27 @@
+/*
+Copyright 2015 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package strings
+
+// StringInSlice check whether string a is a member of slice.
+func StringInSlice(a string, slice []string) bool {
+ for _, b := range slice {
+ if b == a {
+ return true
+ }
+ }
+ return false
+}
diff --git a/core/pkg/task/queue.go b/core/pkg/task/queue.go
new file mode 100644
index 0000000000..e7fd0a848e
--- /dev/null
+++ b/core/pkg/task/queue.go
@@ -0,0 +1,123 @@
+/*
+Copyright 2015 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package task
+
+import (
+ "fmt"
+ "time"
+
+ "github.com/golang/glog"
+
+ "k8s.io/kubernetes/pkg/client/cache"
+ "k8s.io/kubernetes/pkg/util/wait"
+ "k8s.io/kubernetes/pkg/util/workqueue"
+)
+
+var (
+ keyFunc = cache.DeletionHandlingMetaNamespaceKeyFunc
+)
+
+// Queue manages a work queue through an independent worker that
+// invokes the given sync function for every work item inserted.
+type Queue struct {
+ // queue is the work queue the worker polls
+ queue workqueue.RateLimitingInterface
+ // sync is called for each item in the queue
+ sync func(interface{}) error
+ // workerDone is closed when the worker exits
+ workerDone chan struct{}
+
+ fn func(obj interface{}) (interface{}, error)
+}
+
+// Run ...
+func (t *Queue) Run(period time.Duration, stopCh <-chan struct{}) {
+ wait.Until(t.worker, period, stopCh)
+}
+
+// Enqueue enqueues ns/name of the given api object in the task queue.
+func (t *Queue) Enqueue(obj interface{}) {
+ glog.V(3).Infof("queuing item %v", obj)
+ key, err := t.fn(obj)
+ if err != nil {
+ glog.Errorf("%v", err)
+ return
+ }
+ t.queue.Add(key)
+}
+
+func (t *Queue) defaultKeyFunc(obj interface{}) (interface{}, error) {
+ key, err := keyFunc(obj)
+ if err != nil {
+ return "", fmt.Errorf("could not get key for object %+v: %v", obj, err)
+ }
+
+ return key, nil
+}
+
+// worker processes work in the queue through sync.
+func (t *Queue) worker() {
+ for {
+ key, quit := t.queue.Get()
+ if quit {
+ close(t.workerDone)
+ return
+ }
+ glog.V(3).Infof("syncing %v", key)
+ if err := t.sync(key); err != nil {
+ glog.Warningf("requeuing %v, err %v", key, err)
+ t.queue.AddRateLimited(key)
+ } else {
+ t.queue.Forget(key)
+ }
+
+ t.queue.Done(key)
+ }
+}
+
+// Shutdown shuts down the work queue and waits for the worker to ACK
+func (t *Queue) Shutdown() {
+ t.queue.ShutDown()
+ <-t.workerDone
+}
+
+// IsShuttingDown returns if the method Shutdown was invoked
+func (t *Queue) IsShuttingDown() bool {
+ return t.queue.ShuttingDown()
+}
+
+// NewTaskQueue creates a new task queue with the given sync function.
+// The sync function is called for every element inserted into the queue.
+func NewTaskQueue(syncFn func(interface{}) error) *Queue {
+ return NewCustomTaskQueue(syncFn, nil)
+}
+
+// NewCustomTaskQueue ...
+func NewCustomTaskQueue(syncFn func(interface{}) error, fn func(interface{}) (interface{}, error)) *Queue {
+ q := &Queue{
+ queue: workqueue.NewRateLimitingQueue(workqueue.DefaultControllerRateLimiter()),
+ sync: syncFn,
+ workerDone: make(chan struct{}),
+ fn: fn,
+ }
+
+ if fn == nil {
+ q.fn = q.defaultKeyFunc
+ }
+
+ return q
+}
diff --git a/controllers/nginx/nginx/template/file_watcher.go b/core/pkg/watch/file_watcher.go
similarity index 78%
rename from controllers/nginx/nginx/template/file_watcher.go
rename to core/pkg/watch/file_watcher.go
index 8a1d05bac9..fe85c4cd0d 100644
--- a/controllers/nginx/nginx/template/file_watcher.go
+++ b/core/pkg/watch/file_watcher.go
@@ -14,7 +14,7 @@ See the License for the specific language governing permissions and
limitations under the License.
*/
-package template
+package watch
import (
"log"
@@ -23,28 +23,31 @@ import (
"gopkg.in/fsnotify.v1"
)
-type fileWatcher struct {
+// FileWatcher defines a watch over a file
+type FileWatcher struct {
file string
watcher *fsnotify.Watcher
+ // onEvent callback to be invoked after the file being watched changes
onEvent func()
}
-func newFileWatcher(file string, onEvent func()) (fileWatcher, error) {
- fw := fileWatcher{
+// NewFileWatcher creates a new FileWatcher
+func NewFileWatcher(file string, onEvent func()) (FileWatcher, error) {
+ fw := FileWatcher{
file: file,
onEvent: onEvent,
}
-
err := fw.watch()
return fw, err
}
-func (f fileWatcher) close() error {
+// Close ends the watch
+func (f FileWatcher) Close() error {
return f.watcher.Close()
}
// watch creates a fsnotify watcher for a file and create of write events
-func (f *fileWatcher) watch() error {
+func (f *FileWatcher) watch() error {
watcher, err := fsnotify.NewWatcher()
if err != nil {
return err
diff --git a/core/pkg/watch/file_watcher_test.go b/core/pkg/watch/file_watcher_test.go
new file mode 100644
index 0000000000..31833f74ff
--- /dev/null
+++ b/core/pkg/watch/file_watcher_test.go
@@ -0,0 +1,45 @@
+/*
+Copyright 2015 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package watch
+
+import (
+ "io/ioutil"
+ "testing"
+)
+
+func TestFileWatcher(t *testing.T) {
+ file, err := ioutil.TempFile("", "fw")
+ if err != nil {
+ t.Fatalf("unexpected error: %v", err)
+ }
+ defer file.Close()
+ count := 0
+ fw, err := NewFileWatcher(file.Name(), func() {
+ count++
+ if count != 1 {
+ t.Fatalf("expected 1 but returned %v", count)
+ }
+ })
+ if err != nil {
+ t.Fatalf("unexpected error: %v", err)
+ }
+ defer fw.Close()
+ if count != 0 {
+ t.Fatalf("expected 0 but returned %v", count)
+ }
+ ioutil.WriteFile(file.Name(), []byte{}, 0644)
+}
diff --git a/hack/e2e-internal/e2e-down.sh b/hack/e2e-internal/e2e-down.sh
new file mode 100755
index 0000000000..62ee7aec29
--- /dev/null
+++ b/hack/e2e-internal/e2e-down.sh
@@ -0,0 +1,14 @@
+#!/usr/bin/env bash
+
+[[ $DEBUG ]] && set -x
+
+set -eof pipefail
+
+# include env
+. hack/e2e-internal/e2e-env.sh
+
+echo "Destroying running docker containers..."
+# do not failt if the container is not running
+docker rm -f kubelet || true
+docker rm -f apiserver || true
+docker rm -f etcd || true
diff --git a/hack/e2e-internal/e2e-env.sh b/hack/e2e-internal/e2e-env.sh
new file mode 100755
index 0000000000..d0747bb6e0
--- /dev/null
+++ b/hack/e2e-internal/e2e-env.sh
@@ -0,0 +1,21 @@
+#!/usr/bin/env bash
+
+[[ $DEBUG ]] && set -x
+
+export ETCD_VERSION=3.0.14
+export K8S_VERSION=1.4.5
+
+export PWD=`pwd`
+export BASEDIR="$(dirname ${BASH_SOURCE})"
+export KUBECTL="${BASEDIR}/kubectl"
+export GOOS="${GOOS:-linux}"
+
+if [ ! -e ${KUBECTL} ]; then
+ echo "kubectl binary is missing. downloading..."
+ curl -sSL http://storage.googleapis.com/kubernetes-release/release/v${K8S_VERSION}/bin/${GOOS}/amd64/kubectl -o ${KUBECTL}
+ chmod u+x ${KUBECTL}
+fi
+
+${KUBECTL} config set-cluster travis --server=http://0.0.0.0:8080
+${KUBECTL} config set-context travis --cluster=travis
+${KUBECTL} config use-context travis
diff --git a/hack/e2e-internal/e2e-status.sh b/hack/e2e-internal/e2e-status.sh
new file mode 100755
index 0000000000..21a4e9b291
--- /dev/null
+++ b/hack/e2e-internal/e2e-status.sh
@@ -0,0 +1,11 @@
+#!/usr/bin/env bash
+
+[[ $DEBUG ]] && set -x
+
+set -eof pipefail
+
+# include env
+. hack/e2e-internal/e2e-env.sh
+
+echo "Kubernetes information:"
+${KUBECTL} version
diff --git a/hack/e2e-internal/e2e-up.sh b/hack/e2e-internal/e2e-up.sh
new file mode 100755
index 0000000000..15b2d46312
--- /dev/null
+++ b/hack/e2e-internal/e2e-up.sh
@@ -0,0 +1,55 @@
+#!/usr/bin/env bash
+
+[[ $DEBUG ]] && set -x
+
+set -eof pipefail
+
+# include env
+. hack/e2e-internal/e2e-env.sh
+
+echo "Starting etcd..."
+docker run -d \
+ --net=host \
+ --name=etcd \
+ quay.io/coreos/etcd:v$ETCD_VERSION
+
+echo "Starting kubernetes..."
+
+docker run -d --name=apiserver \
+ --net=host \
+ --pid=host \
+ --privileged=true \
+ gcr.io/google_containers/hyperkube:v${K8S_VERSION} \
+ /hyperkube apiserver \
+ --insecure-bind-address=0.0.0.0 \
+ --service-cluster-ip-range=10.0.0.1/24 \
+ --etcd_servers=http://127.0.0.1:4001 \
+ --v=2
+
+docker run -d --name=kubelet \
+ --volume=/:/rootfs:ro \
+ --volume=/sys:/sys:ro \
+ --volume=/dev:/dev \
+ --volume=/var/lib/docker/:/var/lib/docker:rw \
+ --volume=/var/lib/kubelet/:/var/lib/kubelet:rw \
+ --volume=/var/run:/var/run:rw \
+ --net=host \
+ --pid=host \
+ --privileged=true \
+ gcr.io/google_containers/hyperkube:v${K8S_VERSION} \
+ /hyperkube kubelet \
+ --containerized \
+ --hostname-override="0.0.0.0" \
+ --address="0.0.0.0" \
+ --cluster_dns=10.0.0.10 --cluster_domain=cluster.local \
+ --api-servers=http://localhost:8080 \
+ --config=/etc/kubernetes/manifests-multi
+
+echo "waiting until api server is available..."
+until curl -o /dev/null -sIf http://0.0.0.0:8080; do \
+ sleep 10;
+done;
+
+echo "Kubernetes started"
+echo "Kubernetes information:"
+${KUBECTL} version
diff --git a/hack/e2e-internal/ginkgo-e2e.sh b/hack/e2e-internal/ginkgo-e2e.sh
new file mode 100755
index 0000000000..aa3c61ce6e
--- /dev/null
+++ b/hack/e2e-internal/ginkgo-e2e.sh
@@ -0,0 +1,3 @@
+#!/usr/bin/env bash
+
+echo "running ginkgo"
\ No newline at end of file
diff --git a/hack/e2e.go b/hack/e2e.go
new file mode 100644
index 0000000000..d6ef3fa060
--- /dev/null
+++ b/hack/e2e.go
@@ -0,0 +1,285 @@
+/*
+Copyright 2014 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+// e2e.go runs the e2e test suite. No non-standard package dependencies; call with "go run".
+package main
+
+import (
+ "encoding/xml"
+ "flag"
+ "fmt"
+ "io/ioutil"
+ "log"
+ "os"
+ "os/exec"
+ "path/filepath"
+ "strings"
+ "time"
+)
+
+var (
+ build = flag.Bool("build", true, "Build the backends images indicated by the env var BACKENDS required to run e2e tests.")
+ up = flag.Bool("up", true, "Creates a kubernetes cluster using hyperkube (containerized kubelet).")
+ down = flag.Bool("down", true, "destroys the created cluster.")
+ test = flag.Bool("test", true, "Run Ginkgo tests.")
+ dump = flag.String("dump", "", "If set, dump cluster logs to this location on test or cluster-up failure")
+ testArgs = flag.String("test-args", "", "Space-separated list of arguments to pass to Ginkgo test runner.")
+ deployment = flag.String("deployment", "bash", "up/down mechanism")
+ verbose = flag.Bool("v", false, "If true, print all command output.")
+)
+
+func appendError(errs []error, err error) []error {
+ if err != nil {
+ return append(errs, err)
+ }
+ return errs
+}
+
+func validWorkingDirectory() error {
+ cwd, err := os.Getwd()
+ if err != nil {
+ return fmt.Errorf("could not get pwd: %v", err)
+ }
+ acwd, err := filepath.Abs(cwd)
+ if err != nil {
+ return fmt.Errorf("failed to convert %s to an absolute path: %v", cwd, err)
+ }
+ if !strings.Contains(filepath.Base(acwd), "ingress-controller") {
+ return fmt.Errorf("must run from git root directory: %v", acwd)
+ }
+ return nil
+}
+
+type TestCase struct {
+ XMLName xml.Name `xml:"testcase"`
+ ClassName string `xml:"classname,attr"`
+ Name string `xml:"name,attr"`
+ Time float64 `xml:"time,attr"`
+ Failure string `xml:"failure,omitempty"`
+}
+
+type TestSuite struct {
+ XMLName xml.Name `xml:"testsuite"`
+ Failures int `xml:"failures,attr"`
+ Tests int `xml:"tests,attr"`
+ Time float64 `xml:"time,attr"`
+ Cases []TestCase
+}
+
+var suite TestSuite
+
+func xmlWrap(name string, f func() error) error {
+ start := time.Now()
+ err := f()
+ duration := time.Since(start)
+ c := TestCase{
+ Name: name,
+ ClassName: "e2e.go",
+ Time: duration.Seconds(),
+ }
+ if err != nil {
+ c.Failure = err.Error()
+ suite.Failures++
+ }
+ suite.Cases = append(suite.Cases, c)
+ suite.Tests++
+ return err
+}
+
+func writeXML(start time.Time) {
+ suite.Time = time.Since(start).Seconds()
+ out, err := xml.MarshalIndent(&suite, "", " ")
+ if err != nil {
+ log.Fatalf("Could not marshal XML: %s", err)
+ }
+ path := filepath.Join(*dump, "junit_runner.xml")
+ f, err := os.Create(path)
+ if err != nil {
+ log.Fatalf("Could not create file: %s", err)
+ }
+ defer f.Close()
+ if _, err := f.WriteString(xml.Header); err != nil {
+ log.Fatalf("Error writing XML header: %s", err)
+ }
+ if _, err := f.Write(out); err != nil {
+ log.Fatalf("Error writing XML data: %s", err)
+ }
+ log.Printf("Saved XML output to %s.", path)
+}
+
+func main() {
+ log.SetFlags(log.LstdFlags | log.Lshortfile)
+ flag.Parse()
+
+ if err := validWorkingDirectory(); err != nil {
+ log.Fatalf("Called from invalid working directory: %v", err)
+ }
+
+ deploy, err := getDeployer()
+ if err != nil {
+ log.Fatalf("Error creating deployer: %v", err)
+ }
+
+ if err := run(deploy); err != nil {
+ log.Fatalf("Something went wrong: %s", err)
+ }
+}
+
+func run(deploy deployer) error {
+ if *dump != "" {
+ defer writeXML(time.Now())
+ }
+
+ if *build {
+ if err := xmlWrap("Build", Build); err != nil {
+ return fmt.Errorf("error building: %s", err)
+ }
+ }
+
+ if *up {
+ if err := xmlWrap("TearDown", deploy.Down); err != nil {
+ return fmt.Errorf("error tearing down previous cluster: %s", err)
+ }
+ }
+
+ var errs []error
+
+ if *up {
+ // If we tried to bring the cluster up, make a courtesy
+ // attempt to bring it down so we're not leaving resources around.
+ //
+ // TODO: We should try calling deploy.Down exactly once. Though to
+ // stop the leaking resources for now, we want to be on the safe side
+ // and call it explictly in defer if the other one is not called.
+ if *down {
+ defer xmlWrap("Deferred TearDown", deploy.Down)
+ }
+ // Start the cluster using this version.
+ if err := xmlWrap("Up", deploy.Up); err != nil {
+ return fmt.Errorf("starting e2e cluster: %s", err)
+ }
+ if *dump != "" {
+ cmd := exec.Command("./cluster/kubectl.sh", "--match-server-version=false", "get", "nodes", "-oyaml")
+ b, err := cmd.CombinedOutput()
+ if *verbose {
+ log.Printf("kubectl get nodes:\n%s", string(b))
+ }
+ if err == nil {
+ if err := ioutil.WriteFile(filepath.Join(*dump, "nodes.yaml"), b, 0644); err != nil {
+ errs = appendError(errs, fmt.Errorf("error writing nodes.yaml: %v", err))
+ }
+ } else {
+ errs = appendError(errs, fmt.Errorf("error running get nodes: %v", err))
+ }
+ }
+ }
+
+ if *test {
+ if err := xmlWrap("IsUp", deploy.IsUp); err != nil {
+ errs = appendError(errs, err)
+ } else {
+ errs = appendError(errs, Test())
+ }
+ }
+
+ if len(errs) > 0 && *dump != "" {
+ errs = appendError(errs, xmlWrap("DumpClusterLogs", func() error {
+ return DumpClusterLogs(*dump)
+ }))
+ }
+
+ if *down {
+ errs = appendError(errs, xmlWrap("TearDown", deploy.Down))
+ }
+
+ if len(errs) != 0 {
+ return fmt.Errorf("encountered %d errors: %v", len(errs), errs)
+ }
+ return nil
+}
+
+func Build() error {
+ // The build-release script needs stdin to ask the user whether
+ // it's OK to download the docker image.
+ cmd := exec.Command("make", "backends", "backends-images", "backends-push")
+ cmd.Stdin = os.Stdin
+ if err := finishRunning("build-release", cmd); err != nil {
+ return fmt.Errorf("error building: %v", err)
+ }
+ return nil
+}
+
+type deployer interface {
+ Up() error
+ IsUp() error
+ SetupKubecfg() error
+ Down() error
+}
+
+func getDeployer() (deployer, error) {
+ switch *deployment {
+ case "bash":
+ return bash{}, nil
+ default:
+ return nil, fmt.Errorf("Unknown deployment strategy %q", *deployment)
+ }
+}
+
+type bash struct{}
+
+func (b bash) Up() error {
+ return finishRunning("up", exec.Command("./hack/e2e-internal/e2e-up.sh"))
+}
+
+func (b bash) IsUp() error {
+ return finishRunning("get status", exec.Command("./hack/e2e-internal/e2e-status.sh"))
+}
+
+func (b bash) SetupKubecfg() error {
+ return nil
+}
+
+func (b bash) Down() error {
+ return finishRunning("teardown", exec.Command("./hack/e2e-internal/e2e-down.sh"))
+}
+
+func DumpClusterLogs(location string) error {
+ log.Printf("Dumping cluster logs to: %v", location)
+ return finishRunning("dump cluster logs", exec.Command("./hack/e2e-internal/log-dump.sh", location))
+}
+
+func Test() error {
+ if *testArgs == "" {
+ *testArgs = "--ginkgo.focus=\\[Feature:Ingress\\]"
+ }
+ return finishRunning("Ginkgo tests", exec.Command("./hack/e2e-internal/ginkgo-e2e.sh", strings.Fields(*testArgs)...))
+}
+
+func finishRunning(stepName string, cmd *exec.Cmd) error {
+ if *verbose {
+ cmd.Stdout = os.Stdout
+ cmd.Stderr = os.Stderr
+ }
+ log.Printf("Running: %v", stepName)
+ defer func(start time.Time) {
+ log.Printf("Step '%s' finished in %s", stepName, time.Since(start))
+ }(time.Now())
+
+ if err := cmd.Run(); err != nil {
+ return fmt.Errorf("error running %v: %v", stepName, err)
+ }
+ return nil
+}