nginx 响应 HTTPS 但不响应 HTTP

Posted

技术标签:

【中文标题】nginx 响应 HTTPS 但不响应 HTTP【英文标题】:nginx responds to HTTPS but not HTTP 【发布时间】:2018-12-01 12:20:24 【问题描述】:

我正在使用 dockerized Nextcloud,如下所示:https://github.com/nextcloud/docker/tree/master/.examples/docker-compose/with-nginx-proxy-self-signed-ssl/mariadb/fpm

我使用映射到 12345 的端口 80 和映射到 12346 的端口 443 进行设置。当我转到 https://mycloud.example.com:12346 时,我收到自签名证书提示,但除此之外一切都很好,我看到了 NextCloud Web UI。但是当我转到http://mycloud.example.com:12345 nginx(proxy 容器)时,会出现错误“503 服务暂时不可用”。该错误也出现在proxy 的日志中。

如何诊断问题?为什么 HTTPS 有效,但 HTTP 无效?

【问题讨论】:

我的猜测是它被专门配置为不能通过非安全 http 访问。您必须在文档中四处寻找配置它的方法,或者只是在您的 IDE 中打开源代码并逐行调试请求... 【参考方案1】:

您能否提供启动 nextcloud 或 docker-compose 文件的 docker 命令?

诊断与 docker stuff 一样:获取当前运行容器的 id

docker ps

然后查看日志

docker logs [id or name of your container] docker-compose logs [name of your service]

在容器中连接

docker exec -ti [id or name of your container] [bash or ash if alpine based container]

那里读取了涉及的 nginx conf 文件。在你的情况下,我会检查从 http 到 https 的重定向,很可能是下面这样,没有为 https 指定特定端口,因此端口 443,因此不起作用

server 
       listen         80;
       server_name    my.domain.com;
       return         301 https://$server_name$request_uri;    <======== no port = 443


server 
       listen         443 ssl;
       server_name    my.domain.com;
       # add Strict-Transport-Security to prevent man in the middle attacks
       add_header Strict-Transport-Security "max-age=31536000" always; 

       [....]

【讨论】:

嗯,我已经链接了一个docker-compose文件,所以命令当然是docker-compose up @Wassinger 我对链接文件不好。关于调试,正如我所说,如果您使用非常规端口(12345 和 12346),问题很可能是默认重定向到 443 而不是 12346 的 HTTP 行为。docker-compose exec proxy "cat /etc/nginx/vhost.d/*" 之类的东西应该转储 nginx vhost 配置来检查。如果你真的想github.com/jwilder/nginx-proxy/search?q=WEB_PORTS,这里是 jwilder 摆弄端口的例子 似乎/etc/nginx/vhost.d/ 对代理是空的 我也确实发现在/etc/nginx/conf.d/default.conf/ 中有一个端口 80 没有 443 的块,就像你在答案末尾提到的那样。另一个443块也包含location / proxy_pass https://mycloud.example.com;,不知道这是否相关? 如果我没记错 jwilder 的 dockergen 脚本未能正确生成 conf,则空块是。应该有一个名为 [your_VIRTUAL_HOST].conf 的文件。原因可能在于代理日志,检查docker-compose logs proxy

以上是关于nginx 响应 HTTPS 但不响应 HTTP的主要内容,如果未能解决你的问题,请参考以下文章

Discord bot 活动但不响应命令 (js)

在 nginx 代理后面使用 docker 私有注册表 (v2) 的 HTTP 响应格式错误

django-cors-headers 和 nginx 配置:预检响应缺少 CORS 标头

Grafana Prometheus 计算不成功的 probe_success 响应的总停机时间,但不包括一分钟的停机时间

NGINX 反向代理响应

用Netty作http静态资源服务器,类似Nginx这样的,大一点的文件响应不正常怎么回事?