Назад | Перейти на главную страницу

Nginx + php5-fpm + Symfony2 = «Файл не найден».

Это конфигурация сайта на основе официальный документ Symfony2

server {
    listen 80;

    server_name     project.local;
    root            /media/Storage/project/web;

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

    location ~ ^/(app|app_dev|config)\.php(/|$) {
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param HTTPS off;
    }

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

server {
    listen 443;

    server_name     project.local;
    root            /media/Storage/project/web;

    ssl on;
    ssl_certificate     /etc/nginx/ssl/localhost.crt;
    ssl_certificate_key /etc/nginx/ssl/localhost.key;

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

    location ~ ^/(app|app_dev|config)\.php(/|$) {
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param HTTPS on;
    }

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

Сначала я получал No input file specified. ошибка, однако я читал nginx вики что для этой конфигурации мне не нужен cgi.fix_pathinfo=0 (на самом деле они говорят, что Symfony2 должен быть cgi.fix_pathinfo=1).

Поэтому я вернул его к значениям по умолчанию (1) и теперь я получаю File not found..

я видел другие вопросы где они предлагают использовать location ~ \.php$ {, однако они не предназначались для приложения Symfony2.

Я бы хотел по возможности придерживаться официальной конфигурации Symfony2.

Почему это происходит и каково решение?

РЕДАКТИРОВАТЬ 1:

Я изменил cgi.fix_pathinfo вернуться к 0 и изменил конфигурацию на это:

server {
    listen 80;

    server_name     project.local;
    root            /media/Storage/project/web;

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

    location ~ "^(.+\.php)($|/)" {
        fastcgi_split_path_info ^(.+\.php)(.*)$;

        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param SCRIPT_NAME $fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        include fastcgi_params;
    }

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

server {
    listen 443 ssl;

    server_name     project.local;
    root            /media/Storage/project/web;

    ssl_certificate     /etc/nginx/ssl/localhost.crt;
    ssl_certificate_key /etc/nginx/ssl/localhost.key;

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

    location ~ "^(.+\.php)($|/)" {
        fastcgi_split_path_info ^(.+\.php)(.*)$; 
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param SCRIPT_NAME $fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        include fastcgi_params;
    }

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

Затем перезапустил nginx и php5-fpm, как это предлагалось в IRC, однако получил знаменитый Input file not specified ошибка.

РЕДАКТИРОВАТЬ 2: это ошибка. журнал

2014/06/25 22:11:45 [ошибка] 11922 # 0: * 3 FastCGI отправлено в stderr: "Невозможно открыть основной сценарий: /media/Storage/project/web/app_dev.php (Нет такого файла или каталога) "при чтении заголовка ответа от восходящего потока, клиент: 127.0.0.1, сервер: project.local, запрос:" GET /app_dev.php HTTP / 1.1 ", восходящий поток:" fastcgi: // unix: / var / run / php5-fpm " .sock: ", хост:" project.local "

РЕДАКТИРОВАТЬ 3: это access.log

127.0.0.1 - - [25 / июн / 2014: 22: 11: 45 +0200] "GET /app_dev.php HTTP / 1.1" 404 56 "-" "Mozilla / 5.0 (X11; Linux x86_64) AppleWebKit / 537.36 (KHTML , как и Gecko) Ubuntu Chromium / 34.0.1847.116 Chrome / 34.0.1847.116 Safari / 537.36 "

Файлы журнала symfony2 пусты. Я не думаю, что Symfony когда-либо запускалась.

РЕДАКТИРОВАТЬ 4: Я изменил свое мнение после это SO anwser кому:

server {
    listen 80;

    server_name     project.local;
    root            /media/Storage/project/web;

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

    location / {
        index app.php;
        if (-f $request_filename) {
          break;
        }
        rewrite ^(.*)$ /app.php last;
    }

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    location ~ (app|app_dev).php {
        include fastcgi_params;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
        fastcgi_param HTTPS off;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
    }
}

server {
    listen 443 ssl;

    server_name     project.local;
    root            /media/Storage/project/web;

    ssl_certificate     /etc/nginx/ssl/localhost.crt;
    ssl_certificate_key /etc/nginx/ssl/localhost.key;

    error_log /var/log/nginx/ssl_error.log;
    access_log /var/log/nginx/ssl_access.log;

    location / {
        index app.php;
        if (-f $request_filename) {
            break;
        }
        rewrite ^(.*)$ /app.php last;
    }

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    location ~ (app|app_dev).php {
        include fastcgi_params;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
        fastcgi_param HTTPS on;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
    }
}

И теперь я получаю Access denied. ошибка. Ура, что-то изменилось :). Бу, пока не работает :(.

РЕДАКТИРОВАТЬ 5: Я chown loostro:www-data /media/Storage/project -R а потом chmod g+s /media/Storage/project -R, все еще получаю Access denied

РЕДАКТИРОВАТЬ 6: The /var/run/php5-fpm.sock разрешения:

srw-rw---- 1 www-data www-data 0 cze 26 11:03 php5-fpm.sock

В /etc/php5/fpm/pool.d/www.conf file является значением по умолчанию (для дистрибутива Ubuntu 14.04), за исключением тех изменений, которые я раскомментировал, следуя руководству:

listen.owner = www-data
listen.group = www-data
listen.mode = 0660

РЕЗЮМЕ: Моя проблема заключалась в неправильных разрешениях файла. Официальный symfony2 конфиг для nginx в порядке. Я переместил свои файлы на диск NTFS Storage, и, похоже, во время перемещения права доступа к файлам были изменены.

  • chown loostro:www-data -R /media/Storage/project - изменить владельца на loostro и группу на www-data (loostro - мой пользователь, под которым я разрабатываю приложение, php5-fpm работает как www-data), рекурсивно
  • chmod 755 -R /media/Storage/project - изменить права доступа к файлу для проекта на rwx (владелец) rx (группа, другой), рекурсивно
  • cd /media/Storage/project войти в каталог моего проекта
  • chmod 775 -R app/cache app/logs web/uploads private/uploads - рекурсивно изменять права доступа к файлам для загружаемых каталогов rwx (владелец, группа) и rx (другие)
  • chmod g+s -R /media/Storage/project - рекурсивно сохранять права пользователей, групп и файлов для вновь созданных файлов в каталогах