【问题标题】:cURL between Docker service php-fpm containers results in "Connection refused"Docker 服务 php-fpm 容器之间的 cURL 导致“连接被拒绝”
【发布时间】:2021-03-08 15:26:23
【问题描述】:

在 2 周后寻找答案,深入了解 docker compose 和 docker networks 文档后,我想在这里寻求帮助。

我正在创建两个 Web API 服务,我们称它们为后端 API (back.api.dev) 和前端 API (front.api.dev)。

到目前为止我尝试了什么:

后端 API 连接 MySQL 数据库,前端 API 只向后端 API 发送 cURL 请求。这两个 API 都建立在 Symfony 之上,并由 docker PHP-FPM 容器处理。一切都由 docker Apache 2.4 容器提供服务。

通过 Postman 和 cURL 请求发送请求到 back.api.devfront.api.dev 都工作得很好。它既适用于我的主机,也适用于 Apache 容器。我还在我的/etc/hosts 主机文件中添加了127.0.0.1 back.api.dev127.0.0.1 front.api.dev。后台 API 也与数据库连接良好。

但是当我向特定的前端 API 路由发送请求时,该路由使用 GuzzleHTTP 客户端向后端 API 运行 cURL 请求并将答案发送回用户,我得到一个 cURL error 7: Failed to connect to back.api.dev port 80: Connection refused (see https://curl.haxx.se/libcurl/c/libcurl-errors.html) for http://back.api.dev/api/videos/

我还尝试从 front_api 容器内的 CLI 发送 cURL 请求,但结果相同。我还尝试将其直接发送到由 php-fpm 处理的端口9000,但我收到了cURL error 56: Recv failure: Connection reset by peer 错误。

这是docker-compose.yml 文件:

version: "3.8"

networks:
  my_api_network:
    driver: bridge
    # external:
    #   name: my_api_network_default

services:
  apache:
    container_name: 'api_apache'
    image: bitnami/apache:latest
    ports:
      - 8080:8080
      # - 8443:8443
    volumes:
      - ./docker/apache/vhosts/back-api-dev.conf:/vhosts/back-api-dev.conf:ro
      - ./docker/apache/vhosts/front-api-dev.conf:/vhosts/front-api-dev.conf:ro
    volumes_from:
      - php_backend_api
      - php_frontend_api
    depends_on:
      - php_backend_api
      - php_frontend_api
    networks:
      - my_api_network

  php_backend_api:
    hostname: 'back.api.dev'
    container_name: 'php_backend_api'
    build:
      context: docker/php7-fpm
      network: host
      args:
        TIMEZONE: 'UTC'
    volumes:
      - ./docker/php7-fpm/php.ini:/usr/local/etc/php/php.ini:ro
      - ./back_api/:/var/www/back_api:cached
      - ./back_api/vendor:/var/www/back_api/vendor:delegated
      - /var/www/back_api/var/
    networks:
      - my_api_network
  
  php_frontend_api:
    hostname: 'front.api.dev'
    container_name: 'php_frontend_api'
    build:
      context: docker/php7-fpm
      network: host
      args:
        TIMEZONE: 'UTC'
    volumes:
      - ./docker/php7-fpm/php.ini:/usr/local/etc/php/php.ini:ro
      - ./front_api/:/var/www/front_api:cached
      - ./front_api/vendor:/var/www/front_api/vendor:delegated
      - /var/www/front_api/var/
    networks:
      - my_api_network

  db:
    container_name: 'mysql_db'
    image: mysql:5.7
    restart: always
    volumes:
      - ./docker/data/mysql:/var/lib/mysql:delegated
      - ./docker/mysql:/etc/mysql/conf.d:ro
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      TZ: ${TIMEZONE}
    command: --sql_mode="STRICT_ALL_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER" --default-authentication-plugin=mysql_native_password
    ports:
      - 3306:3306
    networks:
      - my_api_network

这是我的后台 API Apache Virtualhost:

<VirtualHost *:8080>
  ServerName back.api.dev
  
  DocumentRoot "/var/www/back_api/public"

  ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://php_backend_api:9000/var/www/back_api/public/$1

  <Directory "/var/www/back_api/public">
    Options Indexes FollowSymLinks
    AllowOverride All
    Require all granted
    DirectoryIndex index.php

    <IfModule mod_rewrite.c>
      RewriteEngine On
      RewriteCond %{REQUEST_FILENAME} !-f
      RewriteCond %{REQUEST_FILENAME} !-d
      RewriteRule ^ index.php [QSA,L]
    </IfModule>
  </Directory>
  
  LogLevel debug
  # LogLevel warn
  # LogLevel notice

  ErrorLog /opt/bitnami/apache2/logs/error-back.log
  CustomLog /opt/bitnami/apache2/logs/access-back.log combined

</VirtualHost>

我的猜测是 Apache 的配置不足以将传入的 curl 请求转发到 php-fpm 实例。我照顾了 Docker networksaliasesdriversextra_hosts,但到目前为止还没有解决这个问题。

感谢您的帮助。

【问题讨论】:

  • 你好@sense!请问,你成功解决了吗?
  • 不幸的是没有@Duhamel,从未找到任何解决该问题的方法。
  • 我找到了这个stackoverflow.com/a/61481485/4484964。我可能会解释原因,我觉得这很合乎逻辑。你怎么看?

标签: php apache docker curl docker-compose


【解决方案1】:

我认为前端没有 URL http://back.api.dev/api/videos/。 也许它需要在前端有一个主机条目,就像您在主机箱上所做的那样。 抱歉,我没有足够的积分将其作为建议评论而不是答案。

【讨论】:

  • 是的@soqls 有一个明确定义的路由,因为如果我放弃 cURL 请求,一切都会很好。
  • 嘿,感觉。我看到一条评论说 .dev 域有时会引起麻烦,也许试试另一个 tld。改为.app。主要问题下的第三条评论:stackoverflow.com/questions/44064557/… 查看 ServerName 下的 ServerAlias * 是否也有效。
猜你喜欢
  • 2020-06-10
  • 2020-07-08
  • 1970-01-01
  • 1970-01-01
  • 2019-10-20
  • 2017-10-19
  • 2017-05-09
  • 2016-11-28
  • 1970-01-01
相关资源
最近更新 更多