【问题标题】:400 Bad Request with Traefik v2 and NextcloudPiTraefik v2 和 NextcloudPi 的 400 错误请求
【发布时间】:2020-03-07 15:54:50
【问题描述】:

我尝试在 Traefik 后面运行我的 NextcloudPi-Docker 安装,以允许服务器上的更多服务并确保对所有服务进行简单的 SSL 加密。

我的 docker-compose.yml 没有 Traefik 的 Nextcloudpi 看起来像这样:

version: '3'

services:
  nextcloud:
    image: ownyourbits/nextcloudpi-armhf
    container_name: nextcloud
    restart: unless-stopped
    networks:
      - proxy
    volumes:
      - /media/external_1/nextcloud:/data
      - /media/external_1/backup:/backup
    ports:
      - 80:80
      - 443:443

效果很好,我现有的安装正在顺利启动。

当我用它的docker-compose.yml 启动Traefik 时,我可以打开仪表板,没问题。我还尝试了Portainer,作为Traefik 的路由,可行,但我不想让它更复杂,所以我保留基于文本的配置。

Traefik 的docker-compose.yml

version: '3'

services:
  traefik:
    image: traefik:v2.0
    container_name: traefik
    restart: unless-stopped
    security_opt:
      - no-new-privileges:true
    networks:
      - proxy
    ports:
      - 80:80
      - 443:443
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./data/traefik.yml:/traefik.yml:ro
      - ./data/acme.json:/acme.json
      - ./logs:/logging
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.traefik.entrypoints=http"
      - "traefik.http.routers.traefik.rule=Host(`sub.domain.tld`)"
      - "traefik.http.middlewares.traefik-auth.basicauth.users=<user>:<password>
      - "traefik.http.middlewares.traefik-https-redirect.redirectscheme.scheme=https"
      - "traefik.http.routers.traefik.middlewares=traefik-https-redirect"
      - "traefik.http.routers.traefik-secure.entrypoints=https"
      - "traefik.http.routers.traefik-secure.rule=Host(`sub.domain.tld`)"
      - "traefik.http.routers.traefik-secure.middlewares=traefik-auth"
      - "traefik.http.routers.traefik-secure.tls=true"
      - "traefik.http.routers.traefik-secure.tls.certresolver=http"
      - "traefik.http.routers.traefik-secure.service=api@internal"

networks:
  proxy:
    external: true

NextcloudPidocker-compose.yml:

version: '3'

services:
  nextcloud:
    image: ownyourbits/nextcloudpi-armhf
    container_name: nextcloud
    restart: unless-stopped
    security_opt:
      - no-new-privileges:true
    networks:
      - proxy
    volumes:
      - /media/external_1/nextcloud:/data
      - /media/external_1/backup:/backup
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.nextcloud.entrypoints=http"
      - "traefik.http.routers.nextcloud.rule=Host(`sub.domain.tld`)"
      - "traefik.http.middlewares.nextcloud-https-redirect.redirectscheme.scheme=https"
      - "traefik.http.routers.nextcloud.middlewares=nextcloud-https-redirect"
      - "traefik.http.routers.nextcloud-secure.entrypoints=https"
      - "traefik.http.routers.nextcloud-secure.rule=Host(`sub.domain.tld`)"
      - "traefik.http.routers.nextcloud-secure.tls=true"
      - "traefik.http.routers.nextcloud-secure.tls.certresolver=http"
      - "traefik.http.routers.nextcloud-secure.service=nextcloud"
      - "traefik.http.services.nextcloud.loadbalancer.server.port=443"
      - "traefik.docker.network=proxy"

networks:
  proxy:
    external: true

access.log 的输出如下:

151.177.45.100 - - [07/Mar/2020:15:20:44 +0000] "GET /status.php HTTP/1.1" 400 362 "-" "-" 22 "nextcloud-secure@docker" "http://172.19.0.4:443" 5ms
151.177.45.100 - - [07/Mar/2020:15:21:16 +0000] "GET /status.php HTTP/1.1" 400 362 "-" "-" 23 "nextcloud-secure@docker" "http://172.19.0.4:443" 3ms
151.177.45.100 - - [07/Mar/2020:15:21:48 +0000] "GET /status.php HTTP/1.1" 400 362 "-" "-" 24 "nextcloud-secure@docker" "http://172.19.0.4:443" 9ms
151.177.45.100 - - [07/Mar/2020:15:22:09 +0000] "GET / HTTP/2.0" 400 362 "-" "-" 25 "nextcloud-secure@docker" "http://172.19.0.4:443" 8ms

还有traefik.yml

api:
  dashboard: true

entryPoints:
  http:
    address: ":80"
  https:
    address: ":443"

providers:
  docker:
    endpoint: "unix:///var/run/docker.sock"
    exposedByDefault: false

certificatesResolvers:
  http:
    acme:
      email: email@address.com
      storage: acme.json
      httpChallenge:
        entryPoint: http
log:
  filePath: "/logging/traefik.log"
  format: json
  level: DEBUG

# Configuring a buffer of 100 lines
accessLog:
  filePath: "/logging/access.log"
  bufferingSize: 100

我不知道我做错了什么,我使用与没有 Traefik 相同的域,正如我所说,其他服务可以很好地使用它。我什至尝试创建一个新的 NextcloudPi 实例,但这也不起作用。 如有任何帮助,我将不胜感激!

【问题讨论】:

  • 可以添加 ./data/traefik.yml 吗?
  • 我现在添加了traefik.yml的内容。

标签: docker http https docker-compose traefik


【解决方案1】:

从日志中,我可以说这个问题的根本原因是以下之一

1- nextcloud 服务未侦听端口 443,这就是您收到 400 错误的原因。你需要修改这一行来修复它

   - "traefik.http.services.nextcloud.loadbalancer.server.port=443"

2- nextcloud 不提供请求,这是因为您使用相同的规则(主机名)来管理不同的服务

- "traefik.http.routers.traefik-secure.rule=Host(`sub.domain.tld`)"

查看此post 了解更多信息

【讨论】:

  • 感谢您的帮助! 1 - 这是否意味着我不能在端口443 上安装负载均衡器,还是应该完全删除该行?我认为我实际上不需要它来达到我的目的,但我在几乎所有在线教程中都找到了它。 2 - 我明白了,我应该使用不同的主机名吗?这不会违反直觉吗?还是使用Port 而不是Host 作为规则确定器?
  • 1- 如果您打算使用主机名,则需要该行(您只需要使用正确的端口)。 2. 是的,如果你想充分利用 traefik,你需要使用子域。这篇文章一步一步地解释它。 medium.com/better-programming/…
  • 好的,我明白了。或者更好的是我真的没有看到它...... 1-正确的端口是什么?我想访问nextcloud,这是一个需要443 的apache 网络服务器,端口80 不起作用。你知道我需要哪个端口吗? 2- 我实际上为traefiknextcloud 使用不同的子域甚至不同的DynDNS 提供程序。与nextcloud 的 SSL 连接是否需要一个特殊的子域?这些问题可能听起来很愚蠢,但我在你发给我的教程中找不到解决方案(但它已为我的下一次冒险 - docker swarms 保存);-)
猜你喜欢
  • 2018-11-28
  • 2011-03-09
  • 2017-12-31
  • 2014-10-11
  • 2019-05-02
  • 2012-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多