Вы здесь

Нестандартная конфигурация NGINX, PHP-fpm

1

Есть нестандартная задача для друпал-сайта на NGINX.

В корне сайта имеется папка, содержащая список папок, в каждой из которых есть index.php:

/demo/example1/index.php
/demo/example2/index.php
/demo/example3/index.php
/demo/example4/index.php
....
/demo/example95/index.php

Необходимо сделать так чтобы NGINX исполнял файлы PHP как напрямую так и переходом в саму папку:

/demo/example1/
/demo/example2/
/demo/example3/

Что я пробовал писать в конфиги NGINX:

/etc/nginx/apps/drupal/drupal.conf:

location /demo/ {
    alias /var/www/sites/site.com/demo/$1;    
    try_files $uri @drupal;
}

/etc/nginx/sites-available/site.com:

location ^~/demo/ {
    include apps/drupal/fastcgi_drupal.conf;
    fastcgi_pass phpcgi;
}

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

и даже прямой путь до конкретного файла

location = /var/www/sites/site.com/demo/example1/index.php { 
    fastcgi_pass phpcgi; 
}

Что получалось: если мы вызываем прямой файл - он скачивается в загрузки браузера; а если открывает папку (без index.php) то сервер отдает 404

конфиги:
/etc/nginx/apps/drupal/drupal.conf http://pastebin.com/3c1Jwc2g
/etc/nginx/sites-available/site.com http://pastebin.com/R8ULZXWU

Как написать правило, чтобы оно позволяло обрабатывать файлы PHP в пределах одной директории, но при этом в других путях перенаправляло запрос на друпальный index.php?

Версия Drupal: 
7.x
Вопрос задан 10.11.2015 - 05:01

Ответы

0

Спасибо Alan'у, за рабочее решение!
Вот что момогло разрулить вопрос:

/etc/nginx/apps/drupal/drupal.conf

location / {

    location ~/demo/(.*)$ { 
      location ~* ^.+\.(?:css|cur|js|jpe?g|gif|htc|ico|png|html|xml|otf|ttf|eot|woff|svg)$ {
          access_log off;
          expires 30d;
          ## No need to bleed constant updates. Send the all shebang in one
          ## fell swoop.
          tcp_nodelay off;
          ## Set the OS file cache.
          open_file_cache max=3000 inactive=120s;
          open_file_cache_valid 45s;
          open_file_cache_min_uses 2;
          open_file_cache_errors off;
      }

      try_files $uri $uri/index.php /index.php;
      fastcgi_split_path_info ^(.+\.php)(/.+)$;
      include fastcgi_params;
      fastcgi_pass phpcgi;
    }

    #тут еще несколько кусков, видимо от Perusio

}

В этом-же файле внизу вот этот кусок

## Any other attempt to access PHP files returns a 404.
location ~* ^.+\.php$ {
    return 404;
}

заменяем на этот:

location ~* ^.+\.php$ {
  try_files $uri =404;
  fastcgi_split_path_info ^(.+\.php)(/.+)$;
  include fastcgi_params;
  fastcgi_pass phpcgi;
}

Похоже это все.

Ответ дан 11.11.2015 - 22:45
0

Ответа сходу не получится, давайте по порядку, потом соберем полный ответ. У вас конфиг perusio и в нем запрещено выполнение пхп файлов кроме индекса в корне сайта. drupal.conf:

## Any other attempt to access PHP files returns a 404.
location ~* ^.+\.php$ {
    return 404;
}

вместо этого сделайте

location ~* ^.+\.php$ {
  try_files $uri =404;
  fastcgi_split_path_info ^(.+\.php)(/.+)$;
  include fastcgi_params;
  fastcgi_pass phpcgi;
}

после этого проверьте свои решения, какой результат?

Ответ дан 10.11.2015 - 11:00

Возможно, ещё надо будет добавить

index index.php;

В соответствующую секцию "server", чтобы обращение к папке стало обращением к соответствующему index.php в ней.

Комментарий оставлен 11.11.2015 - 16:26

А в каком файле в секцию server нужно добавить данную строку?
Сейчас секция server есть в двух файлах:
/etc/nginx/sites-available/site.com
/etc/nginx/sites-available/000-default

причем в файле site.com есть две секции server (не знаю правильно-ли это)
http://pastebin.com/R8ULZXWU
и во второй из них есть данная строка.

Однако все равно при заходе на папку вида /demo/example1/ друпал пишет 404, в то время как при заходе прямо на индекс (/demo/example1/index.php), все открывается нормально. В апаче кстати (и на патруле), все работало без дополнительных настроек

Комментарий оставлен 11.11.2015 - 20:23