We use Docker Compose for our Laravel application development. The two main Docker containers in our Compose configuration are:

  • custom nginx Docker container with nginx micro-caching and request throttling - we would like to run a single instance of it

  • custom PHP Docker Container for Laravel itself; we would like to scale it horizontally; nginx is to round-robin requests to multiple Laravel containers (or connect to a single connection point managed by DigitalOcean App Platform).

We are considering App Platform for deployment.

Is this setup possible with the App Platform?

We cannot eliminate nginx because of its role in micro-caching and request throttling; we would like Laravel not to do it because nginx is much more efficient and less resource greedy at these tasks.

These answers are provided by our Community. If you find them useful, show some love by clicking the heart. If you run into issues leave a comment, or add your own answer to help others.

×
1 answer

@ReWild 👋

This setup is possible on the App Platform! You’re describing 2 service components; 1 for the nginx service, and another for the laravel service — where each service can be scaled independently.

Your nginx configuration can reference your laravel service on the application internal network using a hostname matching your component name. So if your component name is laravel, then you can reference http://laravel from your nginx config in order to route to it internally as desired.

It’s worth noting that the App Platform does have an ingress gateway built-in (via Istio) that load-balances incoming traffic across all instances of your services, so it may not be necessary to do this yourself unless you want more control over other features that aren’t supported yet (like request throttling that you mentioned).

  • This is amazing! Could you please clarify:

    1. If instance_count=2 for the laravel service, and instance_count=1 for the nginx service, will DigitalOcean load-balance nginx’s requests to http://laravel?

    2. How do I make sure that the laravel’s port 9000 (php-fpm) is only exposed to the nginx service and not to the outside world?

    3. When using Docker Compose, we mount the same /application to both php-fpm and nginx container. In other words, both php and nginx have to see the source code. Now that no mounting is possible, our understanding is that the application source code needs to be COPYed into the Docker container at build time. Is this correct, or is there a better way for the two containers to see the same application source code?

    4. How do we make sure that laravel instances are up before the nginx instances? This is needed because otherwise nginx will throw an error:
      invalid host in upstream “http://laravel:9000

    – many thanks!

    • @snormoredo could you please help with my follow up question above. Many thanks!

    • If instancecount=2 for the laravel service, and instancecount=1 for the nginx service, will DigitalOcean load-balance nginx’s requests to http://laravel?

      If you’re targeting the http://laravel internal hostname from nginx, and laravel has 2 instances, then the traffic you proxy to it will be load-balanced across both instances.

      How do I make sure that the laravel’s port 9000 (php-fpm) is only exposed to the nginx service and not to the outside world?

      We don’t support internal-only services yet (coming soon), so in the meantime you may want to consider restricting access in the laravel application code, possibly using something like proxy_set_header in your nginx config.

      When using Docker Compose, we mount the same /application to both php-fpm and nginx container. In other words, both php and nginx have to see the source code. Now that no mounting is possible, our understanding is that the application source code needs to be COPYed into the Docker container at build time. Is this correct, or is there a better way for the two containers to see the same application source code?

      That’s correct — you’d have to copy the source into each container at build-time or combine into a single component.

      How do we make sure that laravel instances are up before the nginx instances? This is needed because otherwise nginx will throw an error:
      invalid host in upstream “http://laravel:9000”

      One way to accomplish this is to update the nginx container entrypoint/command to wait for http://laravel to be available before starting up the nginx process itself — with something like this.

Submit an Answer