nginx - 使用 jwilder nginx-proxy,如何将子目录 url 代理传递到特定容器?

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

我使用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 服务。 我想我必须在 nginxconf 中添加如下内容:

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

This feature is not built into the lib 。 那么,我怎样才能实现这一目标呢?

最佳答案

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

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

然后,它将可以这样访问:

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

设置 header 实际上可以用任何语言来实现。或者,为了避免设置自定义 header ,您可以将该 DNS 添加到您的 /etc/hosts 文件中:

127.0.0.1 api.localhost

所以你可以像这样 curl :

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

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

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 服务器)。所以你不需要接触节点代码。

关于nginx - 使用 jwilder nginx-proxy,如何将子目录 url 代理传递到特定容器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44974513/

相关文章:

docker - 将VuePress与docker和NGINX传递一起使用

php - 如何在php docker中打印用户输入?

java - Docker:尝试在容器内运行 java vert.x 应用程序。

docker - 使用 `docker run — rm`时,有没有办法找到容器的运行时间

proxy - 为什么SpringBoot 2.0之后默认选择CGLIB代理

django - nginx/gunicorn 连接挂起 60 秒

docker - 让 NGINX 与 Gunicorn Web 应用程序一起使用

Nginx 未在已启用站点中拾取站点?

proxy - actionHero.js 设置 Http header

node.js - 使用来自 node.js 的凭据进行反向代理登录