基于AWS ECR、ECS的部署:nginx:[紧急]在/etc/nginx/conf.d/default.conf:2的上游“应用程序:9000”中未找到主机

anhgbhbe  于 2023-02-11  发布在  Nginx
关注(0)|答案(3)|浏览(169)

我正在努力配置AWS ECS任务定义来运行简单的PHP-FPM和基于Nginx的容器。
我的"应用"容器在app:9000端口上运行,Nginx在80端口上。Nginx正在通过fastcgi_pass app-upstream;将请求转发到应用容器
所有这些都在本地完美运行。同样的配置在DigitalOcean Docker示例中完美运行,但在AWS ECS中失败。
我猜是任务定义配置问题,但我找不到。

    • 错误日志:**

我正在从Nginx容器获取此日志

nginx: [emerg] host not found in upstream "app:9000" in /etc/nginx/conf.d/default.conf:2

和此日志来自应用程序 (PHP-FPM) 容器

    • 东加勒比国家**

我已经创建了一个简单的集群,其中包含T2Small示例,运行良好。

    • 停靠文件**

在这个Github Repo中,我添加了Dockerfile for App,Nginx图像,docker-compose.yml文件和task-defination.json文件,以供在docker文件中出现错误时参考。

gopyfrb3

gopyfrb31#

您的问题与nginx配置中提到的错误上游路径有关。
执行以下操作进行调查,如果不需要,也要避免在Docker合成文件中使用自定义容器名称:-
快速解决方案是:
1.从Docker-compose文件中删除容器名称。
1.服务密钥名称(例如:test_app)自动被视为容器名称,因此使用。
1.进行上述更改后的正确上游路径应为test_app:9000
正确和建议的方式建立一个码头组成文件:-
1.创建自定义Docker网络假设名称为“intranet”
1.在您的docker-compose文件中创建的每个服务中提及此网络“intranet”。
1.按照快速解决中提到的步骤操作
这对你有什么帮助?你可以检查你创建的网络,判断你的容器是否正确连接,并识别用于连接的名称
Command : docker network inspect <network_name>
NOTE : Docker treats container names as host names by default for internal connections.

bfhwhh0e

bfhwhh0e2#

当使用多个容器时,容器名称对于提供内部连接非常重要。
正如我看到的Docker组合文件一样,容器名称应该与nginx conf中使用的名称匹配。

version: '3'
services:
  test_app:
      container_name: app # not test_app_1
      volumes:
        - test-app-data:/var/www/app
  test_nginx:
      image: "xxxxxx.dkr.ecr.xx-xx-1.amazonaws.com/test-nginx"
      build:
        context: ./docker/nginx
        dockerfile: Dockerfile
      container_name: nginx
      ports:
        - "80:80"
        - "443:443"
      volumes:
        - test-app-data:/var/www/app
        - test-nginx-log:/var/log/nginx
      external_links:
        - app # not test_app_1
      depends_on:
        - test_app
volumes:
  test-app-data:
  test-nginx-log:
7eumitmz

7eumitmz3#

我也遇到了同样的问题。我的“blog”容器运行在blog:8000端口,而“nginx”容器运行在80端口。“nginx”容器将请求转发到“blog”容器。

因为我根本没有在“网络设置”中为“nginx”容器设置“链接”。

所以我把后面容器的名称“blog”放在前面容器“nginx”中(“链接”在“网络设置”中用于“nginx”容器)。

然后,它成功地正确运行了“blog”和“nginx”容器。
所以在你的例子中,把后面容器的名字“app”放在前面容器“nginx”(“nginx”容器的“网络设置”中的“链接”)。

不要忘记将“CMD-SHELL, curl -f http://localhost:9000/ || exit 1“放入“应用程序”容器的“健康检查”中的“命令”中。

此外,不要忘记把“应用程序”在“容器名称”和选择“健康”在“启动依赖排序”的“条件”为“nginx”容器。

相关问题