如何在httpd Docker镜像中禁用HTTP协议?
解决方案
你当前的HTTP可以访问是因为官方httpd镜像默认配置监听80端口,即使你没有做80端口的端口映射,容器内部默认仍开放80端口服务,同网络下的服务或宿主机本地可直接访问。要彻底禁用HTTP协议,可以选择以下两种方案:
方案1:完全禁用Apache 80端口监听(彻底关闭HTTP服务)
直接修改Apache主配置,注释掉80端口的监听规则即可。
修改你的Dockerfile,在现有RUN sed指令后新增一条修改配置的命令,修改后的Dockerfile参考如下:
ARG version=2.4.48-alpine FROM httpd:$version LABEL version=1.0 COPY ./public_html/ /usr/local/apache2/htdocs/ # 配置HTTPS相关模块 COPY ./cert/srv.crt /usr/local/apache2/conf/ COPY ./cert/srv.key /usr/local/apache2/conf/ RUN sed -i \ -e 's/^#\(Include .*httpd-ssl.conf\)/\1/' \ -e 's/^#\(LoadModule .*mod_ssl.so\)/\1/' \ -e 's/^#\(LoadModule .*mod_socache_shmcb.so\)/\1/' \ -e 's/^Listen 80/#Listen 80/' \ conf/httpd.conf EXPOSE 443/tcp
修改完成后重新构建镜像,删除旧容器重新启动即可,此时Apache只会监听443端口,完全不响应HTTP请求。
方案2:HTTP请求自动跳转HTTPS(更推荐普通站点使用)
如果需要兼容用户直接输入域名默认走HTTP的场景,不用禁用HTTP,而是配置所有80端口的请求自动301跳转到HTTPS地址,操作如下:
- 开启mod_rewrite模块,在原有sed命令中新增开启rewrite模块的规则
- 新增80端口的虚拟主机配置,配置跳转规则
修改后的Dockerfile参考:
ARG version=2.4.48-alpine FROM httpd:$version LABEL version=1.0 COPY ./public_html/ /usr/local/apache2/htdocs/ # 配置HTTPS相关模块 COPY ./cert/srv.crt /usr/local/apache2/conf/ COPY ./cert/srv.key /usr/local/apache2/conf/ RUN sed -i \ -e 's/^#\(Include .*httpd-ssl.conf\)/\1/' \ -e 's/^#\(LoadModule .*mod_ssl.so\)/\1/' \ -e 's/^#\(LoadModule .*mod_socache_shmcb.so\)/\1/' \ -e 's/^#\(LoadModule .*mod_rewrite.so\)/\1/' \ conf/httpd.conf # 新增HTTP跳转HTTPS规则 RUN echo '\ <VirtualHost *:80>\ ServerName mydomain\ Redirect permanent / https://mydomain/\ </VirtualHost>\ ' >> conf/httpd.conf EXPOSE 80/tcp 443/tcp
配置完成后启动容器时需要同时映射80端口:docker run -d -p 80:80 -p 443:443 webserver,此时用户输入mydomain会自动跳转到HTTPS地址。
额外校验操作
容器启动后可以进入容器内部执行netstat -tunlp查看监听的端口,确认仅开启了你需要的端口即可。
内容的提问来源于stack exchange,提问作者Nullndr
相关产品推荐
相关产品推荐

