Как настроить балансировку нагрузки / обратный прокси-сервер между док-узлами, работающими на простых сайтах nginx / php? - PullRequest
0 голосов
/ 10 октября 2019

Это моя установка:

У меня есть 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...