ошибка 503 при использовании контейнера nginx-proxy, такого как интерфейсный сервер, для доступа к нескольким контейнерам на одном и том же хосте

Решение найдено по адресу: https://serverfault.com/questions/880212/error-503-when-using-nginx-proxy-container-like-a-front-end-server-to-access-mul

Я хочу иметь доступ к нескольким контейнерам на одном хосте, содержащим веб-приложения.

Когда я хочу получить доступ к хосту (по его IP-адресу) или к контейнерам (например, по host_ip_adress / container1), я получаю для обоих ошибку 503 от Nginx. Я хочу получить доступ к моему контейнеру 1 по ip_addrress_host / container1.

Решение, которое я нашел в Интернете, заключалось в установке интерфейсного сервера nginx-proxy (источник: https://blog.florianlopes.io/host-multiple-websites-on-single-host-docker/)

Мой файл для создания докеров:

version: '2'
services:
  nginx-proxy:
    image: jwilder/nginx-proxy
    ports:
      - "80:80"
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock
  site_a:
   image: php:7.0-apache
   expose:
   - "80"
   environment:
   - VIRTUAL_HOST=192.168.12.28/container1
   - VIRTUAL_PORT=80
   volumes:
   - ./php:/var/www/html
 site_b:
   image: php:7.0-apache
   expose:
   - "80"
   environment:
   - VIRTUAL_HOST=192.168.12.28/container2
   - VIRTUAL_PORT=80
   volumes:
   - ./php:/var/www/html

Я запускаю его командой:

docker-compose up

Мои записи в файле / etc / hosts:

127.0.1.1       container1
127.0.0.1       container2

Журналы, которые я вижу, когда делаю запрос извне:

nginx-proxy_1  | nginx.1    | 192.168.12.28 192.168.12.82 - - [25/Oct/2017:09:46:42 +0000] "GET /container1 HTTP/1.1" 503 615 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36"
nginx-proxy_1  | nginx.1    | 192.168.12.28 192.168.12.82 - - [25/Oct/2017:09:46:42 +0000] "GET /favicon.ico HTTP/1.1" 503 615 "http://192.168.12.28/container1" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36"

Спасибо за вашу помощь и извините за мой плохой английский! :-)

Изменить: я попытался поместить контейнеры nginx-proxy и контейнеры веб-приложений в одну и ту же «сеть докеров», как описано в концентраторе докеров (https://hub.docker.com/r/jwilder/nginx-proxy/), но когда я это сделаю:

docker-compose up

У меня ошибка:

ERROR: Service "site_b" uses an undefined network "proxy-nginx"

Изменить 2:

Вот мои логи для контейнера nginx-proxy в начале:

forego     | starting dockergen.1 on port 5000
forego     | starting nginx.1 on port 5100
dockergen.1 | 2017/10/25 14:01:53 Generated '/etc/nginx/conf.d/default.conf' from 3 containers
dockergen.1 | 2017/10/25 14:01:53 Running 'nginx -s reload'
nginx.1    | 2017/10/25 14:01:54 [warn] 30#30: server name "192.168.12.28/container1" has suspicious symbols in /etc/nginx/conf.d/default.conf:60
nginx.1    | 2017/10/25 14:01:54 [warn] 30#30: server name "192.168.12.28/container2" has suspicious symbols in /etc/nginx/conf.d/default.conf:74
dockergen.1 | 2017/10/25 14:01:54 Watching docker events
dockergen.1 | 2017/10/25 14:01:54 Contents of /etc/nginx/conf.d/default.conf did not change. Skipping notification 'nginx -s reload'

Изменить 3:

Итак, теперь моя конфигурация nginx выглядит так:

server {
   listen  192.168.12.28;
   server_name 192.168.12.28;

   access_log  /var/log/nginx/host.access.log;

   location / {
       proxy_http_version 1.1;
       proxy_pass http://172.23.0.3:80;
       proxy_set_header Host $host;
       proxy_set_header Upgrade $http_upgrade;
       proxy_set_header Connection "upgrade";
       proxy_buffering Off;
       proxy_cache_bypass $http_upgrade;
   }

   location /container1/ {
       proxy_http_version 1.1;
       proxy_pass http://172.23.0.3:80;
       proxy_set_header Host $host;
       proxy_set_header Upgrade $http_upgrade;
       proxy_set_header Connection "upgrade";
       proxy_buffering Off;
       proxy_cache_bypass $http_upgrade;
   }

   location /container2/ {
       proxy_http_version 1.1;
       proxy_pass http://172.23.0.2:80;
       proxy_set_header Host $host;
       proxy_set_header Upgrade $http_upgrade;
       proxy_set_header Connection "upgrade";
       proxy_buffering Off;
       proxy_cache_bypass $http_upgrade;
   }
}

Когда я перехожу к http://192.168.12.28/container1

мой журнал:

site_a_1  | 172.23.0.1 - - [26/Oct/2017:09:22:40 +0000] "GET /container1/ HTTP/1.1" 404 449 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36"

и когда я перехожу на http://192.168.12.28/container2

мой журнал:

site_b_1  | 172.23.0.1 - - [26/Oct/2017:09:22:50 +0000] "GET /container2/ HTTP/1.1" 404 449 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36"

И для обоих ответ 404 not found. Кажется, он смотрит на сервер моих контейнеров по пути "/ container1" или "/ container2"? Если это правда, могу ли я заставить его присмотреть за / var / www / html /?


person Benjamin Seche    schedule 25.10.2017    source источник


Ответы (1)


Я не знаю, насколько настраивается прокси jwilder, но я знаю, что переменная среды VIRTUAL_HOST относится ко всему DNS-имени, к которому вы пытаетесь подключиться.

В настоящее время ваш nginx настроен для перенаправления трафика на http://container1 и http://container2 в контейнеры. Но поскольку этот DNS-псевдоним вряд ли будет установлен, это приведет к ошибке 503.

Вам нужно настроить свой nginx самостоятельно, используя серверный блок и два / три блока местоположения. Следующая конфигурация проксирует порт 80 вашего сервера на container1, http://your_host/container1 на container1 и http://your_host/container2 на container2 (надеюсь). Однако вам придется изменить server_name на имя вашего хоста:

server {
    listen  80;
    server_name your_fqdn.domain.com your_shortname;

    access_log  /var/log/nginx/host.access.log  main;

    location / {
        proxy_http_version 1.1;
        proxy_pass http://container1:80;
        proxy_set_header Host $host;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_buffering Off;
        proxy_cache_bypass $http_upgrade;
    }

    location /container1/ {
        proxy_http_version 1.1;
        proxy_pass http://container1:80;
        proxy_set_header Host $host;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_buffering Off;
        proxy_cache_bypass $http_upgrade;
    }

    location /container2/ {
        proxy_http_version 1.1;
        proxy_pass http://container2:80;
        proxy_set_header Host $host;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_buffering Off;
        proxy_cache_bypass $http_upgrade;
    }

}

О вашем редактировании и о сетях докеров в файлах compose:

Вам не нужно указывать сеть, поскольку docker-compose автоматически создает отдельную сеть для всех ваших контейнеров. Если вы хотите использовать уже существующую сеть или хотите, чтобы ваши контейнеры находились в разных сетях, я рекомендую вам прочитать это

person samprog    schedule 25.10.2017
comment
Спасибо за ответ. Я попытался изменить свою переменную VIRTUAL_HOST (как вы видите, поскольку я редактировал свой вопрос), но ответ 503 все еще остается. Теперь я лучше понимаю сети Docker. - person Benjamin Seche; 25.10.2017
comment
и нормально ли, что даже когда я хочу получить доступ к своему хосту по его IP-адресу, я получаю ответ 503 от nginx? - person Benjamin Seche; 25.10.2017
comment
Опять же, я действительно не знаю прокси jwilder, но не думаю, что это должно приводить к ошибке 503. Можете ли вы выложить логи контейнера nginx? - person samprog; 25.10.2017
comment
К сожалению, похоже, что он не работает с прокси-сервером jwilder, так как вам нужно выполнить настройку самостоятельно. Вам нужно специально настроить блоки местоположения, что, к сожалению (afaik), не покрывается nginx-proxy jwilder. Я обновлю свой ответ - person samprog; 26.10.2017
comment
Итак, я остановился, удалил все свои контейнеры, свой сервер aparche и т. Д. Я установил сервер nginx и передал конфигурацию, которую вы мне дали! Первый блок местоположения работает, потому что я могу добраться до container1 с помощью всего: 192.168.12.28. Но когда я просматриваю 192.168.12.28/container1 или 192.168.12.28/container2, у меня красивый 404 не найден. (Спасибо за время, которое вы потратили, помогая мне) - person Benjamin Seche; 26.10.2017
comment
Можете ли вы попробовать изменить блоки местоположения с / container1 на / container1 / (затем /). Думаю, это решит вашу проблему. Если это не сработает, попробуйте изменить блок listen на listen 192.168.12.28:80. - person samprog; 26.10.2017
comment
Это не сработало. Спасибо за помощь! Я нашел решение, чтобы он работал с nginx-proxy, я поместил ссылку вверху своего вопроса. - person Benjamin Seche; 26.10.2017