Docker Nginx代理:如何使用路径而不是主机名将流量路由到不同容器

wqnecbli  于 2023-08-03  发布在  Nginx
关注(0)|答案(7)|浏览(145)

假设现在我有不同的应用程序在不同的路径上运行在同一服务器上:

  • 10.200.200.210/app1
  • 10.200.200.210/app2
  • 10.200.200.210/app3

我想使用nginx作为代理在不同的Docker容器上运行每个应用程序。
我试过jwilder/nginx-proxy,如果我使用不同的域名(app1.domain.com,app2.domain.com等),效果很好,但我不能使用域,我需要使用相同的IP。
我也不能使用不同的端口,如:

  • 10.200.200.210:81/app1
  • 10.200.200.210:82/app2
  • 10.200.200.210:83/app3

都必须在端口80上工作。
1.有没有办法配置jwilder/nginx-proxy来做到这一点?
1.是否有另一个Docker镜像,如jwilder/nginx-proxy,使它。
1.或者你能给予我一些提示,让我自己构建一个nginx docker容器吗?

bgtovc5b

bgtovc5b1#

以防有人还在寻找答案。jwilder/nginx-proxy允许您使用自定义Nginx配置,无论是代理范围还是每个VIRTUAL_HOST。
下面是如何使用Per-VIRTUAL_HOST位置配置来实现这一点。
1.在您的项目文件夹中创建另一个文件夹-“vhost.d”。
1.在“vhost.d”文件夹中创建自定义nginx配置文件“whoami.local”。此文件必须与VIRTUAL_HOST同名!
./vhost.d/whoami.local

location /app1 {
  proxy_pass http://app1:8000;
}

location /app2 {
  proxy_pass http://app2:8000;
}

字符串
1.创建docker-compose.yml文件。
./docker-compose.yml

version: '3'

services:
  nginx-proxy:
    image: jwilder/nginx-proxy
    ports:
    - "8080:80"
    volumes:
    - /var/run/docker.sock:/tmp/docker.sock:ro
    - /path/to/vhost.d:/etc/nginx/vhost.d:ro

  gateway:
    image: jwilder/whoami
    environment:
    - VIRTUAL_HOST=whoami.local

  app1:
    image: jwilder/whoami

  app2:
    image: jwilder/whoami


1.运行docker-compose up
1.检查配置
在bash run中:

$ curl -H "Host: whoami.local" localhost:8080
I'm 1ae273bce7a4
$ curl -H "Host: whoami.local" localhost:8080/app1
I'm 52b1a7b1992a
$ curl -H "Host: whoami.local" localhost:8080/app2
I'm 4adbd3f9e7a0
$ docker ps
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS              PORTS                  NAMES
6a659a4d4b0a        jwilder/nginx-proxy   "/app/docker-entrypo…"   54 seconds ago      Up 53 seconds       0.0.0.0:8080->80/tcp   nginxreverseproxy_nginx-proxy_1
4adbd3f9e7a0        jwilder/whoami        "/app/http"              54 seconds ago      Up 53 seconds       8000/tcp               nginxreverseproxy_app2_1
52b1a7b1992a        jwilder/whoami        "/app/http"              54 seconds ago      Up 53 seconds       8000/tcp               nginxreverseproxy_app1_1
1ae273bce7a4        jwilder/whoami        "/app/http"              54 seconds ago      Up 53 seconds       8000/tcp               nginxreverseproxy_gateway_1


您也可以将“whoami.local”域添加到/etc/hosts文件中,并直接调用此域。
/etc/host

...
127.0.0.1   whoami.local
...


测试结果:

$ curl whoami.local:8080
I'm 52ed6da1e86c
$ curl whoami.local:8080/app1
I'm 4116f51020da
$ curl whoami.local:8080/app2
I'm c4db24012582

rekjcdws

rekjcdws2#

只需使用nginx镜像创建容器,请记住设置net“host”,这将使您的容器与主机共享相同的地址和端口。挂载nginx.conf文件和配置代理表。例如:
docker命令:

docker run --name http-proxy -v /host/nginx.conf:/etc/nginx/nginx.conf --net host -itd --restart always nginx

字符串
nginx.conf:

server {
  listen 80;
  location /app1 {
    proxy_pass YOUR_APP1_URL;
  }
  location /app2 {
    proxy_pass YOUR_APP2_URL;
  }
}

ecbunoof

ecbunoof3#

这是一个完整的nginx.conf
它会将所有内容重定向到root,只有/api重定向到不同的容器。
Source and an example container using it

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log;

events {
    worker_connections  1024;
}

http {
  server {
        listen 80;
        location / {
            proxy_pass http://frontend:3000/;
        }
        location /api {
            proxy_pass http://backend/api;
    }
  }
}

字符串

jgwigjjp

jgwigjjp4#

只要把它放在/etc/nginx/nginx.conf中

worker_processes  1;

    error_log  /var/log/nginx/error.log;

    events {
        worker_connections  1024;
    }

    http {
      server {
            listen 80;

            location /api {
                proxy_pass http://awesome-api;
                proxy_redirect     off;
                proxy_set_header   Host $host;
                proxy_set_header   X-Real-IP $remote_addr;
                proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header   X-Forwarded-Host $server_name;
            }
      }
    }

字符串

6uxekuva

6uxekuva5#

默认网桥网络在172.17.0.1上具有网关。您可以在nginx.conf中使用此IP地址

server {
    listen 80;
    server_name example.com;

    location /app1 {
        proxy_pass  http://172.17.0.1:81;
    }
    location /app2 {
        proxy_pass  http://172.17.0.1:82;
    }
}

字符串
可以从外部使用端口80访问它们
您可以通过运行命令docker network inspect bridge来检查网桥网关IP地址

um6iljoc

um6iljoc6#

我的情况有点不同。我正在做一个项目,Django和其他几个应用程序位于nginx后面(充当反向代理)
接受的解决方案对我不起作用,我认为这是因为各种应用程序不提供文件(iidoEe. /app1-uri/bla/blo/bli//app1-uri/bla/blo/bli完全相等)。所有的静态文件都被收集到nginx中。
“有问题的”行为在这里的文档中解释。本质上,nginx会拾取不带斜杠的uri,并尝试将其解析为资源,如果不能,则重定向到**/bla/blo/bli/ * 而不是 * /app1-uri/bla/blo/bli/**
这是我最后的工作。在这个例子中,app1-urirepairapp

server {
    listen 80;
    listen 443 ssl http2;
    
    ...

    # This is the line that fixes the issue.
    rewrite ^/repairapp/([^static].*[^/])$ /repairapp/$1/ permanent;
    
    # This is nginx serving my static files
    location /repairapp/static/ {
        alias /var/www/repairapp/static/;
    }
    
    # This is the uri that maps to my app (no file serving here)
    location /repairapp/ {
        proxy_pass http://repairappcontainer:8000/;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_redirect off;
    }
    
    ...

字符串
注意rewrite ^/repairapp/([^static].*[^/])$ /repairapp/$1/ permanent;这一行,它重写并添加了一个尾随的正斜杠到任何(我的应用程序的)uri中,错过了它;除了那些以/repairapp/static开头的。这些uriMap到nginx将服务的资源。
要进行调试,请在nginx容器中打开一个shell并运行curl -IL http://[server-name]/repairapp/[string-of-uris-without-trailing-slash]以查看究竟发生了什么。

epfja78i

epfja78i7#

version: '3'

services:
  nginx-proxy:
    image: jwilder/nginx-proxy
    ports:
    - "8080:80"
    volumes:
    - /var/run/docker.sock:/tmp/docker.sock:ro
    environment:
      DEFAULT_HOST: nginx.proxy.default.host

  app1:
    image: jwilder/whoami
    environment:
      VIRTUAL_HOST: "nginx.proxy.default.host"
      VIRTUAL_PATH: "/app1/"

  app2:
    image: jwilder/whoami
    environment:
      VIRTUAL_HOST: "nginx.proxy.default.host"
      VIRTUAL_PATH: "/app2/"

字符串
感谢https://stackoverflow.com/a/52726896/1643061

相关问题