Я пытаюсь настроить jwilder / nginx-proxy как обратный прокси-сервер для запросов прокси к различным контейнерам которые предоставляют переменные среды VIRTUAL_HOST = example.com.
Настройка работает, если контейнер запускается непосредственно на узле кластера ec2, но завершается ошибкой со следующей ошибкой: «ошибка при выполнении команды уведомления: nginx -s reload, exit status 1», если он создан из ECS.
Журнал докеров контейнера, в котором запущен контейнер 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;
}
}
Мой вопрос: почему это не работает, это из-за разрешений или подключения к сокету докера?