AWS ECS jwilder/nginx-proxy не может генерировать серверы внутри апстрима

Я пытаюсь настроить https://github.com/jwilder/nginx-proxy качестве обратного прокси-сервера для запросов прокси к различным контейнерам, которые предоставляют переменные окружения VIRTUAL_HOST=example.com.

Настройка работает, если контейнер запускается непосредственно на хосте кластера ec2, но происходит сбой со следующей ошибкой: "ошибка при выполнении команды notify: перезагрузка nginx -s, выход из состояния 1", если он порожден из ECS.

Журнал Docker контейнера, в котором работает контейнер jwilder / nginx-proxy: WARNING: /etc/nginx/dhparam/dhparam.pem was not found. A pre-generated dhparam.pem will be used for now while a new one is being generated in the background. Once the new dhparam.pem is in place, nginx will be reloaded. forego | starting dockergen.1 on port 5000 forego | starting nginx.1 on port 5100 dockergen.1 | 2018/08/19 10:43:37 Generated '/etc/nginx/conf.d/default.conf' from 4 containers dockergen.1 | 2018/08/19 10:43:37 Running 'nginx -s reload' dockergen.1 | 2018/08/19 10:43:37 **Error running notify command: nginx -s reload, exit status 1** dockergen.1 | 2018/08/19 10:43:37 Watching docker events dockergen.1 | 2018/08/19 10:43:37 Contents of /etc/nginx/conf.d/default.conf did not change. Skipping notification 'nginx -s reload' 2018/08/19 10:48:23 [emerg] 38#38: no servers are inside upstream in /etc/nginx/conf.d/default.conf:55 nginx: [emerg] no servers are inside upstream in /etc/nginx/conf.d/default.conf:55 Generating DH parameters, 2048 bit long safe prime, generator 2 This is going to take a long time dhparam generation complete, reloading nginx

Среда настроена следующим образом:

services: 
- name: proxy
  *volumes*:
  Name: docker-socket
  Source Path: /var/run/docker.sock
  *containers*: 
    - name: proxy
      image: jwilder/nginx-proxy
      port: 80:80
      Mount Points:
        Container Path: /tmp/docker.sock
        Source Volume: docker-socket
        Read only: true 
- name: site
  *containers*:
    - name: site
      image: nginx
      port: 0:80
      environment:
      - VIRTUAL_HOST=example.com

Команда для проверки:

curl -H "Host: example.com" localhost:80   

Теперь он возвращает страницу nginx по умолчанию, потому что конфигурационный файл nginx не смог сгенерировать правильную конфигурацию, поскольку отсутствуют вышестоящие хосты.

Сгенерированный неверный конфиг nginx

proxy_set_header Proxy "";
server {
  server_name _; # This is just an invalid value which will never trigger on a real hostname.
  listen 80;
  access_log /var/log/nginx/access.log vhost;
  return 503;
}
# example.com
upstream example.com {
}
server {
  server_name example.com;
  listen 80 ;
  access_log /var/log/nginx/access.log vhost;
  location / {
    proxy_pass http://example.com
  }
}

Прокси-сервер работает как задумано, если используется следующая команда:

docker run -d -p 80:80 -v /var/run/docker.sock:/tmp/docker.sock:ro jwilder/nginx-proxy

Если команда, указанная выше, запускается, она дает следующий вывод: WARNING: /etc/nginx/dhparam/dhparam.pem was not found. A pre-generated dhparam.pem will be used for now while a new one is being generated in the background. Once the new dhparam.pem is in place, nginx will be reloaded. forego | starting dockergen.1 on port 5000 forego | starting nginx.1 on port 5100 dockergen.1 | 2018/08/19 10:18:48 Generated '/etc/nginx/conf.d/default.conf' from 10 containers dockergen.1 | 2018/08/19 10:18:48 Running 'nginx -s reload' dockergen.1 | 2018/08/19 10:18:48 Watching docker events dockergen.1 | 2018/08/19 10:18:48 Contents of /etc/nginx/conf.d/default.conf did not change. Skipping notification 'nginx -s reload' 2018/08/19 10:19:09 [notice] 40#40: signal process started Generating DH parameters, 2048 bit long safe prime, generator 2 This is going to take a long time dhparam generation complete, reloading nginx Сгенерированная действительная конфигурация nginx:

proxy_set_header Proxy "";
server {
  server_name _; # This is just an invalid value which will never trigger on a real hostname.
  listen 80;
  access_log /var/log/nginx/access.log vhost;
  return 503;
}
# example.com
upstream example.com {
        ## Can be connected with "bridge" network
      # ecs-site-site-add8hjasd
      server 172.17.0.3:80;
}
server {
  server_name example.com;
  listen 80 ;
  access_log /var/log/nginx/access.log vhost;
  location / {
    proxy_pass http://example.com;
  }
}

Мой вопрос: почему это не работает, это потому, что разрешения или монтирование в док-разъем?

3 ответа

3 дня назад наша команда встретила этот вопрос. Мы потратили на это много времени.

Причина проблемы должна быть в AWS ecs-agent(у нас 2 среды, у одного ecs-agent версии 1.21, у другого 1.24)

Вчера мы решили эту проблему: с помощью консоли AWS обновить ecs-agent до последней версии: 1.34 и перезапустить ecs-agent(docker contianer). После этого проблема была решена.

Просто вставьте этот раствор сюда. Надеюсь, это будет полезно другим!

У меня есть эта проблема, но в моем случае основные причины:

  1. я не регистрировалvirtual_hostвetc/hosts-> это одно

  2. IP-адрес, который я даю для другого контейнера, должен находиться в той же сети Nginx для прокси-сервера.

  3. Убедитесь, что IP-адрес контейнера, для которого вы являетесь прокси, работает правильно, если это IP-адрес контейнера, а затем проверьте журнал с помощью командыdocker logs -f <container-name>

Во-первых, это хорошая идея - избегать использования доменных имен в вашей конфигурации Nginx, особенно при определении вышестоящих серверов. Это сбивает с толку, если ничего другого.

Все ваши ценности для example.com тот же самый? Если это так, у вас есть вышестоящий блок, который определяет кластер вышестоящих серверов с именем example.comто у вас есть блок сервера с директивой имени сервера example.com а затем вы пытаетесь proxy_pass к example.com,

Обычно вы указываете восходящий блок в качестве метода распределения нагрузки, если у вас есть несколько серверов, способных обрабатывать один и тот же запрос. Отредактируйте ваш вышестоящий блок и включите все адреса вышестоящих серверов: порт, вы можете включить другие параметры, чтобы настроить распределение нагрузки между ними Nginx, если вы хотите, см. Документацию Nginx для получения дополнительной информации. Имя, которое вы даете своему вышестоящему блоку, используется только Nginx и может быть любым, не используйте здесь свое доменное имя. Что-то вроде:

upstream dockergroup {

Затем добавьте IP-адрес перед портом в listen директива в блоке сервера и изменить proxy_pass директива к http://dockergroup

Я не уверен в деталях, но в соответствии с документами на странице, на которую вы ссылались:

Вы можете добавить настройки для каждого VIRTUAL_HOST, добавив файл конфигурации в /etc/nginx/vhost.d. В отличие от случая с прокси-сервером, который допускает несколько файлов конфигурации с любым именем, оканчивающимся на.conf, файл per-VIRTUAL_HOST должен быть назван точно после VIRTUAL_HOST.

Важными вопросами, которые необходимо решить, является то, что ваш вышестоящий блок не может быть пустым, а имя вышестоящего блока не должно конфликтовать с какими-либо доменами или именами хостов в вашей сети. Из того, что я прочитал, вы сможете исправить это, используя различные параметры конфигурации.

Другие вопросы по тегам