404 Not found when retrieving Mongo Express resources inside Docker container,using Nginx proxy

o0lyfsai  于 9个月前  发布在  Docker
关注(0)|答案(2)|浏览(115)

我有一个Docker环境,其中包含许多用于Web的容器,API,mongodb,mongo express和nginx。我的目标是使用Nginx将流量转发到正确的服务。目前我有一些工作,以便如果我导航到localhost/API,则API会显示一条消息,web也是一样。但是如果我导航到localhost/mongo-express,服务会加载,但是mongo-express尝试检索的资源都是404找不到:x1c 0d1x的数据
我对Docker相当陌生,对Nginx也完全陌生,正在学习它的工作原理。

services:
  # Web App Container
  web:
    build:
      context: web
    container_name: web
    networks:
      - mynetwork

  # API Container
  api:
    build:
      context: api
    container_name: api
    networks:
      - mynetwork

  # Nginx Container
  nginx:
    image: nginx:1.21-alpine
    container_name: nginx
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
    ports:
      - "80:80"
      - "403:403"
    depends_on:
      - web
      - api
      - mongodb
      - mongo-express
    networks:
      - mynetwork

  # Mongodb Container
  mongodb:
    image: mongo
    container_name: mongodb
    restart: always
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: root
    volumes:
      - mongodb_data:/data/db
    networks:
      - mynetwork

  # Mongo Express Container
  mongo-express:
    image: mongo-express
    container_name: mongo-express
    restart: always
    environment:
      ME_CONFIG_MONGODB_ADMINUSERNAME: admin
      ME_CONFIG_MONGODB_ADMINPASSWORD: admin
      ME_CONFIG_MONGODB_URL: mongodb://root:root@mongodb:27017/
    depends_on:
      - mongodb
    networks:
      - mynetwork

volumes:
  mongodb_data:

networks:
  mynetwork:

字符串
下面是我的Nginx配置文件:

# nginx.conf

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;

events {
    worker_connections 1024;
}

http {
    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log /var/log/nginx/access.log main;

    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;

    server {
        listen 80;
        server_name example.com www.example.com;

        location / {
            proxy_pass http://web:8080/;
            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-Proto $scheme;
        }

        location /api/ {
            rewrite ^/api(/.*)$ $1 break;
            proxy_pass http://api:3000/;
            # Additional proxy settings for the API if needed
        }

        location /mongo-express/ {
            rewrite ^/mongo-express(/.*)$ $1 break;
            proxy_pass http://mongo-express:8081/;
            # Additional proxy settings for Mongo Express if needed
        }

        location /mongodb/ {
            rewrite ^/mongodb(/.*)$ $1 break;
            proxy_pass http://mongodb:27017/;
            # Additional proxy settings for MongoDB if needed
        }

        error_page 404 /404.html/;
        location = /40x.html/ {
        }

        error_page 500 502 503 504 /50x.html/;
        location = /50x.html/ {
        }
    }
}


我希望通过mongo-express检索的文件不会因为反向代理而出现问题。我试过通过改变位置来调整nginx配置和docker-compose文件,在docker-compose文件中设置ME_CONFIG_SITE_BASEURL: mongo-express,但对我来说没有任何效果。
我不只是在寻找一个解决方案,而是在寻找能真正帮助我理解为什么会发生这种情况的信息。

ef1yzkbh

ef1yzkbh1#

在Nginx配置中,任何以/mongo-express/开头的URL都会被转发到mongo-express容器。该容器使用绝对URL路径构造自己的URL,并且它不会立即知道该路径前缀,因此它会生成仅以 e.g./public/...开头的URL,而没有该前缀。
Docker Hub mongo-express image对此有特定的配置设置
ME_CONFIG_SITE_BASEURL(默认值为/):设置baseUrl以便于在挂载点挂载。记住要包括一个前导斜杠和一个尾随斜杠。
因此,您需要确保将其包含在该容器的environment:设置中。

services:
  mongo-express:
    environment:
      ME_CONFIG_SITE_BASEURL: /mongo-express/

字符串
具体的设置取决于应用程序和框架;没有一个通用的答案适用于所有容器。对于您自己的应用程序代码,如果可以只使用相对URL <img src="assets/test.png">,这可以完全避免问题,但使用标准的打包工具,如Webpack,这可能会有点超出您的控制。

6yt4nkrj

6yt4nkrj2#

我已经设法解决了这个问题。首先,我的位置URL和BASE URL有尾随斜杠。我已经添加了尾随斜杠,因为许多在线指南指出我必须这样做,甚至Mongo express文档也指出了这一点。除此之外,从我的nginx配置中删除rewrite ^/mongo-express(/.*)$$1 break;也有帮助。

相关问题