Расположение Nginx: ошибка 403 / файл не найден

Я настроил свой домен на своем сервере с помощью nginx. Пока все хорошо, моя домашняя страница работает. Но теперь я хочу добавить несколько локаций для более позднего тестирования программирования. Мой план состоит в том, чтобы вызывать разные проекты, такие как mydomain.com/php/myprogramm.php.

Поэтому я добавляю папку в /var/www/mydomain.com/php (мой боковой индекс находится в /var/www/mydomain.com/html< /сильный>)

Ввод www.mydomain.com/php/ приводит к ошибке 403, а mydomain.com/php/myprogramm.php говорит Файл не найден...

это мой файл nginx:

server {
listen 80 default_server;
#listen [::]:80 default_server ipv6only=on;

# Make site accessible from http://localhost/
server_name mydomain.com www.mydomain.com;

location / {
    root /var/www/mydomain.com/html;
    index index.html index.htm;
}

location /php/ {
    root /var/www/mydomain.com;
}

location /js/ {
    root /var/www/mydomain.com;
}

location /node/ {
    root /var/www/mydomain.com;
}

# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
#   # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
#
#   # With php5-cgi alone:
#   fastcgi_pass 127.0.0.1:9000;
#   # With php5-fpm:
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
}

}

Конечно, когда я настраивал свой домен, я также устанавливал sudo chown -R www-data:www-data /var/www/mydomain.com/html и sudo chmod 755 /var/www.

Какие-то идеи у кого-то? :/


person ComputerDully    schedule 07.11.2014    source источник


Ответы (2)


Анализ проблем

Первое золотое правило:

nginx всегда обслуживает запросы только от одного location. (Пере)прочитайте http://nginx.org/en/docs/http/request_processing.html.

На основе вашей конфигурации:

  1. Запросы к (www.)mydomain.com/php/<whatever> на файлы, не оканчивающиеся на .php, будут обслуживаться location /php/ из /var/www/mydomain.com/php/<whatever>
  2. Запросы к (www.)mydomain.com/<whatever>.php будут обслуживаться location ~\.php$ из <default root ('html' by default)>/<whatever>.php

Первая проблема заключается в том, что вы не обслуживаете .php файлов из того места, где вы думаете. Узнайте из документации location, как выбирается блок местоположения, обслуживающий запрос.

Вы заметите, что ошибка «Файл не найден» была не ошибкой nginx, а сообщением, сгенерированным PHP. Это помогает узнать, откуда возникла проблема (в интерфейсе или в бэкэнде).

Теперь о 403: кажется, у nginx проблемы с доступом к месту, откуда он должен обслуживать контент. Проверьте права /var/www/mydomain.com/php/ (каталог + содержимое).

Предлагаемые советы

Ваша конфигурация выглядит неоптимальной.

  1. Если вы используете один и тот же корень во множестве блоков location, почему бы не переместить его на один уровень выше, чтобы он стал значением по умолчанию (которое вы можете переопределить в определенных местах, где это необходимо)?
  2. Вы можете использовать вложенные локации, т.е. для решения проблемы обслуживания файлов PHP. Обратите внимание, что всегда рекомендуется заключать местоположения регулярных выражений внутри местоположений префиксов (в чем разница? Прочтите location документации). Причина в том, что расположение регулярных выражений чувствительно к порядку, что плохо для обслуживания. Расположение префикса не указано, поскольку будет выбрано только самое длинное совпадение с URI запроса.

Вот обновленная версия части вашей конфигурации:

root /var/www/mydomain.com;

location / {
    root /var/www/mydomain.com/html;
    index index.html index.htm;
}

location /php/ {
    location ~ \.php$ {
        # Useless without use of $fastcgi_script_name and $fastcgi_path_info
        # Moreover, requests ending up here always end with .php...
        fastcgi_split_path_info ^(.+\.php)(/.+)$;

        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;

        # You seem to have copy-pasted this section without understanding it.
        # Good understanding of what happens here is mandatory for security.
    }
}

Я предлагаю вам прочитать документацию о fastcgi_split_path_info, $fastcgi_script_name и $fastcgi_path_info.

person Bernard Rosset    schedule 08.11.2014

Для моего тестирования прямо сейчас я решил проблему довольно просто.

  1. Я забыл проверить свой php.ini и изменить cgi.fix_pathinfo на 0
  2. Также я изменил группу для своих папок (внутри все еще был корень) на www-data.
  3. В конце я обновил свою конфигурацию: я установил root /var/www/mydomain.com; в моем серверном блоке (server{})

Это все, что я сделал.

Но я учту ваш совет для последующих вопросов.

Спасибо за вашу помощь, я ценю это.

person ComputerDully    schedule 08.11.2014