ERR_EMPTY_RESPONSE — Laravel/Nginx с Docker

Я новичок в Docker, и мне трудно понять, что я делаю неправильно. Я попытался создать одну среду докера для размещения приложения React (Frontend) и приложения Laravel (Backend).

React работает как часы, но Laravel не работает. Когда я пытаюсь получить доступ к домену: порт через браузер, я получаю сообщение об ошибке «ERR_EMPTY_RESPONSE — localhost не отправил никаких данных».

Я был бы очень рад, если бы кто-нибудь мог мне помочь. Я приложу свой docker-compose.yml, конфигурацию nginx и файл Dockerfile для Laravel.

А пока спасибо

docker-compose.yaml

version: '3.7'
services:

    frontend:
      build:
        context: ./app-frontend 
      ports:
        - "80:80"
      environment:
        - watchpack_polling=true
      volumes:
        - ./app-frontend:/app
      networks:
        - app-network

    nginx:
      image: nginx:alpine
      ports:
        - "8000:80"
      volumes:
        - ./app-backend:/var/www
        - ./nginx/conf.d/:/etc/nginx/conf.d/
      depends_on:
        - backend
        - appdb
      networks:
        - app-network

    backend:
      build:
        context: ./app-backend/
        dockerfile: Dockerfile
      restart: unless-stopped
      environment:
        MYSQL_DATABASE: ${DB_DATABASE}
        MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
        MYSQL_PASSWORD: ${DB_PASSWORD}
        MYSQL_USER: ${DB_USERNAME}
      working_dir: /var/www
      volumes:
        - ./app-backend:/var/www
      ports:
        - "9000:9000"
      networks:
        - app-network
        - db

    appdb:
      image: mysql:5.7
      restart: unless-stopped
      environment:
        MYSQL_DATABASE: ${DB_DATABASE}
        MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
        MYSQL_PASSWORD: ${DB_PASSWORD}
        MYSQL_USER: ${DB_USERNAME}
      volumes:
        - ./initdb:/docker-entrypoint-initdb.d
      ports:
        - 3306:3306
      networks:
        - app-network
        - db

    phpmyadmin:
      image: phpmyadmin/phpmyadmin
      restart: unless-stopped
      environment:
        PMA_HOST: appdb
        MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
      depends_on:
        - appdb
      ports:
        - 8443:80
      networks:
        - db

networks:
  app-network:
    driver: bridge
  db:

Конфигурация nginx:

server {
    listen 8000;
    server_name yourdomain.com;  # Change to your domain or localhost

    root /var/www/public;  # Path to your Laravel public directory

    index index.php;

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

    location ~ \.php$ {
        fastcgi_pass backend:9000;  # PHP-FPM server address and port
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

Докерфайл:

########################################################################
### Composer

FROM composer:2.6.2 AS composer

COPY composer.json /app
COPY composer.lock /app

RUN composer install        \
    --ignore-platform-reqs  \
    --no-ansi               \
    --no-autoloader         \
    --no-interaction        \
    --no-scripts

COPY . /app/
RUN composer dump-autoload --optimize --classmap-authoritative

### Composer
########################################################################
### NodeJS

FROM node:20.6.1-alpine3.18 AS node

WORKDIR /app

COPY package.json           /app
COPY package-lock.json      /app
COPY webpack.mix.js         /app
COPY /resources             /app/resources

RUN npm install && npm run dev

### NodeJS
########################################################################
### PHP

FROM php:8.1-fpm-alpine3.18

RUN apk update && apk add --no-cache \
    libpng-dev                       \
    freetype-dev                     \
    oniguruma-dev                    \
    libxml2-dev

RUN rm -rf /var/lib/apt/lists/* && rm -rf /var/cache/apk/*
RUN docker-php-ext-configure gd --enable-gd --with-freetype
RUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd

COPY . /var/www
COPY --from=composer /app/vendor                /var/www/html/vendor
COPY --from=node     /app/public                /var/www/html/public/
COPY --from=node     /app/mix-manifest.json     /var/www/html/mix-manifest.json


RUN addgroup -g 1000 -S www && \
    adduser -u 1000 -S www -G www-data

COPY --chown=www:www-data . /var/www

WORKDIR /var/www

### PHP
########################################################################

Я пробовал играться с портами и разными образами, но ничего не получилось. http://localhost:8000 всегда показывает одну и ту же ошибку. Я также проверил, заблокированы ли порты другой системой или брандмауэром, но это было не так.

Обновлено: Вот что возвращает docker compose ps:

ims_mk-appdb-1 | MySQL:5.7 | "docker-entrypoint.sh mysqld" | база данных приложений | 55 секунд назад | Вверх 38 секунд | 0.0.0.0:3306->3306/TCP, 33060/TCP

ims_mk-backend-1 | ims_mk-бэкенд | "docker-php-entrypoint php-fpm" | бэкэнд | 55 секунд назад | Вверх 36 секунд | 8000/TCP, 0.0.0.0:9000->9000/TCP

ims_mk-интерфейс-1 | ims_mk-интерфейс | "/bin/sh -c 'npm start'" | интерфейс | 55 секунд назад | Вверх 43 секунды | 0.0.0.0:80->80/TCP

ims_mk-nginx-1 | nginx: альпийский | "/docker-entrypoint.sh nginx -g 'демон выключен;'" | нгинкс | 51 секунда назад | Вверх 26 секунд | 80/TCP, 0.0.0.0:8000->8000/TCP

ims_mk-phpmyadmin-1 | phpmyadmin/phpmyadmin | "/docker-entrypoint.sh apache2-foreground" | phpmyadmin | 51 секунда назад | Вверх 26 секунд | 0.0.0.0:8443->80/TCP

Несколько вещей идут не так. Сначала вы хотите, чтобы все заработало, поэтому: «раскройте» свой порт 8000. Поместите expose: 8000 в свой docker-compose.yml, а затем EXPOSE 8000 в свой Dockerfile (возможно, это дубликат). Второе, что идет не так: вы копируете свой исходный код в контейнер докеров, вам не нужно этого делать, у вас уже есть том с исходным кодом.

UnderDog 01.10.2023 05:01

Привет, спасибо за вашу помощь. Я попробовал выставить порт, но это ничего не изменило. Я также удалил операторы COPY, но затем сборка аварийно завершилась:/

alexnieder19 01.10.2023 11:14

Может быть, поменять порты? Порт 80 более распространен для nginx, тогда можно сделать реакцию...реагировать на порт 3000

UnderDog 01.10.2023 15:22

Я тоже это сейчас попробовал. Кажется, что React работает на каждом порту, а вот Laravel — нет. Я пробовал:80,:3000 и:8080. Он всегда возвращает ERR_EMPTY_RESPONSE. В моей конфигурации должна быть ошибка

alexnieder19 01.10.2023 15:41

Я полагаюсь на тот факт, что laravel — это API, а реакция потребляет этот API. Что происходит, когда вы используете Postman? Вернуться к основам. Есть инструмент под названием laradock, он предоставляет все, что вам нужно. Сначала заставьте Laravel работать, затем запустите контейнер реагирования и используйте Laravel ali.

UnderDog 01.10.2023 18:54

Я последовал вашему совету и создал новую конфигурацию докера, начиная с Laravel. Однако я не использовал ларадок. После того, как Laravel поработал, я создал контейнер реагирования и поместил его поверх. Теперь все работает. Я добавлю свою новую конфигурацию в ответ. Спасибо за вашу помощь :)

alexnieder19 02.10.2023 00:04
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
1
6
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я решил проблему, создав новую установку докера. Я действительно не знаю, что вызвало проблему. В любом случае, если кому-то интересно, вот моя новая конфигурация.

docker-compose.yaml

version: '3.8'

services:

    # Frontend App
    frontend:
      build:
        context: ./frontend 
      ports:
        - "80:80"
      environment:
        - watchpack_polling=true
      volumes:
        - ./frontend:/app

    # Web Server Service
    nginx:
      image: nginx:alpine
      container_name: nginx
      ports:
        - "8080:80"
      volumes:
        - ./backend:/var/www
        - ./nginx/conf.d/:/etc/nginx/conf.d/
      depends_on:
        - backend_app
        - db

    db:
      image : mysql
      container_name : mysql
      volumes:
        - ./mysql/data:/var/lib/mysql
      ports:
        - "3306:3306"
      environment:
        MYSQL_DATABASE: backend
        MYSQL_ROOT_PASSWORD: password

    # Application Service
    backend_app:
      container_name: backend
      build: 
        context: ./php
        dockerfile: Dockerfile
      volumes:
        - ./backend:/var/www
      ports:
        - "9000:9000"
      working_dir: /var/www

    #phpMyAdmin Service
    phpmyadmin:
      image: phpmyadmin/phpmyadmin
      container_name: phpmyadmin
      ports:
        - "3400:80"
      depends_on:
        - db

докер-файл:

FROM php:8.2.11-fpm

# Install composer
RUN echo "\e[1;33mInstall COMPOSER\e[0m"
RUN cd /tmp \
    && curl -sS https://getcomposer.org/installer | php \
    && mv composer.phar /usr/local/bin/composer

RUN docker-php-ext-install pdo pdo_mysql

RUN apt-get update

# Install useful tools
RUN apt-get -y install apt-utils nano wget dialog vim

# Install important libraries
RUN echo "\e[1;33mInstall important libraries\e[0m"
RUN apt-get -y install --fix-missing \
    apt-utils \
    build-essential \
    git \
    curl \
    libcurl4 \
    libcurl4-openssl-dev \
    zlib1g-dev \
    libzip-dev \
    zip \
    libbz2-dev \
    locales \
    libmcrypt-dev \
    libicu-dev \
    libonig-dev \
    libxml2-dev

Конфигурация nginx:

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

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

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

  }
}

Другие вопросы по теме