Nginx Docker容器HTTP转HTTPS重定向失效问题求助
问题:Docker部署Nginx HTTP转HTTPS重定向外部访问失效
我们通过Docker部署Nginx,要求将所有HTTP流量重定向至HTTPS。服务器内部用curl测试重定向正常:
$ curl -L -I http://maxquant.org HTTP/1.1 301 Moved Permanently Server: nginx/1.19.10 Date: Tue, 21 Nov 2023 08:12:10 GMT Content-Type: text/html Content-Length: 170 Connection: keep-alive Location: https://maxquant.org/ HTTP/1.1 200 OK Server: nginx ...
但外部访问http://maxquant.org(含/不含www)时,仅显示Nginx默认欢迎页,重定向未生效。
相关配置文件
nginx.conf.template
server { listen 80; server_name ${NGINX_DOMAIN}; return 301 https://$host$request_uri; } server { listen 443 ssl default_server; server_name ${NGINX_DOMAIN}; gzip on; ... location / { include uwsgi_params; uwsgi_pass maxquant_download_app:8001; } location /static { root /app/maxquant; } location /p/ { secure_link $arg_md5,$arg_expires; secure_link_md5 "$secure_link_expires$uri ${NGINX_SECRET}"; if ($secure_link = "") { return 403; } if ($secure_link = "0") { return 410; } rewrite ^/p/(.*)$ /assets/$1; } location /assets/ { internal; root /app/maxquant; } }
docker-compose.yml
version: '3.4' services: maxquant_download_app: ... nginx: container_name: nginx build: context: .. network: host dockerfile: docker/nginx.dockerfile args: ... depends_on: - maxquant_download_app ports: - 80:80 - 443:443 restart: "always"
补充说明:访问HTTP时显示Nginx默认欢迎页,而非目标网站。
排查与解决方案
1. 确认环境变量NGINX_DOMAIN的注入与取值
HTTP监听的server块依赖${NGINX_DOMAIN}作为server_name,若该变量未正确传递至容器,或取值未包含maxquant.org和www.maxquant.org,Nginx会匹配不到外部请求,转而使用默认server块(即自带的欢迎页配置)。
- 确保容器构建/运行时,
NGINX_DOMAIN的值设为maxquant.org www.maxquant.org,覆盖带www与不带www的域名。 - 进入Nginx容器,查看最终生成的
nginx.conf,确认server_name已被正确替换为目标域名。
2. 为HTTP server块添加default_server
若没有其他监听80端口的server块,给HTTP监听的server添加default_server,确保所有80端口请求都进入重定向块,避免匹配到默认欢迎页配置:
server { listen 80 default_server; server_name ${NGINX_DOMAIN}; return 301 https://$host$request_uri; }
3. 检查宿主机80端口占用情况
若宿主机本身运行了其他Nginx服务或程序占用80端口,外部请求会被宿主机服务处理,而非转发至Docker容器内的Nginx,导致显示默认欢迎页。
- 执行
netstat -tulpn | grep :80检查宿主机80端口的占用状态,确保仅Docker容器的Nginx在监听。
4. 清理Nginx默认配置
Docker镜像可能自带default.conf(通常位于/etc/nginx/conf.d/目录),该配置会监听80端口并返回欢迎页。需在构建镜像时删除该文件:
- 在
nginx.dockerfile中添加命令:RUN rm /etc/nginx/conf.d/default.conf,确保默认配置被移除。
内容的提问来源于stack exchange,提问作者Assa Yeroslaviz
相关产品推荐
相关产品推荐

