我在docker-swarm中运行1个manager和2个worker节点。
工作节点运行3个堆栈与php/nginx网站,所以这是site1,site2,在浏览器中加载"This is site*/(worker1 or worker2)“的site3。当我在其中一个节点上放置反向代理时,这可以很好地工作。
但我想在管理器节点上放置一个负载均衡器/反向代理,我还禁用了其他两个堆栈,因此在本例中,两个工作节点上都只有"site1“堆栈。他们的Ip是"10.0.14.16“和"10.0.14.17”。
这是LB/RP nignx配置文件。
upstream site1_nginx {
server 10.0.14.16;
server 10.0.14.17;
}
server {
listen 80;
server_name site1.local;
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://site1_nginx;
}
}这是nignx的docker组合文件:
version: '3'
services:
nginx:
image: nginx:latest
deploy:
placement:
constraints:
- node.role==manager
mode: global
ports:
- "80:80"
volumes:
- "./conf.d/:/etc/nginx/conf.d"
networks:
- reprox
networks:
reprox:
external: true但是当我创建服务时,我得到了这个错误:
loadbalancer_nginx.0.ua0z0l8gm18e@ubuntu-vm1 | 2019/10/11 14:36:00 [error] 6#6: *12 connect() failed (111: Connection refused) while connecting to upstream, client: 10.255.0.2, server: site1.local, request: "GET / HTTP/1.1", upstream: "http://10.0.14.17:80/", host: "site1.local"
loadbalancer_nginx.0.ua0z0l8gm18e@ubuntu-vm1 | 2019/10/11 14:36:00 [warn] 6#6: *12 upstream server temporarily disabled while connecting to upstream, client: 10.255.0.2, server: site1.local, request: "GET / HTTP/1.1", upstream: "http://10.0.14.17:80/", host: "site1.local"
loadbalancer_nginx.0.ua0z0l8gm18e@ubuntu-vm1 | 2019/10/11 14:36:00 [error] 6#6: *12 connect() failed (111: Connection refused) while connecting to upstream, client: 10.255.0.2, server: site1.local, request: "GET / HTTP/1.1", upstream: "http://10.0.14.16:80/", host: "site1.local"
loadbalancer_nginx.0.ua0z0l8gm18e@ubuntu-vm1 | 2019/10/11 14:36:00 [warn] 6#6: *12 upstream server temporarily disabled while connecting to upstream, client: 10.255.0.2, server: site1.local, request: "GET / HTTP/1.1", upstream: "http://10.0.14.16:80/", host: "site1.local"
loadbalancer_nginx.0.ua0z0l8gm18e@ubuntu-vm1 | 2019/10/11 14:36:01 [error] 6#6: *12 no live upstreams while connecting to upstream, client: 10.255.0.2, server: site1.local, request: "GET / HTTP/1.1", upstream: "http://site1_nginx/", host: "site1.local"另外,如果需要,还可以使用site1 nginx站点配置:
server {
listen 80 default_server;
listen [::]:80 default_server;
index index.php index.html;
server_name site1.local;
resolver 127.0.0.11;
error_log /var/log/nginx/error.log;
access_log /var/log/nginx/access.log;
root /code;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
set $upstream php:9000;
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass $upstream;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
}docker网络很好,我确实有一个覆盖网络和php和nignx之间的网络。
发布于 2019-10-12 01:07:21
Docker swarm拥有自己的负载均衡器、网络和DNS系统。如果您希望使用自己的平衡器,则没有理由定义节点的IP地址,因为docker还为您提供了抽象并管理服务发现。
由于routing mesh的存在,使用IP路由的解决方案不会像您想象的那样工作。所有请求都会在不考虑获取流量的节点的情况下实现负载均衡。您可以访问IP1,由于路由mesh IP2可以处理请求。
您想要的是将您的站点引用为您已定义为服务名称的DNS记录。
像这样
upstream site1_nginx {
server site1:80;
}site1 是 docker-compose.yml 中定义的服务名称(nginx 的 DNS 名称为 nginx)。您可以将该服务称为特定的副本,但随后您需要自己实现健康检查。
upstream site1_nginx {
server site1.1:80;
server site1.2:80;
server site1.3:80;
}https://stackoverflow.com/questions/58343920
复制相似问题