在上游找不到主机 - AWS ECS 和 Docker

问题描述 投票:0回答:1

我正在尝试更新我的 ECS(弹性容器服务)任务定义。我正在更改后端服务的 SendGrid API 密钥。 因此,我通过更新 ECS 来部署此更新的任务定义,它会触发容器的部署。

在重新部署过程中,nginx(可能是 docker 容器服务的代理)遇到错误。错误是nginx无法解析uwsgi服务。我检查了 nginx 是否能够 ping 和 wget uwsgi。 u2028u2028所以我很摸不着头脑,因为这应该是没有太大问题的情况下发生的,但我无法解决它。

这是错误:

nginx: [emerg] host not found in upstream "backendUwsgi" in /etc/nginx/conf.d/backend.conf:45

有没有一种方法可以理想地做到这一点,而无需将任何内容推送到 Github 上并在 AWS 控制台上进行一些更改?我可能需要做出什么样的改变?

nginxconf 文件:

map $http_upgrade $connection_upgrade {
  default upgrade;
  '' close;
}

server {

  listen  80 default_server;
  server_name ${HOST};
  charset     utf-8;

  client_max_body_size 500m;
  gzip on;
  gzip_disable "msie6";
  gzip_types text/plain
             text/css
             application/json
             application/x-javascript
             text/xml
             application/xml
             application/xml+rss
             text/javascript
             application/javascript
             application/x-font-opentype
             image/svg+xml;
  gzip_comp_level 9;
  gzip_vary on;

  location = /api/v1/***** {
    return 200;
    access_log off;
  }

  location / {
    proxy_read_timeout 600;
    client_body_timeout 600;
    uwsgi_read_timeout 600;

    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;

    proxy_pass  http://${UWSGI_APP}:${UWSGI_PORT};
  }
}

我应该在 nginxconf 中添加名为“upstream”的这一行并重新部署吗?没有把握。属性中提到了“backendUwsgi”并在端口 9000 上进行监听

nginx amazon-ecs uwsgi
1个回答
0
投票

根据错误消息和您提供的 nginx 配置,问题似乎与 nginx 无法解析上游服务器“backendUwsgi”有关。您可以采取以下一些步骤来解决此问题:

  1. 添加上游区块: 是的,在 nginx 配置中添加上游块可能会有所帮助。将其添加到 nginx.conf 文件的开头、服务器块之前:

    upstream backendUwsgi {
      server ${UWSGI_APP}:${UWSGI_PORT};
    }
    

    然后,在您的位置块中,将 proxy_pass 行更改为:

    proxy_pass http://backendUwsgi;
    
  2. 检查环境变量: 确保在 ECS 任务定义中正确设置 ${UWSGI_APP} 和 ${UWSGI_PORT} 环境变量。这些应该与您的 uwsgi 服务的名称和端口匹配。

  3. 网络: 确保 nginx 容器和 uwsgi 容器位于同一 Docker 网络或 ECS 任务定义中,允许它们进行通信。

  4. DNS解析: ECS 任务使用 AWS 的内部 DNS。确保您的任务定义设置为使用它。您可能需要将以下内容添加到任务定义中:

    "dnsServers": ["169.254.169.253"]
    
  5. 健康检查: 在 ECS 任务定义中向您的 uwsgi 服务添加运行状况检查。这确保了在 uwsgi 服务实际准备好接受连接之前,ECS 不会认为任务“健康”。

  6. 记录: 在 nginx 中启用更详细的日志记录以获取有关解析失败的更多信息。将其添加到 nginx.conf 中:

    error_log /var/log/nginx/error.log debug;
    
  7. 用于本地测试的 Docker-compose: 如果可能,请尝试使用 docker-compose 在本地复制您的 ECS 设置。这可以帮助您更轻松地调试网络问题。

要在不推送到 GitHub 的情况下实施这些更改:

  1. 使用 AWS CLI 或 AWS 控制台直接更新您的任务定义。
  2. 如果您的 nginx 配置位于单独的文件中,您可以使用 AWS Systems Manager Parameter Store 来存储和更新 nginx 配置。
  3. 更新您的 ECS 服务以使用新的任务定义。

请记住,直接在 AWS 中进行的任何更改最终都应同步回源代码控制以保持一致性。

如果这些步骤无法解决问题,您可能需要更深入地了解 ECS 设置、网络配置以及容器如何相互通信。

© www.soinside.com 2019 - 2024. All rights reserved.