我正在尝试在两个docker容器之间设置nginx代理传递。我的前端容器似乎工作正常,但当我试图访问后端时出现502错误。我有两个docker-compose文件:
docker-compose.yml
version: "3.1"
services:
backend:
image: backend_image
container_name: backend_container
frontend:
container_name: frontend_container
image: frontend_image
proxy:
container_name: proxy_container
image: nginx
restart: unless-stopped
ports:
- "8080:80"
depends_on:
- website
- frontend
docker-compose-development.yml
version: "3.1"
services:
backend:
container_name: backend_container_development
frontend:
build:
context: ./site/public_html/frontend
target: runner
volumes:
- ./site/public_html/frontend:/app
command: npm run dev
ports:
- "3000:80"
environment:
NODE_ENV: development
proxy:
volumes:
- ./nginx/local.conf:/etc/nginx/nginx.conf
- ./logs:/var/logs
我的nginx local.conf文件:
events {
worker_connections 1024;
}
http {
server {
listen 80 default_server;
location / {
proxy_pass http://frontend:3000;
error_log /var/log/frontend_errors.log;
}
location /api {
proxy_pass http://backend:8000;
error_log /var/log/backend_errors.log;
}
}
}
这是我收到的错误[error] 29#29: *2 connect() failed (111: Connection refused) while connecting to upstream, client: 192.168.48.1, server: , request: "GET /api HTTP/1.1", upstream: "http://192.168.48.3:8000/api", host: "localhost:8080"
我已经验证了后端和前端容器的IP是192.168.48.3,并且容器分别在localhost:8000和localhost:3000上运行
2条答案
按热度按时间fcy6dtqo1#
错误消息“connect()failed(111:Connection refused)”表示Nginx无法连接到http://backend:8000的后端容器。以下是您可以采取的解决问题的一些步骤:
1.检查后端容器:通过运行docker ps验证后端容器是否正在运行。如果它没有运行,用docker-compose up backend启动它。
1.验证后端容器的端口:检查后端容器是否正在侦听端口8000。您可以通过运行docker-compose exec后端netstat -tlnp并验证端口8000是否在打开端口列表中来完成此操作。
1.检查网络连接:确保前端和后端容器可以在网络上相互通信。你可以通过运行docker-compose exec frontend ping backend和docker-compose exec backend ping frontend来实现。
1.验证Nginx配置:确保nginx.conf文件的location /API块中的proxy_pass指令中的后端服务拼写正确。另外,通过运行docker-compose exec proxy ping backend,检查是否可以从代理容器访问后端容器。
1.检查后端容器日志:检查后端容器的日志,以了解可能指示其不响应原因的任何错误消息。你可以通过运行docker-compose logs backend来实现。
1.验证后端容器的IP地址:验证后端容器是否正在侦听Nginx尝试连接的IP地址。您可以通过运行docker-compose exec后端netstat -tlnp来完成此操作|grep 8000。
如果这些步骤都没有帮助,您可能需要提供更多信息,例如Dockerfiles的内容或前端容器日志中的任何错误消息。
4sup72z82#
今天遇到了同样的问题,应该使用容器的“内部”端口,在您的情况下
:80
而不是:3000
和:8080
: