首页 > 解决方案 > Nginx proxy and docker 502 bad gateway

问题描述

I have two Docker containers on the same network. One of them is a Spring Boot server app, the other is a React client app. I'm trying to get the client to make AJAX calls to the server. When I run them both locally on my machine, outside of Docker, everything works. When I run them with my docker configuration and using an Nginx proxy, I get 502 bad gateway errors.

Here is my docker-compose configuration:

version: '3'

  video-server:
    build:
      context: .
      dockerfile: video-server_Dockerfile
    container_name: video-server
    networks:
      - videoManagerNetwork
    environment:
      - VIDEO_MANAGER_DIR=/opt/videos
    volumes:
      - ${VIDEO_MANAGER_DIR_PROD}:/opt/videos

  video-client:
    build:
      context: .
      dockerfile: video-client_Dockerfile
    container_name: video-client
    networks:
      - videoManagerNetwork
    ports:
      - 9000:80

networks:
  videoManagerNetwork:

As you can see, both containers are given explicit names and are on the same network. video-client is the Nginx React app, video-server is the Spring Boot app.

Here is my Nginx config:

worker_processes auto;

events {
    worker_connections 8000;
    multi_accept on;
}

http {
    log_format compression '$remote_addr - $remote_user [$time_local] '
            '"$request" $status $upstream_addr '
            '"$http_referer" "$http_user_agent"';
    include /etc/nginx/mime.types;
    default_type text/plain;

    server {
        listen 80;
        # TODO make sure the log is written to a docker volume
        access_log /var/log/nginx/access.log compression;

        root /var/www;
        index index.html;

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

        location /api/ {
            proxy_set_header Host $http_host;
            proxy_pass http://video-server:8080/api/;
        }

        location ~* \.(?:jpg|jpeg|gif|png|ico|cur|gz|svg|svgz|mp4|ogg|ogv|webm|htc)$ {
            expires 1M;
            access_log off;
            add_header Cache-Control "public";
        }

        location ~* \.(?:css|js)$ {
            try_files $uri =404;
            expires 1y;
            access_log off;
            add_header Cache-Control "public";
        }

        location ~ ^.+\..+$ {
            try_files $uri =404;
        }
    }
}

As you can see, I'm proxying all calls to /api/ to my video-server container. This should be working. I even shelled into the video-client container docker exec -it video-client bash, installed curl, and was able to successfully make calls to the other container, ie http://video-server:8080/api/categories.

I'm looking for suggestions about what the problem with my configuration could be. I'm not particularly experienced with Nginx, so I'm assuming I'm doing something wrong there.

Edit

I finally figured out what was necessary to make this work. I would still be interested to understand why this helps.

I added the following lines to the "http" section of the Nginx config, and the problem was solved:

fastcgi_buffers 8 16k;
    fastcgi_buffer_size 32k;
    fastcgi_connect_timeout 300;
    fastcgi_send_timeout 300;
    fastcgi_read_timeout 300;

So it looks like this changed the buffer and timeout settings. Why did this help?

标签: dockernginx

解决方案


推荐阅读