【问题标题】:Nginx reverse proxy and path locationNginx反向代理和路径位置
【发布时间】:2018-12-30 14:45:03
【问题描述】:

您好,我是 Docker 世界的新手,所以我尝试使用 NGINX 反向代理(jwilder 映像)和 Docker 应用程序进行安装。 我已经安装了两个没有 SSL 以使其变得容易。由于 Docker 应用程序似乎安装在根路径中,我想将 NGINX Web 服务器和 docker 应用程序分开。

upstream example.com {
        server 172.29.12.2:4040;
}
server {
 server_name example.com;
 listen 80 ;
 access_log /var/log/nginx/access.log vhost;

 location / {
  proxy_pass http://example.com;
  root /usr/share/nginx/html;
  index index.html index.htm;
  }
 location /app {
  proxy_pass http://example.com:4040;
  }
}

所以我想用http://example.com 重定向到 index.html 并使用 http://example.com/app 重定向到 docker 应用程序。

此外,当我构建安装时,我在 docker-compose expose: "4040" 中使用,所以当我使用 nginx -s reload 重新加载 NGINX 配置文件时,它会警告我没有打开端口 4040。

使用我在任何路径上方发布的配置文件将我引导至 docker 应用程序。

我的问题找不到简单的解决方案。

【问题讨论】:

    标签: docker nginx


    【解决方案1】:

    据我所知,您的逻辑是正确的,docker 旨在为单个容器运行单个服务;为了达到你的目标,你还有几件事需要照顾,如果在你的 Docker 文件中声明了 EXPOSE 4040,那还不足以让服务可以访问。在 docker-compose 文件中,您还必须声明端口,即对于 nginx,您可以通过添加让主机系统监听所有接口

    ...
    ports:
      - 80:80
    ...
    

    这是第一件事,您还必须考虑您希望代理从同一节点上的容器网络以哪种方式到达“应用程序”?如果是,您可以在作曲家文件中添加:

    ...
    depends_on:
      - app
    ...
    

    其中 app 是在 docker-compose 文件中声明的服务名称,像这样 nginx 能够以 app 名称访问您的应用,因此重定向将指向应用:

    location /app {
        proxy_pass http://app:4040;
    }
    

    如果您想通过主机网络访问“应用程序”,可能因为有一天会在另一台主机上运行,​​您可以在容器运行 nginx 的 hosts 文件中添加条目:

    ...
    extra_hosts:
      - "app:10.10.10.10"
      - "appb:10.10.10.11"
    ...
    

    等等

    参考:https://docs.docker.com/compose/compose-file/


    编辑 01/01/2019!!!!新年快乐!!

    一个使用“巨大” docker compose 文件的示例:

    version: '3'
    
    services:
      app:
        build: "./app" # in case you docker file is in a app dir
        image: "some image name"
        restart: always
        command: "command to start your app"
      nginx:
        build: "./nginx" # in case you docker file is in a nginx dir
        image: "some image name"
        restart: always
        ports:
          - "80:80"
          - "443:443"
        depends_on:
         - app
    

    在上面的示例中,nginx 可以通过“app”名称访问您的应用程序,因此重定向将指向 http://app:4040

    systemctl(直接从 docker 开始 - 没有 compose)

    [Unit]
    Description=app dockerized service
    Requires=docker.service
    After=docker.service
    [Service]
    ExecStartPre=/usr/bin/sleep 1
    ExecStartPre=/usr/bin/docker pull mariadb:10.4
    ExecStart=/usr/bin/docker run --restart=always --name=app -p 4040:4040 python:3.6-alpine # or your own builded image
    ExecStop=/usr/bin/docker stop app
    ExecStopPost=/usr/bin/docker rm -f app
    ExecReload=/usr/bin/docker restart app
    [Install]
    WantedBy=multi-user.target
    

    与上面的示例一样,您可以通过系统主机上的端口 4040 访问应用程序(所有接口都在侦听端口 4040 上的连接)以提供特定接口:-p 10.10.10.10:4040:像这样的 4040 会监听地址 10.10.10.10(主机)上的 4040 端口

    docker-compose 与 extra_host:

    version: '3'
    
    services:
      app:
        build: "./app" # in case you docker file is in a app dir
        image: "some image name"
        restart: always
        command: "command to start your app"
      nginx:
        build: "./nginx" # in case you docker file is in a nginx dir
        image: "some image name"
        restart: always
        ports:
          - "80:80"
          - "443:443"
        extra_hosts:
         - "app:10.10.10.10"
    

    像上面例子一样,nginx定义的服务可以到达10.10.10.10的名字app

    至少但不是最后扩展撰写文件的服务:

    docker-compose.yml:

    version: '2.1'
    
    services:
      app:
        extends:
          file: /path/to/app-service.yml
          service: app
      nginx:
        extends: /path/to/nginx-service.yml
        service: nginx
    

    app-service.yml:

    version: "2.1"
    
    service:
      app:
        build: "./app" # in case you docker file is in a app dir
        image: "some image name"
        restart: always
        command: "command to start your app"
    

    nginx-service.yml

    version: "2.1"
    
    service:
      nginx:
        build: "./nginx" # in case you docker file is in a nginx dir
        image: "some image name"
        restart: always
        ports:
          - "80:80"
          - "443:443"
        extra_hosts:
         - "app:10.10.10.10"
    

    真的希望上面发布的例子足够多。

    【讨论】:

    • 我有一个用于 nginx 的 docker compose 文件和另一个用于我要安装的应用程序的文件。看来用你的方法我必须用我想要的一切来做一个巨大的 docker compose,我不想那样。
    • 在 docker compose 版本 2 中具有使文件分离的扩展功能,在新版本中也应该可以包含远程 docker compose 文件,让我更好地检查一下
    • 我检查了一下,我给你的解决方案已经很好了,根据你对composer的使用,不需要是composer文件,你可以通过systemctl或类似于将应用程序绑定到主机,定义自己的网络并为容器分配 IP 地址或定义要添加到容器 /etc/hosts 文件中的主机名。
    • 您好,感谢您抽出宝贵时间。你能给我举个例子吗?我没有那个习惯。明天我会发布我的 docker compose 文件,以便您查看我的配置。
    • 我给你举个例子,但现在在意大利是 2018 年还剩 2 小时!!? 明天我会足够清醒?
    猜你喜欢
    • 1970-01-01
    • 2015-12-14
    • 2021-05-03
    • 2020-12-18
    • 2019-04-16
    • 2019-08-05
    • 1970-01-01
    • 1970-01-01
    • 2019-03-14
    相关资源
    最近更新 更多