Проблемы с настройкой Laravel с помощью nginx и docker-compose

#laravel #docker #nginx #docker-compose

Вопрос:

У меня возникли проблемы с настройкой приложения Laravel для запуска на моем веб-сервере.

Проблема в том, что я получаю Добро пожаловать в nginx! страница, а не мое приложение laravel при использовании браузера.

Настройка заключается в следующем

  • Это сервер, работающий на Ubuntu 20.04 LTS
  • Служба nginx устанавливается непосредственно на компьютере (без использования docker)
  • У меня есть докер-композиция для запуска 3 контейнеров: postgres (база данных) keycloak (сервер аутентификации) Мое приложение laravel.

Keycloak и база данных postgres работают как заклинания в течение нескольких месяцев.

Путь к приложению Laravel -gt; /var/www/dev.mycompany.com/

Файл докера Laravel -gt; /var/www/dev.mycompany.com/Файл докера

 FROM php:8.0-fpm  # Copy composer.lock and composer.json COPY composer.lock composer.json /var/www.dev.mycompany.com  # Set working directory WORKDIR /var/www.dev.mycompany.com  # Install dependencies RUN apt update amp;amp; apt install -y   build-essential   libpng-dev   libjpeg62-turbo-dev   libfreetype6-dev   locales   zip   jpegoptim optipng pngquant gifsicle   vim   unzip   git   curl  # Clear cache RUN apt clean amp;amp; rm -rf /var/lib/apt/lists/*  # Install extensions RUN docker-php-ext-install pdo_mysql mbstring zip exif pcntl RUN docker-php-ext-configure gd --with-gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ --with-png-dir=/usr/include/ RUN docker-php-ext-install gd  # Install composer RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer  # Add user for laravel application RUN groupadd -g 1000 www RUN useradd -u 1000 -ms /bin/bash -g www www  # Copy existing application directory contents COPY . /var/www  # Copy existing application directory permissions COPY --chown=www:www . /var/www.dev.mycompany.com  # Change current user to www USER www  # Expose port 9000 and start php-fpm server EXPOSE 9000 CMD ["php-fpm"]  

Путь к конфигурации Nginx — Laravel: /etc/nginx/сайты-доступны/www/dev.mycompany.com HTTP еще не настроен, я просто тестировал с 443, прежде чем написать правило для перенаправления всех запросов none https

 server {  listen 443;  index index.php index.html;  error_log /var/log/nginx/error.log;  access_log /var/log/nginx/access.log;  root /var/www/dev.mycompany.com;  location ~ .php$ {  try_files $uri =404;  fastcgi_split_path_info ^(. .php)(/. )$;  #fastcgi_pass dev.mycompany.com:9000;  fastcgi_pass unix:/var/run/php/php8.0-fpm.sock;  fastcgi_index index.php;  include fastcgi_params;  fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;  fastcgi_param PATH_INFO $fastcgi_path_info;  }  location / {  try_files $uri $uri/ /index.php?$query_string;  gzip_static on;  } }  

docker-compose.yml — путь: srv/

 version: '3.1'  volumes:  postgres_data:  driver: local  services:  postgres:  image: postgres:latest  restart: unless-stopped  volumes:  - postgres_data:/var/lib/postgresql/data  environment:  POSTGRES_DB: keycloak  POSTGRES_USER: **********************  POSTGRES_PASSWORD: **********************  networks:  - app-network  keycloak:  image: jboss/keycloak:latest  restart: unless-stopped  environment:  DB_VENDOR: POSTGRES  DB_ADDR: postgres  DB_DATABASE: keycloak  DB_USER: **********************  DB_PASSWORD: **********************  KEYCLOAK_USER: ************  KEYCLOAK_PASSWORD: **********************  PROXY_ADDRESS_FORWARDING: "true"  ports:  - 8080:8080  depends_on:  - postgres  networks:  - app-network  app-backend:  image: digitalocean.com/php  build:  context: .  dockerfile: /var/www/dev.mycompany.com/Dockerfile  restart: unless-stopped  container_name: web-backend  tty: true  environment:  SERVICE_NAME: app  SERICE_TAGS: dev  working_dir: /var/www/dev.mycompany.com  volumes:  - /var/www/dev.mycompany.com:/var/www/dev.mycompany.com  - ./php/local.ini:/usr/local/etc/php/conf.d/local.ini  networks:  - app-network networks:  app-network:  driver: bridge  

Заранее БОЛЬШОЕ спасибо

Нотгаэль

Комментарии:

1. Почему это: #fastcgi_pass dev.mycompany.be:9000; прокомментировано? Файл Dockerfile запускается php-fpm и предоставляет порт 9000. Поскольку все контейнеры запущены на одной машине, контейнер php должен быть доступен через локальный хост с fastcgi_pass localhost:9000

2. Вы правы, я изменил свою конфигурацию nginx вот так, но ничего не меняется . Все еще получаю страницу приветствия Nginx. fastcgi_pass localhost:9000; #fastcgi_pass unix:/var/run/php/php8.0-fpm.sock;

3. И COPY composer.lock composer.json /var/www/dev.mycompany.com WORKDIR /var/www/dev.mycompany.com в изменения в файле Dockefile была внесена поправка /var/www.dev.mycompany.com to /var/www/dev.mycompany.com , но все же … при входе в контейнер ничего не меняется.Я проверил, что файлы приложения находятся в файле /var/www/dev.mycompany.com и что приложение Laravel работает правильно. Приложение было создано, и ключ сгенерирован, … php artisan работает просто отлично ….

4. После внесения изменений в конфигурацию вы перезагрузили nginx?

5. Да, я это сделал. Но в конце концов это сработало, начав все сначала.

Ответ №1:

Заставил его работать, начав все с нуля и закончив этой конфигурацией

Файл докера для приложения laravel

 FROM php:7.4-fpm  # Arguments defined in docker-compose.yml ARG user ARG uid  # Install system dependencies RUN apt-get update amp;amp; apt-get install -y   git   curl   libpng-dev   libonig-dev   libxml2-dev   zip   unzip  # Clear cache RUN apt-get clean amp;amp; rm -rf /var/lib/apt/lists/*  # Install PHP extensions RUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd  # Get latest Composer COPY --from=composer:latest /usr/bin/composer /usr/bin/composer  # Create system user to run Composer and Artisan Commands RUN useradd -G www-data,root -u $uid -d /home/$user $user RUN mkdir -p /home/$user/.composer amp;amp;   chown -R $user:$user /home/$user  # Set working directory WORKDIR /var/www/dev.mycompany.com  USER $user  

Конфигурация Nginx

 server {  listen 80;  server_name dev.mycompany.com;  root /var/www/dev.mycompany.com/public;   add_header X-Frame-Options "SAMEORIGIN";  add_header X-XSS-Protection "1; mode=block";  add_header X-Content-Type-Options "nosniff";   index index.html index.htm index.php;   charset utf-8;   location / {  try_files $uri $uri/ /index.php?$query_string;  gzip_static on;  }   location = /favicon.ico { access_log off; log_not_found off; }  location = /robots.txt { access_log off; log_not_found off; }   error_page 404 /index.php;   location ~ .php$ {  try_files $uri =404;  fastcgi_split_path_info ^(. .php)(/. )$;  fastcgi_pass localhost:9000;  fastcgi_index index.php;  include fastcgi_params;  fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;  fastcgi_param PATH_INFO $fastcgi_path_info;  }   error_log /var/log/nginx/error.log;  access_log /var/log/nginx/access.log; }  server {  listen 443;  server_name dev.mycompany.com;  root /var/www/dev.mycompany.com/public;   add_header X-Frame-Options "SAMEORIGIN";  add_header X-XSS-Protection "1; mode=block";  add_header X-Content-Type-Options "nosniff";   index index.html index.htm index.php;   charset utf-8;   location / {  try_files $uri $uri/ /index.php?$query_string;  gzip_static on;  }   location = /favicon.ico { access_log off; log_not_found off; }  location = /robots.txt { access_log off; log_not_found off; }   error_page 404 /index.php;   location ~ .php$ {  try_files $uri =404;  fastcgi_split_path_info ^(. .php)(/. )$;  fastcgi_pass localhost:9000;  fastcgi_index index.php;  include fastcgi_params;  fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;  fastcgi_param PATH_INFO $fastcgi_path_info;  }   error_log /var/log/nginx/error.log;  access_log /var/log/nginx/access.log; }  

докер-сочинение

 version: "3.7"  services:  postgres:  image: postgres:latest  restart: unless-stopped  environment:  POSTGRES_DB: ****************  POSTGRES_USER: ****************  POSTGRES_PASSWORD: ****************  ports:  - 5432:5432  volumes:  - postgres_data:/var/lib/postgresql/data  networks:  - app-network   keycloak:  image: jboss/keycloak:latest  restart: unless-stopped  environment:  DB_VENDOR: POSTGRES  DB_ADDR: postgres  DB_DATABASE: ****************  DB_USER: ****************  DB_PASSWORD: ****************  KEYCLOAK_USER: ****************  KEYCLOAK_PASSWORD: ****************  PROXY_ADDRESS_FORWARDING: "true"  ports:  - 8080:8080  depends_on:  - postgres  networks:  - app-network   postgres-web:  image: postgres:latest  restart: unless-stopped  environment:  POSTGRES_DB: ****************  POSTGRES_USER: ****************  POSTGRES_PASSWORD: ****************  ports:  - 5433:5432  volumes:  - postgres_data:/var/lib/postgresql/data  networks:  - app-network   web-backend:  build:  args:  user: ****************  uid: 1000  context: ./  dockerfile: /var/www/dev.mycompany.com/Dockerfile  image: web-backend  restart: unless-stopped  working_dir: /var/www/dev.mycompany.com/  ports:  - 9000:9000  volumes:  - /var/www/dev.mycompany.com:/var/www/dev.mycompany.com  networks:  - app-network  volumes:  postgres_data:  driver: local  networks:  app-network:  driver: bridge  

Приложение Laravel .env

 APP_NAME=web-backend APP_ENV=prod APP_KEY= APP_DEBUG=false APP_URL=http://dev.mycompany.com  LOG_CHANNEL=stack LOG_DEPRECATIONS_CHANNEL=null LOG_LEVEL=debug  DB_CONNECTION=pgsql DB_HOST=127.0.0.1 DB_PORT=5433 DB_DATABASE=**************** DB_USERNAME=**************** DB_PASSWORD=****************  BROADCAST_DRIVER=log CACHE_DRIVER=file FILESYSTEM_DRIVER=local QUEUE_CONNECTION=sync SESSION_DRIVER=file SESSION_LIFETIME=120  MEMCACHED_HOST=127.0.0.1  REDIS_HOST=127.0.0.1 REDIS_PASSWORD=null REDIS_PORT=6379  MAIL_MAILER=smtp MAIL_HOST=mailhog MAIL_PORT=1025 MAIL_USERNAME=null MAIL_PASSWORD=null MAIL_ENCRYPTION=null MAIL_FROM_ADDRESS=null MAIL_FROM_NAME="${APP_NAME}"  AWS_ACCESS_KEY_ID= AWS_SECRET_ACCESS_KEY= AWS_DEFAULT_REGION=us-east-1 AWS_BUCKET= AWS_USE_PATH_STYLE_ENDPOINT=false  PUSHER_APP_ID= PUSHER_APP_KEY= PUSHER_APP_SECRET= PUSHER_APP_CLUSTER=mt1  MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}" MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"  

The reason it was not working before maybe because the server_name was missing in the nginx config and the Dockerfile had error in the script to correctly work with php 8 ???