【问题标题】:With jwilder nginx-proxy, how to proxypass a subdirectory url to a specific container?使用 jwilder nginx-proxy,如何将子目录 url 代理传递到特定容器?
【发布时间】:2017-07-08 01:56:53
【问题描述】:

我使用jwilder/nginx-proxy 做一个反向代理。我尝试将http://localhost:8000/api 重定向到特定的php 服务。

目录结构:

.
+-- docker-compose.yml
+-- nginx
+-- nodejs
|   +-- index.js
|   +-- …
+-- php
|   +-- api

docker-compose.yml:

version: "3.1"

services:

  nginx-proxy:
    image: jwilder/nginx-proxy:alpine
    ports:
      - "8000:80"
    volumes:
      - ./php:/srv/www
      - /var/run/docker.sock:/tmp/docker.sock:ro

  nodejs:
    image: node:alpine
    environment: 
      - NODE_ENV=production
      - VIRTUAL_HOST=localhost
      - VIRTUAL_PORT=8080
    expose:
      - "8080"
    working_dir: /home/app
    restart: always
    volumes:
      - ./nodejs:/home/app
    command: ["node", "index.js"]

  php:
    image: php:apache
    environment:
      - VIRTUAL_HOST=localhost
    volumes:
      - ./php:/var/www/html

这适用于nodejs 服务。

现在,我想将对 http://localhost:8000/api 的调用重定向到 php 服务。 我想我必须在 nginx conf 中添加类似的内容:

server {
  location /api {
    proxy_pass http://php:80/api;
    proxy_set_header Host $host;
  }
}

This feature is not built into the lib。 那么,我该如何实现呢?

【问题讨论】:

    标签: nginx docker proxy docker-compose jwilder-nginx-proxy


    【解决方案1】:

    一种方法是为 php 应用程序提供自己的虚拟主机:

      php:
        image: php:apache
        environment:
          - VIRTUAL_HOST=api.localhost
        volumes:
          - ./php:/var/www/html
    

    那么,就可以这样访问了:

    curl -H 'Host: api.localhost' http://localhost:8000/api
    

    几乎可以用任何语言设置标题。或者为了避免设置自定义标头,您可以将该 DNS 添加到您的 /etc/hosts 文件中:

    127.0.0.1 api.localhost
    

    所以你可以这样卷曲:

    curl -H http://api.localhost:8000/api
    

    这是设置自定义标头的方法,例如在节点中:

    var request = require('request')
    
    var formData = {}
    
    request({
        headers: {
          'Host': 'api.localhost'
        },
        uri: 'http://localhost:8080',
        method: 'POST'
      }, function (err, res, body) {
          console.log("it works")
          console.log(res)
        }
    )
    

    但是,我建议您使用 /etc/hosts 方法,它应该在生产环境(DNS 服务器)中具有等效性。所以你不需要接触节点代码。

    【讨论】:

    • 能否举例说明如何/在何处设置自定义标题?
    • 谢谢。修改 DNS 移除了 Docker 的可移植逻辑。在每个请求中修改标头也不轻。最终,jwilder/nginx-proxy 与我上一个问题中简单的 nginx 配置相比确实变得复杂了……我必须考虑一下
    • 修改nginx容器内的/etc/hosts文件有意义吗?
    • 不,我没有。 Nginx 通过它们的 IPS 联系每个容器。但是,要从节点访问 php api 只需这样做:http://php/api,如果 php 无法扩展,则无需通过 nginx
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-28
    • 2022-11-02
    • 2018-04-29
    相关资源
    最近更新 更多