alhames.ru
Друзья, может здесь найдутся люди, которые могут помочь хотябы в части вопросов.
Настраиваю nginx, возникла куча вопросов, ответы на которые что-то не особо удается нагуглить.
1) Директива include - какие пути она понимает? Абсолютный путь понимает - это понятно, а как быть с относительными?
Если nginx.conf расположен в папке /etc/nginx, то эта папка и будет корневой для всех относительных путей и изменить ее никак нельзя?
2) Обязательные параметры для server - насколько я понимаю необходимо указать listen и server_name? Но столкнулся с тем что у меня сервер отказался запускаться без access_log и error_log. Не понимаю в чем их необходимость, если сразу после server_name у меня стоял rewrite.
3) Задание правил для location и вообще логика и последовательность обработки меня немного вводит в ступор. С апачем как-то проще было.
читать дальше
4) Как лучше редиректить с субдоменов?
читать дальше
5) Как перенаправлять все запросы, не начинающиеся со /static/ и не соответствующие реальному файлу (типа robots.txt) на index.php?
читать дальше
6) Директива fastcgi_pass - в чем отличие указания стандартного localhost:9000 и unix:/tmp/fastcgi.socket? Насколько оправдано создавать upstream, если в принципе все обрабатывает только один сервер?
Настраиваю nginx, возникла куча вопросов, ответы на которые что-то не особо удается нагуглить.
1) Директива include - какие пути она понимает? Абсолютный путь понимает - это понятно, а как быть с относительными?
Если nginx.conf расположен в папке /etc/nginx, то эта папка и будет корневой для всех относительных путей и изменить ее никак нельзя?
2) Обязательные параметры для server - насколько я понимаю необходимо указать listen и server_name? Но столкнулся с тем что у меня сервер отказался запускаться без access_log и error_log. Не понимаю в чем их необходимость, если сразу после server_name у меня стоял rewrite.
3) Задание правил для location и вообще логика и последовательность обработки меня немного вводит в ступор. С апачем как-то проще было.
читать дальше
4) Как лучше редиректить с субдоменов?
читать дальше
5) Как перенаправлять все запросы, не начинающиеся со /static/ и не соответствующие реальному файлу (типа robots.txt) на index.php?
читать дальше
6) Директива fastcgi_pass - в чем отличие указания стандартного localhost:9000 и unix:/tmp/fastcgi.socket? Насколько оправдано создавать upstream, если в принципе все обрабатывает только один сервер?
1) Как следует из примера в ссылке, include относительные пути понимает. Папка /etc/nginx будет в указанном случае являться не корневой, а рабочей и пути можно указывать относительно неё как вниз, так и вверх при помощи нужного количества "..\". Судя по описанию, сменить рабочий каталог процесса можно директивой working_directory
2) У меня сложилось впечатление, что самой необходимой директивой является listen; server_name служит лишь для различения запросов, пришедших на один и тот же порт с указанием разных адресов.
Что nginx не хочет запускаться без указания логов - это очень странно. Какую именно ошибку он выводит? Возможно используются стандартные/унаследованные пути, к которым нет доступа?
С другой стороны, логи - дело полезное, и причин не добавить данные директивы не вижу. rewrite мне кажется тут должен быть не при чём, как он может влиять?
3) Приведённые примеры выглядят вполне соответствующими документации:
location = /img/ — при помощи "=" задаётся точное соответствие url
location ~ /img/ — поиск по регулярному выражению с учётом регистра
location ~* /img/ — поиск по регулярному выражению без учёта регистра
location /img/ — поиск по префиксу
location ~ ^/img/ — поиск по регулярному выражению (с учётом регистра), в котором якорем "^" указано, что /img/ должно стоять в начале строки
location ^~ /img/ — поиск по префиксу, модификатор “^~” указывает что при совпадении с данным префиксным location'ом проверять регулярные выражения не нужно.
Особенности break мне неизвестны, судя по описанию, прекращает выполнение всех последующих директив; для конфигурировании поиска по location выглядит не особо применимым.
4) «^» — Обозначение начала строки. Насколько понимаю, будет искать "любую строку, у которой есть начало". Регулярное выражение, кстати не полностью идентично второму примеру "^/(.*)$" (начало строки, слэш, любое количество любых символов, конец строки) — первое не обязательно должно начинаться со "/". Не знаю насколько это принципиально, возможно именно отсутствие и слэша и в RE и location'a с ним же приводит к тому, что первый пример работает не так, как второй?
5) Судя по назначению директивы try_files, для задачи "для несуществующих файлов вернуть index.php" она подходит больше, чем error_page (концептуально ведь index.php ни разу не страница с сообщением об ошибке?) Вариант с именованным location выглядит симпатичнее, но, видимо, это уже дело вкуса.
6) Если всё установлено на одной nix-машине — очевидно, разницы никакой. Но у нас, например, nginx стоит перед виндовым сервером с IIS, тут бы юниксовая нотация уже не сработала. В upstream'е при отсутствии группы серверов и балансировки нагрузки тоже особого смысла нет.
Я не пояснил в чем именно у меня сложности: дело в том что у меня есть nginx на vps (centos) и есть локальный сервер NIMPix (windows). Конфиги сайтов я вынес в отдельную папку, из которой создал репозиторий, чтобы как и скрипты сайтов nginx можно было бы перенастраивать через git. upstream, в частности, юзался просто как алиас для разных адресов, которые опеределены в nginx.conf вне репозитория.
Я так и не дошел до запуска конфигов на vps, т.к. 2 дня бодаюсь с локальным сервером - то ему относительные пути не нравились, то стал ругаться на отсутствие access_log (которая не определена в корневом конфиге, а попытка ее определить приводит к тому что nginx не запускается). И главная проблема - эта сволочь не показывает ошибки. Вообщем, сейчас займусь сборкой собственного локального сервера по кускам. Либо вообще виртуалку подниму...
сменить рабочий каталог процесса можно директивой working_directory
Да в том то и дело, что мне не сменить надо, а расширить, как в php include_path расширяется..
«^» — Обозначение начала строки.
А разве ^ и $ могут работать без дополнительных указаний? У любой не пустой строки есть начало, следовательно это идентично .+
И да, в nginx вроде нет RewriteBase, а значит все uri всегда начинаются с /
Судя по назначению директивы try_files, для задачи "для несуществующих файлов вернуть index.php" она подходит больше
Ну, концептуально то понятно - мне интересны именно различия обработки. Особенно как это отражается на больших нагрузках.
Спасибо за отзыв )
Хабр хабром, но едва ли с конкретной задачей помогут даже там — просто потому что удалённо понять, что должно быть и что идёт не так — нереально. Посоветовала бы начать с минимальной конфигурацией nginx и стандартным расположением файлов, чтобы хотя бы для начала убедиться, что сам NIMPix настроен и работает корректно, а потом уже постепенно накручивать функциональность.
сменить рабочий каталог процесса можно директивой working_directory
Да в том то и дело, что мне не сменить надо, а расширить, как в php include_path расширяется..
Думаю, в nginx так нельзя. Всё-таки указываемый ему путь, абсолютный или относительный, всё равно должен быть единственным и однозначным; проводить поиск как в php с include_path он не будет.
А разве ^ и $ могут работать без дополнительных указаний? У любой не пустой строки есть начало, следовательно это идентично .+
И да, в nginx вроде нет RewriteBase, а значит все uri всегда начинаются с /
Судя по тому, что используется — может
rewrite ^/(.*)$ example.com/$1 permanent;
(в первом случае для этого используется $request_uri)
Про RewriteBase не знаю, поэтому сказать ничего не могу.
Судя по назначению директивы try_files, для задачи "для несуществующих файлов вернуть index.php" она подходит больше
Ну, концептуально то понятно - мне интересны именно различия обработки. Особенно как это отражается на больших нагрузках.
В любом нормальном источнике, затрагивающем вопросы оптимизации, написано, что вначале следует получить рабочий вариант, удобный в сопровождении, и только потом, если выяснится, что он не удовлетворяет по параметру производительности, искать более быстрый.
Если назначение директивы error_page — задавать страницу с user-friendly сообщением об ошибке, то для других целей, имеющих свои средства, имхо, лучше использовать именно их.
NIMPix то работал, в дефолтной конфигурации - но меня то она не устраивает.. Так что будем мучиться)