Nginx反向代理到Docker服务返回403

时间:2020-10-13 17:36:24

标签: reactjs docker nginx reverse-proxy

我的nginx + docker + react + java后端出现问题。让我解释一下:

我有一台机器上做了2个docker-compose。

第一个是前端,它只是使用SSL在Nginx中构建的一个React。 第二个是后端,这是一个运行在端口8080中且没有SSL的码头。

这是前端的docker-compose:

version: "3.3"
services:
  app:
    container_name: frontend
    image: frontend:latest
    ports:
      - 80:80
      - 443:443
    restart: always
    volumes:
      - nginx-letsencrypt:/etc/letsencrypt
    labels:
      - com.centurylinklabs.watchtower.enable=true
    networks:
      net:
  watchtower:
    container_name: watchtower_frontend
    image: v2tec/watchtower
    environment:
        - REPO_USER=${DOCKER_USER}
        - REPO_PASS=${DOCKER_PASS}
    volumes:
        - /var/run/docker.sock:/var/run/docker.sock
    restart: always
    command: --cleanup --label-enable --interval 30
volumes:
  nginx-letsencrypt:
networks:
  net:
    driver: bridge

使用此nginx配置

  map $http_upgrade $connection_upgrade {
      default upgrade;
      ''      close;
    }
  
  server {
    server_name www.web.me;
    return 301 $scheme://web.me$request_uri;
  }
  
  server {
    listen 80;
    server_name web.me;
    return 301 https://web.me$request_uri;
  }

   server {

    listen 443 ssl;
    server_name web.me;
    
    ssl_certificate /etc/letsencrypt/live/web.me/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/web.me/privkey.pem;

    access_log /var/log/nginx/data-access.log combined;
    error_log /var/log/nginx/error.log debug;

    location /api {
       error_log    /var/log/nginx/error.log debug;
       proxy_pass http://backend:8080;
       rewrite ^/backend(.*)$ $1 break;
    }

    location / {
      root  /usr/share/nginx/html;
      index  index.html index.htm;
      try_files $uri $uri/ /index.html;
    }

}

这是后端docker-compose

version: '3'
services:
  mongo:
    image: mongo:latest
    container_name: mongo
    restart: always
    networks:
      fontend_net:
    environment:
      MONGO_INITDB_ROOT_USERNAME: ${MONGO_INITDB_ROOT_USERNAME}  #Github
      MONGO_INITDB_ROOT_PASSWORD: ${MONGO_INITDB_ROOT_PASSWORD}  #Github
      MONGO_INITDB_DATABASE: ${MONGO_INITDB_DATABASE} #Github
      MONGO_USER: ${MONGO_USER} #Github
      MONGO_PASSWORD: ${MONGO_PASSWORD} #Github
    volumes:
      - ./mongo/mongod.conf:/etc/mongod.conf
      - ./mongo/docker-entrypoint-initdb.d/mongo-init-user.sh:/docker-entrypoint-initdb.d/mongo-init-user.sh
      - /data/db/:/data/db/
      - /data/log/:/var/log/mongodb/
    ports:
      - "27017:27017"
  prometheus:
    image: quay.io/prometheus/prometheus:latest
    container_name: prometheus
    ports:
      - 9090:9090
    volumes:
      - "./prometheus.yml:/etc/prometheus/prometheus.yml"
    networks:
      frontend_net:
    depends_on:
      - service
  service:
    image: backend:latest
    container_name: backend
    depends_on:
      - mongo
    links:
      - mongo
    labels:
      - com.centurylinklabs.watchtower.enable=true
    environment:
      ENV: prod
      DB_USER: ${MONGO_USER} 
      DB_PASS: ${MONGO_PASSWORD} 
      DB_DB: ${MONGO_INITDB_DATABASE}
    ports:
      - 8080:8080
    restart: always
    networks:
      frontend_net:
  watchtower:
    container_name: watchtower_backend
    image: v2tec/watchtower
    network_mode: host
    environment:
      - REPO_USER=${DOCKER_USER} #Github
      - REPO_PASS=${DOCKER_PASS} #Github
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    restart: always
    command: --cleanup --label-enable --interval 30
networks:
  frontend_net:
    external: true

我的问题是,当前端向后端发送请求时,我收到了403,我认为它是由nginx提供的,但是我既看不到该服务的日志,也看不到任何内容(这可能意味着该请求是没达到)。

我只有nginx的日志:

myip - - [13/Oct/2020:20:52:30 +0000] "POST /api/auth HTTP/1.1" 403 0 "https://web.me/app/start" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.16; rv:81.0) Gecko/20100101 Firefox/81.0"
2020/10/13 20:52:35 [info] 36#36: *33 client closed connection while waiting for request, client: myip, server: 0.0.0.0:443

有人知道这里发生了什么吗?

0 个答案:

没有答案