【问题标题】:Running Nginx behind Traefik, problem with ports different than 80在 Traefik 后面运行 Nginx,端口不同于 80 的问题
【发布时间】:2021-05-26 22:45:30
【问题描述】:

我想使用 Docker (docker-compose) 在 Traefik 反向代理后面将 Nginx 作为静态文件服务器运行。

docker-compose.yml

version: '3.8'

services:
  traefik:
    image: traefik
    command: 
      - --entrypoints.web.address=:80
      - --providers.docker
      - --providers.docker.exposedbydefault=false
    ports:
      - "80:80"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
  nginx:
    build: ./docker/dev/nginx/.
    labels:
      - traefik.enable=true
      - traefik.http.routers.nginx.entrypoints=web
      - traefik.http.routers.nginx.rule=PathPrefix(`/static`) || PathPrefix(`/media`) || Path(`/robots.txt`) || Path(`/favicon.ico`)
      - traefik.http.services.nginx.loadbalancer.server.port=80

nginx.conf

server {
    listen 80; 
    listen [::]:80;

    ...
}

而且它有效, 但是当我尝试将内部 nginx 端口更改为另一个时,比如说 8082,Traefik 返回 502 错误并在调试日志中打印'502 Bad Gateway' caused by: dial tcp 172.21.0.6:8082: connect: connection refused"

我的意思是改变端口:

  • 在 docker-compose.yml 中将 traefik.http.services.nginx.loadbalancer.server.port=80 替换为 traefik.http.services.nginx.loadbalancer.server.port=8082
  • 将 nginx.conf 中的 listen 80; listen [::]:80; 替换为 listen 8082; listen [::]:8082;

我在配置中有其他应用程序,例如在 gunicorn 服务器上运行的 Django。 gunicorn 监听 3000 端口没有问题,Traefik 可以将传入的 :80 请求转发到 :3000。 为什么它不能与 nginx 一起使用?

【问题讨论】:

    标签: docker nginx traefik


    【解决方案1】:

    您已经告诉 nginx 监听 8082 端口,这没问题,但容器必须公开该端口。 (我猜容器默认暴露 80 端口)

    您似乎有一个自定义的 nginx 图像,因此您可以在图像中添加/替换 EXPOSE 关键字,使其具有如下内容:EXPOSE 8082

    您必须构建并重新启动容器才能使更改生效,然后您可以使用docker-compose ps 检查暴露的端口。

    【讨论】:

    • 你说得对,我忘记了EXPOSE,我想知道为什么我不必在我的 python/django 容器中公开端口,它仍然可以工作。无论如何感谢您的帮助。
    • 这肯定是因为您使用的基础镜像暴露了一个端口,这成为您镜像的默认端口。
    猜你喜欢
    • 2021-05-06
    • 1970-01-01
    • 1970-01-01
    • 2021-05-14
    • 2017-11-19
    • 2013-04-07
    • 2021-05-14
    • 2019-05-27
    • 2019-09-15
    相关资源
    最近更新 更多