我有一个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
,但对我来说没有任何效果。
我不只是在寻找一个解决方案,而是在寻找能真正帮助我理解为什么会发生这种情况的信息。
2条答案
按热度按时间ef1yzkbh1#
在Nginx配置中,任何以
/mongo-express/
开头的URL都会被转发到mongo-express容器。该容器使用绝对URL路径构造自己的URL,并且它不会立即知道该路径前缀,因此它会生成仅以 e.g./public/...
开头的URL,而没有该前缀。Docker Hub
mongo-express
image对此有特定的配置设置ME_CONFIG_SITE_BASEURL
(默认值为/
):设置baseUrl以便于在挂载点挂载。记住要包括一个前导斜杠和一个尾随斜杠。因此,您需要确保将其包含在该容器的
environment:
设置中。字符串
具体的设置取决于应用程序和框架;没有一个通用的答案适用于所有容器。对于您自己的应用程序代码,如果可以只使用相对URL
<img src="assets/test.png">
,这可以完全避免问题,但使用标准的打包工具,如Webpack,这可能会有点超出您的控制。6yt4nkrj2#
我已经设法解决了这个问题。首先,我的位置URL和BASE URL有尾随斜杠。我已经添加了尾随斜杠,因为许多在线指南指出我必须这样做,甚至Mongo express文档也指出了这一点。除此之外,从我的nginx配置中删除rewrite ^/mongo-express(/.*)$$1 break;也有帮助。