我正在尝试通过 Docker 容器部署应用程序并将其反向代理到我的目标端点。
我的docker compose文件如下所示:
version: '3.4'
services:
monitor.api:
image: ${DOCKER_REGISTRY-}monitorapi
ports:
- "5001:443"
build:
context: .
dockerfile: monitor.API/Dockerfile
webapp:
image: ${DOCKER_REGISTRY-}monitorwebapp
ports:
- "4205:443"
- "4206:80"
build:
context: ./monitor-webApp
args:
- BASE_API_URL=${BASE_API_URL}
dockerfile: Dockerfile
两个容器都已成功构建并运行。为了访问它们,我尝试使用以下配置设置 Nginx 服务器:
server {
listen 80;
server_name <HOST IP>;
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 /monitorwebapp/ {
proxy_pass http://<HOST IP>:4206/;
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 /monitorapi/ {
proxy_pass https://<HOST IP>:5001/api/;
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;
}
}
因此,我的预期是,如果我访问 http://HOSTIP/monitorwebapp,我应该可以访问我的 webapp。但是,我只得到 404,而我访问它的唯一方法是通过:http://HOSTIP:4206。
错误日志中也没有内容。有什么办法可以修复这个问题吗?
答案1
我使用了类似的配置,但使用了专门配置的隔离桥接网络;并且 nginx 作为 docker 容器。那么在隔离桥接网络中您不需要 https - 因为它都在您的单个主机内。
因此,在 docker compose 中,要有一个独立的桥接网络,您需要..(我没有正确获得 yml 的所有缩进)。我也没有放入 nginx 部分。
monitor.api
...
networks:
- <isol_bridge_network>
webapp:
...
networks:
- <isol_bridge_network>
networks:
<isol_bridge_network>:
然后在 nginx 配置中。添加内部 DNS 解析器。并将代理传递指向桥接网络上的服务名称和端口 - 而不是外部 IP 地址和端口。要清楚的是,端口 4206 和 5001 是外部可见端口。
location /monitorwebapp/ {
resolver 127.0.0.11 valid=10s;
set $files monitorwebapp:80;
proxy_pass http://$files;
...
}
location /monitorapi/ {
resolver 127.0.0.11 valid=10s;
set $files monitorapi:80;
proxy_pass http://$files;
...
}
希望这一切都有意义......