Не найден файл PHP, который должен быть найден в соответствии с настроенным vHost

Я пытаюсь настроить приложение Symfony 3.x с помощью Docker. Я настроил 3 контейнера докеров через файл docker-compose.yml:

  • Nginx
  • Php-fpm
  • MySQL

Когда я перехожу к my-project.dev:8080/, я вижу простую страницу 404-Not found.

  • Я не могу загрузить my-project.dev:8080/app_dev.php или my-project.dev:8080/config.php (я получаю сообщение об ошибке «файл не найден»)

Я также не вижу никаких записей в /var/log/nginx/access.log.

docker-compose.yml:

web:
  image: nginx:latest
  ports:
    - "8080:80"
  volumes:
    - .:/var/www
    - ./docker/vhost.conf:/etc/nginx/sites-enabled/vhost.conf
    - ./docker/nginx.conf:/etc/nginx/nginx.conf
  links:
    - php

php:
  image: php:5.6-fpm
  volumes:
    - .:/var/www
  links:
    - db

db:
  image: mysql:latest
  volumes:
    - /var/lib/mysql
  environment:
    - MYSQL_ROOT_PASSWORD=my-password

файл nginx.conf:

user  www-data;
worker_processes  4;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                  '$status $body_bytes_sent "$http_referer" '
                  '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

файл vhost.conf:

server {
    listen *:80;

    server_name my-project.dev;
    root /var/www/web;

    location / {
       # try to serve file directly, fallback to app.php
       try_files $uri /app.php$is_args$args;
    }

    # DEV
    # This rule should only be placed on your development environment
    # In production, don't include this and don't deploy app_dev.php or config.php
    location ~ ^/(app_dev|config)\.php(/|$) {
       fastcgi_pass php:9000;
       fastcgi_split_path_info ^(.+\.php)(/.*)$;
       include fastcgi_params;

       fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
       fastcgi_param DOCUMENT_ROOT $realpath_root;
    }

    location ~ \.php$ {
       return 404;
    }

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

person mattyh88    schedule 03.12.2016    source источник
comment
Я ничего не знаю о Docker ... но разве вашему виртуальному хосту не нужно также говорить, чтобы он прослушивал порт 8080? У вас есть что-нибудь для прослушивания на 8080? grep "8080" /etc/nginx/sites-available/* что-нибудь возвращает?   -  person Darren H    schedule 04.12.2016
comment
Привет Даррен, спасибо за ваш ответ. Я обнаружил, что вызывало проблему: я забыл добавить свойство конфигурации «volume» для изображения php-fpm + мне пришлось переопределить WORKDIR из /var/www/html в /var/www для php- изображение в минуту.   -  person mattyh88    schedule 04.12.2016


Ответы (3)


Мне пришлось переопределить WORKDIR образа php-fpm, создав такой образ:

Файл Docker:

FROM php:5.6-fpm
MAINTAINER Firstname Lastname <[email protected]>
WORKDIR /var/www

Создать образ:

docker build -t companyx/php-5.6-fpm .

Обновите файл docker-compose:

web:
  image: nginx:latest
  ports:
    - "8080:80"
  volumes:
    - .:/var/www
    - ./docker/vhost.conf:/etc/nginx/sites-enabled/vhost.conf
    - ./docker/nginx.conf:/etc/nginx/nginx.conf
  links:
    - php

php:
  image: companyx/php-5.6-fpm
  volumes:
    - .:/var/www
  links:
    - db

db:
  image: mysql:latest
  volumes:
    - /var/lib/mysql
  environment:
    - MYSQL_ROOT_PASSWORD=my-password
person mattyh88    schedule 04.12.2016

Проблема в том, что с этим вашим определением:

location ~ ^/(app_dev|config)\.php(/|$) {
   fastcgi_pass php:9000;
   fastcgi_split_path_info ^(.+\.php)(/.*)$;
   include fastcgi_params;
   fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
   fastcgi_param DOCUMENT_ROOT $realpath_root;
}

location ~ \.php$ {
   return 404;
}

вы используете php-страницу, которая возвращает 404.

Вы должны изменить строку try_files $uri /app.php$is_args$args; в

try_files $uri /app_dev.php$is_args$args;

person Lodato L    schedule 04.12.2016

У меня была такая же проблема, и я пробовал разные предлагаемые решения, но мой случай был другим: мне не хватало index.php внутри папки public/.

Убедитесь, что этот класс находится в папке public, сделав это самостоятельно, или создайте проект symfony в корневом каталоге.

person Ahmed Alaa El-Din    schedule 22.03.2020