首页 > 解决方案 > 需要帮助对 nginx 的自定义 docker 映像进行故障排除

问题描述

我想安装一个简单的 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 中打开了这个端口,尽管如果我什至无法通过 localhost 从同一台机器访问它,iptables 就无法在这里发挥作用。

我希望有良好网络能力的人可以告诉我下一步该往哪里看。我无法弄清楚我错过了什么。

标签: dockernginxnetstat

解决方案


如果您共享的配置已完成,则您根本不会在容器内的端口 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


推荐阅读