4

after looking for an answer 2 weeks along, going deep into the docker compose and docker networks documentations, I'd like to ask for some help right here.

I am creating two Web API services, let's called them a back API (back.api.dev) and a front API (front.api.dev).

What I tried so far :

The back API is connected to a MySQL database, and the front API only sends cURL requests to the back API. Both APIs are built upon Symfony and are processed by a docker PHP-FPM container. Everything is served by a docker Apache 2.4 container.

Sending requests through Postman and cURL requests to back.api.dev & front.api.dev are both working great. It works both from my host, but also from the Apache container. I also added 127.0.0.1 back.api.dev and 127.0.0.1 front.api.dev to my /etc/hosts host machine file. The back API is well connected to the database as well.

But when I send a request to a specific front API route which runs a cURL request to the back API using GuzzleHTTP client and send the answer back to the user, I get a 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/

I also tried to send cURL requests from the CLI inside the front_api container but the result is the same. I also tried to send it directly to the port 9000 handled by php-fpm but I get a cURL error 56: Recv failure: Connection reset by peer error.

Here's the docker-compose.yml file :

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

Here is my back 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>

My guess is that Apache is not enough configured to forward incoming curl requests to the php-fpm instance. I looked after Docker networks, aliases, drivers, extra_hosts but nothing has helped so far to fix this issue.

Thank you for your help.

Sense
  • 1,096
  • 8
  • 20

1 Answers1

0

I'm thinking that there's no url http://back.api.dev/api/videos/ from the front end. maybe it needs a host entry in the front end like you've done on your host box. sorry I don't have enough points to put this in as a suggestion comment rather than an answer.

soqls
  • 26
  • 5
  • Yes @soqls there is a route well defined because if I drop the cURL request everything works great. – Sense Nov 26 '20 at 08:12
  • Hey Sense. I saw a comment that .dev domains sometimes cause trouble, maybe try another tld. make it .app instead. Third comment under the main question at: https://stackoverflow.com/questions/44064557/curl-connection-refused-between-applications-on-docker-container?rq=1 See if ServerAlias * under ServerName works too. – soqls Nov 28 '20 at 14:21