需要帮助对 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
我想安装一个简单的 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) 上没有,但我
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