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). После этого проблема была решена.
Просто вставьте этот раствор сюда. Надеюсь, это будет полезно другим!
У меня есть эта проблема, но в моем случае основные причины:
я не регистрировал
virtual_host
вetc/hosts
-> это одноIP-адрес, который я даю для другого контейнера, должен находиться в той же сети Nginx для прокси-сервера.
Убедитесь, что 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.
Важными вопросами, которые необходимо решить, является то, что ваш вышестоящий блок не может быть пустым, а имя вышестоящего блока не должно конфликтовать с какими-либо доменами или именами хостов в вашей сети. Из того, что я прочитал, вы сможете исправить это, используя различные параметры конфигурации.