Это моя установка:
У меня есть 3 узла в моем Docker-Swarm, 1 - менеджер, а 2 - рабочие.
Рабочие работают по 3 стека, каждый из которых имеет 2сервисы под названием site1_nginx и site1_php, site2_nignx и site2_php, site3_nginx и site3_php.
В дополнение к этим стекам каждый узел имеет службу обратного прокси, которая была правильно настроена. Поэтому, когда я помещаю свой / etc / hosts на настольный компьютер:
node1-ip site1.local
node1-ip site2.local
node1-ip site3.local
, я получаю простой сайт php hello world после ввода "site * .local в браузере"
проблема в том, что когда я хочу получить доступ к сайту * .local на другом узле, я должен поместить в / etc / hosts:
node2-ip site1.local
node2-ip site2.local
node2-ip site3.local
Поэтому я хочу использовать узел менеджера для балансировки нагрузки между сайтами * .localна узле 1 и на сайте * .local на узле 2.
Так что мой / etc / hosts будет выглядеть так:
manager-ip site1.local
manager-ip site2.local
manager-ip site3.local
Я много чего пробовал, но потерял в них и толькосделал хуже. Я удалил обратный прокси-сервер nginx из рабочих узлов, я знаю, что обратный прокси-сервер должен быть в диспетчере, чтобы это работало.
Но вот файл docker-compose.yml и его файлы для nginxКонфигурация обратного прокси, которая работала на рабочих узлах:
docker-compose.yml:
version: '3'
services:
nginx:
image: nginx:latest
deploy:
placement:
constraints:
- node.role==worker
mode: global
ports:
- "80:80"
volumes:
- "./conf.d/:/etc/nginx/conf.d"
networks:
- reprox
networks:
reprox:
external: true
conf.d / имеет 3 файла: site1.conf, site2.conf и site3.conf, но здесь только для site1.conf (остальные почти такие же, за исключением имени):
server {
listen 80;
server_name site1.local;
location / {
proxy_pass http://site1_nginx/php.php;
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_set_header X-Forwarded-Proto $scheme;
}
}
А вот конфигурация для site1:
docker-compose. yml:
version: '3'
services:
nginx:
image: nginx:latest
deploy:
placement:
constraints:
- node.role==worker
mode: global
volumes:
- "./code:/code"
- "./site.conf:/etc/nginx/conf.d/site.conf"
networks:
- site1
- reprox
php:
image: php:7-fpm
deploy:
placement:
constraints:
- node.role==worker
mode: global
volumes:
- "./code:/code"
networks:
- site1
networks:
reprox:
external: true
site1:
site.conf:
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;
}
}
cat code / php.php
<html>
<head>
<title>PHP Test</title>
</head>
<body>
<?php echo '<p>This is site1!</p>'; ?>
</body>
</html>