簡體   English   中英

用於保護Docker容器的Docker Nginx反向代理

[英]Docker Nginx Reverse Proxy for Protection of Docker Container

我有兩個docker服務(一個有角度的Web應用程序和一個tomcat后端),我想用第三個docker服務保護它,這是一個配置為反向代理的nginx。 我的代理配置正常,但我的反向代理也應處理基本的授權。 當我通過反向代理配置通過基本身份驗證保護我的前端服務器時,一切正常,但是我的后端仍然向所有人公開。 當我還將基本身份驗證也添加到后端服務時,我遇到了一個問題,即來自前端的基本身份驗證配置標頭沒有轉發/添加到后端REST請求中。 是否可以配置nginx反向代理以將Authorization標頭添加到前端發送的每個請求中。 還是我想錯了,有更好的解決方案?

基礎設施方案

瀏覽器

這是我的docker和nginx配置:

反向代理配置:

worker_processes 1;

events { worker_connections 1024; }

http {

    sendfile on;

    upstream docker-nginx {
        server frontend-nginx:80;
    }

    upstream docker-tomcat {
        server backend-tomcat:8080;
    }

    map $upstream_http_docker_distribution_api_version $docker_distribution_api_version {
        '' 'registry/2.0';
    }

    server {
        listen 80;

        location / {

            auth_basic "Protected area";
            auth_basic_user_file /etc/nginx/conf.d/nginx.htpasswd;

            add_header 'Docker-Distribution-Api-Version' $docker_distribution_api_version always;

            proxy_pass         http://docker-nginx;
            proxy_redirect     off;
        }
    }

    server {
        listen 8080;

        location / {

            auth_basic "Protected area";
            auth_basic_user_file /etc/nginx/conf.d/nginx.htpasswd;

            add_header 'Docker-Distribution-Api-Version' $docker_distribution_api_version always;

            proxy_pass         http://docker-tomcat;
            proxy_redirect     off;
        }
    }

}

docker-compose(設置所有容器):

version: '2.4'

services:
  reverse-proxy:
    container_name: reverse-proxy
    image: nginx:alpine
    volumes:
      - ./auth:/etc/nginx/conf.d
      - ./auth/nginx.conf:/etc/nginx/nginx.conf:ro
    ports:
      - "80:80"
      - "8080:8080"
    restart: always
    links:
      - registry:registry

  frontend-nginx:
    container_name: frontend
    build: './frontend'
    volumes:
      - /dockerdev/frontend/dist/:/usr/share/nginx/html
    depends_on:
          - reverse-proxy
          - bentley-tomcat
    restart: always

  backend-tomcat:
    container_name: backend
    build: './backend'
    volumes:
      - /data:/data
    depends_on:
      - reverse-proxy
    restart: always

  registry:
    image: registry:2
    ports:
      - 127.0.0.1:5000:5000
    volumes:
      - ./data:/var/lib/registry

前端Dockerfile:

FROM nginx
COPY ./dist/ /usr/share/nginx/html
COPY ./fast-nginx-default.conf /etc/nginx/conf.d/default.conf

前端配置:

server {
  listen 80;
  sendfile on;
  default_type application/octet-stream;

  gzip on;
  gzip_http_version 1.1;
  gzip_disable      "MSIE [1-6]\.";
  gzip_min_length   256;
  gzip_vary         on;
  gzip_proxied      expired no-cache no-store private auth;
  gzip_types        text/plain text/css application/json application/javascript application/x-javascript text/xml application/xml application/xml+rss text/javascript;
  gzip_comp_level   9;

  root /usr/share/nginx/html;

  location / {
    try_files $uri $uri/ /index.html =404;
  }
}

后端Dockerfile:

FROM openjdk:11
RUN mkdir -p /usr/local/bin/tomcat
COPY ./backend-0.0.1-SNAPSHOT.jar /usr/local/bin/tomcat/backend-0.0.1-SNAPSHOT.jar
WORKDIR /usr/local/bin/tomcat
CMD ["java", "-jar", "backend-0.0.1-SNAPSHOT.jar"]

嘗試將此指令添加到您的位置塊

proxy_set_header Authorization $http_authorization;
proxy_pass_header  Authorization;

我已經解決了我的問題,方法是在端口80上使用/api列出請求,並將其重定向到端口8080上的tomcat。為此,我還必須調整前端和后端請求,現在所有后端請求都以/api開頭。 通過此解決方案,我可以在端口80上實現基本身份驗證,以保護前端和后端。

worker_processes 1;

events { worker_connections 1024; }

http {

    sendfile on;

    client_max_body_size 25M;

    upstream docker-nginx {
        server frontend-nginx:80;
    }

    upstream docker-tomcat {
        server backend-tomcat:8080;
    }

    server {
        listen 80;

        location /api {

            proxy_pass http://docker-tomcat;
        }

    location / {

            auth_basic "Protected area";
            auth_basic_user_file /etc/nginx/conf.d/nginx.htpasswd;

            proxy_pass         http://docker-nginx;
            proxy_redirect     off;
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM