我的nginx.conf文件目前直接定义了路由:
worker_processes auto;
events { worker_connections 1024; }
http {
upstream wordSearcherApi {
least_conn;
server api1:61370 max_fails=3 fail_timeout=30s;
server api2:61370 max_fails=3 fail_timeout=30s;
server api3:61370 max_fails=3 fail_timeout=30s;
}
server {
listen 80;
server_name server_name 0.0.0.0;
location / {
proxy_pass http://wordSearcherApi;
}
}
}
有没有办法在docker-compose.yml中创建一个服务,而在docker-compose up --scale api=3
时,nginx会自动进行负载均衡吗?
答案 0 :(得分:2)
目前的配置无法实现,因为它是静态的。你有两个选择 -
<强> 1。使用docker engine swarm模式 - 您可以定义副本&amp; swarm内部DNS将自动平衡这些副本的负载 参考 - https://docs.docker.com/engine/swarm/
<强> 2。使用着名的Jwilder nginx代理 - 此图像侦听docker套接字,使用GO中的模板在向上或向下扩展容器时动态更改nginx配置。
参考 - https://github.com/jwilder/nginx-proxy
答案 1 :(得分:1)
在Nginx(正常,无Sans Plus)中可以实现动态上游,但有技巧和局限性。
您放弃使用upstream
指令,而使用普通的proxy_pass
。
它提供循环负载平衡和故障转移,但没有the directive的额外功能,例如权重,故障模式,超时等。
您的上游主机名必须通过变量传递给proxy_pass
,并且您必须提供resolver
。
它强制Nginx重新解析主机名(针对Docker网络的DNS)。
您失去了与后跟斜杠有关的location
/ proxy_pass
行为。
如果像问题中那样反向代理为裸/
,则没关系。否则,您必须手动rewrite
路径(请参见下面的参考资料)。
让我们看看它是如何工作的。
docker-compose.yml
version: '2.2'
services:
reverse-proxy:
image: nginx:1.15-alpine
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
ports:
- 8080:8080
app:
# A container that exposes an API to show its IP address
image: containous/whoami
scale: 4
nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
access_log /dev/stdout;
error_log /dev/stderr;
server {
listen 8080;
server_name localhost;
resolver 127.0.0.11 valid=5s;
set $upstream app;
location / {
proxy_pass http://$upstream:80;
}
}
}
然后...
docker-compose up -d
seq 10 | xargs -I -- curl -s localhost:8080 | grep "IP: 172"
...产生类似于以下内容的内容,表明请求已分布在4个app
容器中:
IP: 172.30.0.2
IP: 172.30.0.2
IP: 172.30.0.3
IP: 172.30.0.3
IP: 172.30.0.6
IP: 172.30.0.5
IP: 172.30.0.3
IP: 172.30.0.6
IP: 172.30.0.5
IP: 172.30.0.5
参考文献:
Traefik直接依赖Docker API,并且可能是一个更简单且可配置的选项。让我们来看看它的作用。
docker-compose.yml
version: '2.2'
services:
reverse-proxy:
image: traefik
# Enables the web UI and tells Traefik to listen to docker
command: --api --docker
ports:
- 8080:80
- 8081:8080 # Traefik's web UI, enabled by --api
volumes:
# So that Traefik can listen to the Docker events
- /var/run/docker.sock:/var/run/docker.sock
app:
image: containous/whoami
scale: 4
labels:
- "traefik.frontend.rule=Host:localhost"
然后...
docker-compose up -d
seq 10 | xargs -I -- curl -s localhost:8080 | grep "IP: 172"
...还会产生一些输出,指示请求已分布在4个app
容器中:
IP: 172.31.0.2
IP: 172.31.0.5
IP: 172.31.0.6
IP: 172.31.0.4
IP: 172.31.0.2
IP: 172.31.0.5
IP: 172.31.0.6
IP: 172.31.0.4
IP: 172.31.0.2
IP: 172.31.0.5
在Traefik用户界面(示例中为http://localhost:8081/dashboard/
)中,您可以看到它识别出4个app
容器:
参考文献: