NGINX compose EC2 -无法从前端到达后端

3lxsmp7m  于 2023-04-20  发布在  Nginx
关注(0)|答案(1)|浏览(138)

我有两种不同的服务:

  • 帐户生成器: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文件等,但似乎都不起作用。
希望有人能帮助我。提前感谢。

lyfkaqu1

lyfkaqu11#

验证后端容器是否正在运行并侦听端口18001。您可以通过登录到容器并运行netstat -tln来执行此操作。
直接通过ip地址访问后端服务是否有效?如果有效,可能是dns解析的问题。
您也可以检查nginx日志,您可能会发现与超时相关的错误。尝试增加proxy_connect_timeout、proxy_read_timeout或proxy_send_timeout的超时值
还要检查AWS防火墙是否没有阻塞流量。端口应该为后端和前端打开。
可以先尝试简单的配置,没有ssl,代理,然后一个接一个地启用,当你成功的时候。
很难找到确切的问题,但我想如果你检查这些,你可能会找到根本原因。

相关问题