需要帮助对 nginx 的自定义 docker 图像进行故障排除

Need help troubleshooting custom docker image for nginx

我想安装一个简单的 Web 服务来浏览内部服务器上的文件目录树,并且为了遵守公司政策,它需要使用 TLS ("https://...")。

首先我尝试了包括davralin/nginx-autoindex在内的几个图像并挂载了我希望此服务共享的目录。它工作得很好,但它没有使用 TLS 连接。

为了使用 TLS,我从头开始为 nginx 创建了自己的 default.conf 文件:

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) 上没有,但我 netstat 将仅显示 ipv6 连接,即使它在两者上都可用。可以肯定的是,我验证了:

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

为了彻底,我已经在 iptables 中打开了这个端口,尽管如果我什至不能通过本地主机从同一台机器访问它,iptables 就不能在这里发挥作用。

我希望有良好网络能力的人可以告诉我下一步该去哪里。我不知道我错过了什么。

如果您共享的配置已完成,则您根本不会在容器内的端口 80 上列出。

如果您想将端口 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