我有两种不同的服务:
- 帐户生成器:FastAPI应用程序
- 货币追踪器:分为Golang后端和React前端。
此外,我还设置了一个NGINX代理,以便管理所有请求。
我的docker-compose.yml
version: '3.9'
services:
backend:
container_name: myexample-backend
build:
context: backend
command: ["air", "migrate", "&&", "air", "serve"]
env_file:
- backend/.env
ports:
- "18001:18001"
volumes:
- ./certbot/conf/:/etc/nginx/ssl/
networks:
myexample-webserver-network: {}
frontend:
container_name: myexample-frontend
build:
context: frontend
dockerfile: Dockerfile
env_file:
- frontend/.env-prod
command: ["npm", "run", "start:prod"]
ports:
- "13001:3000"
networks:
myexample-webserver-network: {}
stdin_open: true
account-generator:
build:
context: myexample-account-generator
command: [ "uvicorn", "main:app", "--host", "0.0.0.0", "--port", "18010" ]
env_file:
- .env
ports:
- "18010:18010"
networks:
myexample-webserver-network: { }
webserver:
container_name: myexample-nginx-production
image: nginx
volumes:
- ./nginx/conf/production.conf:/etc/nginx/conf.d/default.conf
ports:
- "80:80"
- "443:443"
depends_on:
- backend
- frontend
- myexampleapp
networks:
myexample-webserver-network: {}
networks:
myexample-webserver-network:
external: true
还有我的nginx.conf
server {
listen 80;
listen [::]:80;
root /var/www/html;
server_name myexampledomain.com www.myexampledomain.com;
location /.well-known/acme-challenge/ {
root /var/www/certbot;
}
location / {
return 301 https://myexampledomain.com$request_uri;
}
}
server {
listen 443 ssl;
listen [::]:443 ssl;
root /var/www/html;
server_name myexampledomain.com www.myexampledomain.com;
keepalive_timeout 65;
proxy_connect_timeout 600;
proxy_read_timeout 600;
proxy_send_timeout 600;
ssl_certificate /etc/nginx/ssl/live/myexampledomain.com/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/live/myexampledomain.com/privkey.pem;
location / {
proxy_pass http://money-tracker:18010;
}
}
server {
listen 80;
listen [::]:80;
root /var/www/html;
server_name money-tracker.myexampledomain.com www.money-tracker.myexampledomain.com;
location /.well-known/acme-challenge/ {
root /var/www/certbot;
}
location / {
return 301 https://money-tracker.myexampledomain.com$request_uri;
}
location /api {
return 301 https://money-tracker.myexampledomain.com/api$request_uri;
}
}
server {
listen 443 ssl;
listen [::]:443 ssl;
root /var/www/html;
server_name localhost money-tracker.myexampledomain.com www.money-tracker.myexampledomain.com;
keepalive_timeout 65;
proxy_connect_timeout 600;
proxy_read_timeout 600;
proxy_send_timeout 600;
ssl_certificate /etc/nginx/ssl/live/money-tracker.myexampledomain.com/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/live/money-tracker.myexampledomain.com/privkey.pem;
location / {
proxy_pass http://frontend:3000;
}
location /api {
chunked_transfer_encoding off;
proxy_pass http://backend:18001;
}
}`
我在EC2示例中运行这些服务,购买了一个域,并在我的域提供商和Route 53中配置了所有必需的DNS记录。
我想在域(myexampledomain.com)上运行account-generator服务,在子域(www.example.com)上运行money-tracker服务money-tracker.myexampledomain.com。
到目前为止,这工作完美,但每当我试图从money-tracker前端www.example.com调用money-tracker.myexampledomain.commoney-tracker后端(money-tracker.myexampledomain.com/api),我得到一个502错误。此外,如果我试图从外部(Postman或Imnsomnia)到达,我也得到一个502错误。
有趣的是,容器是健康的,因为如果我ssh到EC2示例,我可以 curl 后端,它正在接收请求。
我尝试过编辑compose文件、NGINX conf文件、/etc/hosts文件等,但似乎都不起作用。
希望有人能帮助我。提前感谢。
1条答案
按热度按时间lyfkaqu11#
验证后端容器是否正在运行并侦听端口18001。您可以通过登录到容器并运行netstat -tln来执行此操作。
直接通过ip地址访问后端服务是否有效?如果有效,可能是dns解析的问题。
您也可以检查nginx日志,您可能会发现与超时相关的错误。尝试增加proxy_connect_timeout、proxy_read_timeout或proxy_send_timeout的超时值
还要检查AWS防火墙是否没有阻塞流量。端口应该为后端和前端打开。
可以先尝试简单的配置,没有ssl,代理,然后一个接一个地启用,当你成功的时候。
很难找到确切的问题,但我想如果你检查这些,你可能会找到根本原因。