Нужна помощь в устранении неполадок пользовательского docker изображения для nginx - PullRequest
0 голосов
/ 20 марта 2020

Я хочу установить простой веб-сервис для просмотра дерева каталогов файлов на внутреннем сервере и для соблюдения политики компании, для которой необходимо использовать TLS ("https://...").

Сначала я попробовал несколько образы, включая davralin / nginx -autoindex и смонтированный каталог, к которому я хочу предоставить доступ этой службе. Он работал как шарм, но не использовал соединение TLS.

Чтобы заставить что-то работать с TLS, я начал с нуля и создал свой собственный файл default.conf для nginx:

server {
    listen      443 ssl;
    listen      [::]:443 ssl;
    server_name  localhost;

    ssl_certificate     /etc/ssl/certs/my-cert.crt;
    ssl_certificate_key /etc/ssl/certs/server.key;

    location / {
        root   /usr/share/nginx/html;
        autoindex on;
    }

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

Затем я создал следующий Dockerfile:

FROM nginx:stable-alpine
MAINTAINER lsiden at gmail.com
COPY default.conf /etc/nginx/conf.d
COPY my-cert.crt /etc/ssl/certs/
COPY server.key /etc/ssl/certs/

Затем я его собрал:

docker build -t lsiden/nginx-autoindex-tls .

Затем я запустил его:

docker run -dt -v /var/www/data/files:/usr/share/nginx/html:ro -p 3453:80 lsiden/nginx-autoindex-tls

Однако я не могу связаться с ним даже с хост-машины. Я пытался:

$ telnet localhost 3453
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Connection closed by foreign host.

Я пытался читать сообщения журнала:

docker logs <container-id>

Тишина.

Я уже подтвердил, что прокси docker прослушивает порт:

tcp6       0      0 :::3453                 :::*                    LISTEN      14828/docker-proxy

Порт отображается на tcp6, но не "tcp" (ipv4), а I прочитайте здесь , что netstat покажет только соединение ipv6, даже если оно доступно на обоих. Чтобы быть уверенным, я проверил:

sudo sysctl net.ipv6.bindv6only
net.ipv6.bindv6only = 0

Чтобы быть точным, я уже открыл этот порт в iptables, хотя iptables не может играть роль здесь, если я даже не могу добраться до него из того же машина через localhost.

Я надеюсь, что кто-то с хорошими настройками сети может сказать мне, где искать дальше. Я не могу понять, что я пропустил.

1 Ответ

1 голос
/ 20 марта 2020

Если конфигурация, которой вы поделились, завершена, вы вообще не указываете порт 80 внутри своего контейнера.

измените свою конфигурацию на что-то подобное, если вы хотите перенаправить входящий трафик c в порт 80 на 443:

server {
    listen 80;
    listen [::]:80;

    location / {
        return         301 https://$server_name$request_uri;
       }
}

server {
    listen      443 ssl;
    listen      [::]:443 ssl;

    server_name  localhost;

    ssl_certificate     /etc/ssl/certs/my-cert.crt;
    ssl_certificate_key /etc/ssl/certs/server.key;

    location / {
        root   /usr/share/nginx/html;
        autoindex on;
    }

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

Если вы не хотите этого делать, просто измените команду docker run:

docker run -dt -v /var/www/data/files:/usr/share/nginx/html:ro -p 3453:443 lsiden/nginx-autoindex-tls

...