Size: a a a

2020 July 04

JS

John Ship in nginx_ru
Привет всем. Заранее извиняюсь за простыню, но решил написать вопрос заранее и сразу, чтобы потом не писать кучу рассказов что и как я сделал до того как задал вопрос.
Имеется такой вопрос. Пытаюсь настроить nginx для работы с php-проектом, до этого работавшем на apache, в котором был такой конфиг (использовался .htaccess):

RewriteCond %{REQUEST_URI} !some_public
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule (.*)$ some_public/$1 [L]

Идея данного конфига бал в том, что файлы изначально искались в текущем (и глубже) каталоге (document_root), а затем в каталоге some_public (и глубже).
Сайтов с таким конфигом много, каталог some_public является симлинком на общийй каталог со скриптами php, реализующими основу движка всех сайтов.
Т.е. "по дефолту" сайты работают без единого файла в локальном каталоге, но если туда положить любой файл с таким именем как в каталоге some_public, то возьмется сначала он, позволяя таким образом плавно уходить от "скелета" сайта к все большей кастомизации.

Начиная с какого-то момента пришел к выводу что "скрипач не нужен" (в смысле апач) и решено было полностью перейти на nginx (который кстати используется сейчас в проекте в качестве фронта и кеша).
Для попытки (!) такого перехода был собран такой вот конфиг nginx-а:

server {
 listen        8.8.8.8:80;
 server_name    .example.com;
 root          /www/some/example.com/public;

 location / {
   index            /some_public/index.php;
   #index            /index.php;
   include         conf.d/php-fpm.inc;
   try_files        $uri $uri/ /some_public$document_uri =404;
 }

}

файл php-fpm.inc:

location ~* \.php$ {
 fastcgi_pass    unix:/var/run/php-fpm/php-fpm.sock;
 include         fastcgi_params;
 fastcgi_param   SCRIPT_FILENAME    $document_root$fastcgi_script_name;
 fastcgi_param   SCRIPT_NAME        $fastcgi_script_name;
 try_files        $uri $uri/ /some_public$document_uri =404;
}

И вроде бы навскидку оно даже заработало. Файлы отдаются как надо (и в нужной последовательности благодаря try_files), но возникла проблема с индексными index.php, лежащими в НЕкорневых папках (а они тоже нужны, причем в каждой папке - свои).
Т.е. index.php из корня хорошо проходит благодаря директиве "index  /some_public/index.php", если написать index.php, то не работает (404 на морде), все благодаря =404 в try_files, но там убирать =404 тоже нельзя, тогда .php начинает обрбатываться первым location и просто отдавается исходный код php-скриптов.
В общем такая каша получается как замок из спичек, одну задел - все посыпалось. Апачевские конфиги конечно же проще курить, но апач - это бронетанк, который тут не вписывается по своей монструозности.

Может быть тут есть гуру конфигов нгинкса? Посоветуйте как решить вышеописанную задачу. На крайний случай, пошлите меня в мануалы (только не в доку по нгинксу, я ее прочитал, легче не стало :) ).
Читал некоторые статьи (хабр и пр.), очень много хороших статей и даже с примерами, но все они описывают немножко другие кейзы.
источник

GG

George Gaál in nginx_ru
John Ship
Привет всем. Заранее извиняюсь за простыню, но решил написать вопрос заранее и сразу, чтобы потом не писать кучу рассказов что и как я сделал до того как задал вопрос.
Имеется такой вопрос. Пытаюсь настроить nginx для работы с php-проектом, до этого работавшем на apache, в котором был такой конфиг (использовался .htaccess):

RewriteCond %{REQUEST_URI} !some_public
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule (.*)$ some_public/$1 [L]

Идея данного конфига бал в том, что файлы изначально искались в текущем (и глубже) каталоге (document_root), а затем в каталоге some_public (и глубже).
Сайтов с таким конфигом много, каталог some_public является симлинком на общийй каталог со скриптами php, реализующими основу движка всех сайтов.
Т.е. "по дефолту" сайты работают без единого файла в локальном каталоге, но если туда положить любой файл с таким именем как в каталоге some_public, то возьмется сначала он, позволяя таким образом плавно уходить от "скелета" сайта к все большей кастомизации.

Начиная с какого-то момента пришел к выводу что "скрипач не нужен" (в смысле апач) и решено было полностью перейти на nginx (который кстати используется сейчас в проекте в качестве фронта и кеша).
Для попытки (!) такого перехода был собран такой вот конфиг nginx-а:

server {
 listen        8.8.8.8:80;
 server_name    .example.com;
 root          /www/some/example.com/public;

 location / {
   index            /some_public/index.php;
   #index            /index.php;
   include         conf.d/php-fpm.inc;
   try_files        $uri $uri/ /some_public$document_uri =404;
 }

}

файл php-fpm.inc:

location ~* \.php$ {
 fastcgi_pass    unix:/var/run/php-fpm/php-fpm.sock;
 include         fastcgi_params;
 fastcgi_param   SCRIPT_FILENAME    $document_root$fastcgi_script_name;
 fastcgi_param   SCRIPT_NAME        $fastcgi_script_name;
 try_files        $uri $uri/ /some_public$document_uri =404;
}

И вроде бы навскидку оно даже заработало. Файлы отдаются как надо (и в нужной последовательности благодаря try_files), но возникла проблема с индексными index.php, лежащими в НЕкорневых папках (а они тоже нужны, причем в каждой папке - свои).
Т.е. index.php из корня хорошо проходит благодаря директиве "index  /some_public/index.php", если написать index.php, то не работает (404 на морде), все благодаря =404 в try_files, но там убирать =404 тоже нельзя, тогда .php начинает обрбатываться первым location и просто отдавается исходный код php-скриптов.
В общем такая каша получается как замок из спичек, одну задел - все посыпалось. Апачевские конфиги конечно же проще курить, но апач - это бронетанк, который тут не вписывается по своей монструозности.

Может быть тут есть гуру конфигов нгинкса? Посоветуйте как решить вышеописанную задачу. На крайний случай, пошлите меня в мануалы (только не в доку по нгинксу, я ее прочитал, легче не стало :) ).
Читал некоторые статьи (хабр и пр.), очень много хороших статей и даже с примерами, но все они описывают немножко другие кейзы.
Проблема только в индекс файлах ?
источник

MT

M T in nginx_ru
Взять готовый конфиг для ларавель и все заведется
источник

k

kiosaku in nginx_ru
проект на каком движке?
источник

k

kiosaku in nginx_ru
try_files $uri /index.php; обычно закрывает 99% потребностей
источник

JS

John Ship in nginx_ru
George Gaál
Проблема только в индекс файлах ?
самая главная - да. там есть еще вторая проблема, которую я для простоты даже не упоминал. там один из вложенных каталогов требует авторизации (с авторизацией я вроде как знаком, поэтому опустил этот вопрос)
источник

JS

John Ship in nginx_ru
kiosaku
проект на каком движке?
на собственном.
источник

JS

John Ship in nginx_ru
kiosaku
try_files $uri /index.php; обычно закрывает 99% потребностей
дык и у меня закрыл 99%, не хватает 1% :)
источник

GG

George Gaál in nginx_ru
kiosaku
try_files $uri /index.php; обычно закрывает 99% потребностей
Это не то кмк
источник

JS

John Ship in nginx_ru
так то сайт работает. просто есть один подкаталог, в котором есть Index.php
на апаче все работало при указании domain.com/subdir/
на нгинксе (при вышеуказанном конфиге) работает только domain.com/subdir/index.php
domain.com/subdir/ выдает 404
источник

GG

George Gaál in nginx_ru
John Ship
так то сайт работает. просто есть один подкаталог, в котором есть Index.php
на апаче все работало при указании domain.com/subdir/
на нгинксе (при вышеуказанном конфиге) работает только domain.com/subdir/index.php
domain.com/subdir/ выдает 404
Я бы отдельное правило (локейшен) на все index.php написал с логикой: смотрим в текущем каталоге, потом в топ левел каталоге
источник

GG

George Gaál in nginx_ru
Но я не эксперт по энжинксу
источник

JS

John Ship in nginx_ru
и почему это происходит (404) я как раз понимаю. именно из-за =400 в директиве try_files. ибо $document_uri не содержит в данном случае имени index.php и try_files "доходит" до 404. если же index.php указать явно, то try_files его успешно отдает
источник

JS

John Ship in nginx_ru
George Gaál
Я бы отдельное правило (локейшен) на все index.php написал с логикой: смотрим в текущем каталоге, потом в топ левел каталоге
я уже думал на эту тему, но почитав статьи в стиле nginx+if = evil, я не хотел бы "писать программы" на конфиге нгинкса. это даст ненужный оверхед. на апаче это решалось в 4 строчки конфига. я уверен что в нгиксе тоже все решается. просто сама логика конфигов нгинкса очень закручена. но если ее знать, то наверняка все вопросы решаются легко.
источник

GG

George Gaál in nginx_ru
John Ship
я уже думал на эту тему, но почитав статьи в стиле nginx+if = evil, я не хотел бы "писать программы" на конфиге нгинкса. это даст ненужный оверхед. на апаче это решалось в 4 строчки конфига. я уверен что в нгиксе тоже все решается. просто сама логика конфигов нгинкса очень закручена. но если ее знать, то наверняка все вопросы решаются легко.
Ты уже написал "программу", задействовав регексп в локейшене
источник

GG

George Gaál in nginx_ru
Делай так, как тебе будет удобно и понятно
источник

JS

John Ship in nginx_ru
George Gaál
Ты уже написал "программу", задействовав регексп в локейшене
"умные" люди (это я по инету смотрел статьи) пишут что регксп быстрее if
источник

GG

George Gaál in nginx_ru
John Ship
"умные" люди (это я по инету смотрел статьи) пишут что регксп быстрее if
Я вижу в этом смысл. Но у тебя роутинг внутри пыхыпы тупо медленнее будет, так что разговор в пользу бедных
источник

VZ

Vladimir Zhurkin in nginx_ru
Сделай отдельный локейшен до ещё одного index.php
источник

JS

John Ship in nginx_ru
Vladimir Zhurkin
Сделай отдельный локейшен до ещё одного index.php
это как? в смысле локейшн для одного только файла, в подкаталоге?
источник