docker 403 forbidden php nginx

docker-compose.yml

version: "3"
networks:
  laravel:

services:
  nginx:
    image: nginx:stable-alpine
    container_name: nginx
    ports:
      - "8088:80"
    volumes: 
      - ./src:/usr/share/nginx/html
      - ./site.conf:/etc/nginx/conf.d/site.conf
    depends_on:
      - php
      - mysql

    networks:
    - laravel

  mysql:
    image: mysql:5.7.35
    container_name: mysql
    restart: unless-stopped
    tty: true
    ports: 
      - "4306:3306"
    volumes:
      - ./mysql:/var/lib/mysql
    environment:
      MYSQL_DATABASE: boilerplatelaravel
      MYSQL_USER: root
      MYSQL_ROOT_PASSWORD: Tobi12345678

    networks:
      - laravel


  php:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: php
    volumes:
      - ./src/public:/var/www/html
    ports:
      - "9000:9000"
    networks:
      - laravel

site.conf

server {
    listen 80;
    index index.php;
    server_name localhost;
    error_log /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log;
    root /var/www/html/public;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}

My file tree

testdocker/
┣ mysql/
┣ nginx/
┣ src/
┃ ┗ index.php
┣ docker-compose.yml
┣ Dockerfile
┗ site.conf

When i run a index.html it works fine but when i run a index.php with phpinfo() in it is doesn't work.

2021/09/23 09:02:10 [error] 32#32: *2 directory index of "/usr/share/nginx/html/" is forbidden, client: 172.26.0.1, server: localhost, request: "GET / HTTP/1.1", host: "localhost:8088"

This is the error i get when i look at the logs.

Answer

Solution:

Based on this https://dariuscoder.com/2021/10/01/symfony-5-docker-mysql-example/ I have updated your files, also adding Dockerfile:

docker-compose.yml:

version: "3"
networks:
  laravel:

services:
  nginx:
    image: nginx:stable-alpine
    container_name: nginx
    ports:
      - "8088:80"
    volumes:
      - .:/app:cached
      - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf:cached
    depends_on:
      - php
      - mysql

    networks:
      - laravel

  php:
    build:
      context: .
      dockerfile: Dockerfile
    volumes:
      - .:/app:cached

    working_dir: /app

    # this container name has to be set also in default.conf
    container_name: php
    ports:
      - "9000:9000"
    networks:
      - laravel

  mysql:
    image: mysql:5.7.35
    container_name: mysql
    restart: unless-stopped
    tty: true
    ports:
      - "4306:3306"
    volumes:
      - ./mysql:/var/lib/mysql
    environment:
      MYSQL_DATABASE: boilerplatelaravel
      MYSQL_USER: root
      MYSQL_ROOT_PASSWORD: Tobi12345678

    networks:
      - laravel

docker/nginx/default.conf (for some reason did not work with site.conf name, but probably that does not matter)

server {
    listen 80;
    server_name localhost;

    index index.php index.html;
    root /app/src;


    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        try_files $uri =404;       
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        # container name is php, so php:9000
        fastcgi_pass php:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }



    location ~ \.php$ {
        return 404;
    }

    error_log /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log;
}

Dockerfile:

FROM php:8.0-fpm

RUN apt-get update -yqq && \
    apt-get install -yqq \
    git \
    curl \
    zip \
    unzip \
    gzip \
    libzip-dev \
    libicu-dev \
    nano

RUN docker-php-ext-configure intl

RUN docker-php-ext-install intl pdo pdo_mysql zip opcache bcmath sockets

RUN pecl install xdebug && docker-php-ext-enable xdebug opcache

RUN echo "opcache.max_accelerated_files = 20000" >> /usr/local/etc/php/conf.d/docker-php-ext-opcache.ini

RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" && \
    php composer-setup.php && \
    php -r "unlink('composer-setup.php');" && \
    mv composer.phar /usr/local/bin/composer && \
    chmod +x /usr/local/bin/composer

WORKDIR /app

Btw very nice question, not too much of everything, easily reproducable.

Source