微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

反向代理到另一台机器

如何解决反向代理到另一台机器

解释我要做什么:

我在 ip 192.168.1.10(docker 反向代理)和 192.168.1.20(其他服务)上有 2 个服务器。我想要 10 个将请求重定向到 20 个(其中许多请求都使用 SSL)。

示例:

用户请求 回复 返回
example_internal.host.com 192.168.1.10 https://example_internal.host.com
example_external.host.com 192.168.1.20 https://example_external.host.com



docker-compose.yaml:

version: '3'

services:
  Nginx-proxy:
    image: budry/jwilder-nginx-proxy-arm:0.6.0
    restart: always
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock:ro
      - certs:/etc/Nginx/certs:ro
      - confd:/etc/Nginx/conf.d
      - vhostd:/etc/Nginx/vhost.d
      - html:/usr/share/Nginx/html
    labels:
      - com.github.jrcs.letsencrypt_Nginx_proxy_companion.Nginx_proxy
    environment:
      - DEFAULT_HOST=example_external.host.com
    networks:
      - frontend

  letsencrypt:
    image: jrcs/letsencrypt-Nginx-proxy-companion:stable
    restart: always
    volumes:
      - certs:/etc/Nginx/certs:rw
      - confd:/etc/Nginx/conf.d
      - vhostd:/etc/Nginx/vhost.d
      - html:/usr/share/Nginx/html
      - /var/run/docker.sock:/var/run/docker.sock:ro
    environment:
      - DEFAULT_EMAIL=example@email.com
    networks:
      - frontend
    depends_on:
      - Nginx-proxy

  Nginx_internal:
    image: Nginx:stable-alpine
    hostname: example_internal.host.com
    restart: always
    expose:
      - "80"
    volumes:
      - /var/www/html:/usr/share/Nginx/html:rw
    environment:
      - VIRTUAL_HOST=example_internal.host.com
      - LETSENCRYPT_HOST=example_internal.host.com
      - Nginx_HOST=example_internal.host.com
      - LETSENCRYPT_EMAIL=example@email.com
    depends_on:
      - Nginx-proxy
      - letsencrypt
    networks:
      - frontend


  Nginx_external:
    hostname: example.host.com
    restart: always
    build:
      context: ./scm-proxy
    expose:
      - "80"
    environment:
      - VIRTUAL_HOST=example_external.host.com
      - LETSENCRYPT_HOST=example_external.host.com
      - LETSENCRYPT_EMAIL=example@email.com
      - ENABLE_Nginx_REMOTEIP=1
    depends_on:
      - Nginx-proxy
      - letsencrypt
    networks:
      - frontend

networks:
   frontend:
     driver: bridge

scm-proxy/Dockerfile:

FROM Nginx:1.15-alpine
copY Nginx.conf /etc/Nginx/Nginx.conf

scm-proxy/Nginx.conf:

worker_processes 1;

events {
  worker_connections 1024;
}

http {

    sendfile on;
    client_max_body_size 0;
    chunked_transfer_encoding on;

    server {
        listen 80;
        location / {
            proxy_pass        http://localhost:80;
            proxy_redirect    off;
            proxy_set_header  Host              $http_host;   # required for docker client's sake
            proxy_set_header  X-Real-IP         $remote_addr; # pass on real client's IP
            proxy_set_header  X-Forwarded-For   $proxy_add_x_forwarded_for;
            proxy_set_header  X-Forwarded-Host $http_host;
            proxy_set_header  X-Forwarded-Proto $scheme;
        }
    }
}

(在我读过的几个地方,我必须在“/etc/hosts”中输入 dns 的分辨率,类似于“192.168.1.20 example_external.host.com”)

事实是,这是我第一次使用这项技术,我没有找到太多信息,而且我发现的东西很难理解。

解决方法

nginx 配置在端口 80 上对自身进行反向代理。如果您想反向代理到其他容器之一,请将 lacalhost 更改为您为容器提供的任何服务名称。例如http://nginx_external:80

,

这是对我有用的配置:

评论:

缺少一些详细信息,例如 nginx.conf 文件自动在 example_external.host.com 字段中使用 server_name,但稍后会出现。

另一方面,如果 DEFAULT_HOST= 被声明,你必须小心,你可能会得到错误。我建议评论它直到它起作用然后取消评论

我推荐使用这个命令:docker-compose up -d --remove-orphans --build

文件:

docker-compose.yaml:

version: '3'

services:
  nginx-proxy:
    image: budry/jwilder-nginx-proxy-arm:0.6.0
    restart: always
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock:ro
      - certs:/etc/nginx/certs:ro
      - confd:/etc/nginx/conf.d
      - vhostd:/etc/nginx/vhost.d
      - html:/usr/share/nginx/html
    labels:
      - com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy
#    environment:
#      - DEFAULT_HOST=example_internal.host.com
    networks:
      - frontend

  letsencrypt:
    image: jrcs/letsencrypt-nginx-proxy-companion:stable
    restart: always
    volumes:
      - certs:/etc/nginx/certs:rw
      - confd:/etc/nginx/conf.d
      - vhostd:/etc/nginx/vhost.d
      - html:/usr/share/nginx/html
      - /var/run/docker.sock:/var/run/docker.sock:ro
    environment:
      - DEFAULT_EMAIL=example@email.com
    networks:
      - frontend

  nginx_external1:
    container_name: tests
    restart: always
    build:
      context: ./scm-proxy
    expose:
      - "80"
    environment:
      - VIRTUAL_HOST=example_external.host.com
      - LETSENCRYPT_HOST=example_external.host.com
      - LETSENCRYPT_EMAIL=example@email.com
    extra_hosts:
      - "example_external.host.com:192.168.1.20"
    depends_on:
      - nginx-proxy
      - letsencrypt
    networks:
      - frontend

networks:
   frontend:
     driver: bridge

scm-proxy/Dockerfile:

FROM nginx:stable-alpine
COPY nginx.conf /etc/nginx/nginx.conf

scm-proxy/nginx.conf:

events {
  worker_connections 1024;
}

http {
  server {
    listen 80;
    listen [::]:80;
    server_name example_external.host.com;
#
    location / {
#        proxy_pass         http://example.com;
#        proxy_pass         http://192.168.1.20;
        proxy_pass         http://example_external.host.com;
    }
  }
}

特别感谢@richardsefton的奉献

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。