В настоящее время я пытаюсь разделить 3 приложения из одного репозитория на 3, но сохраняю структуру URL, поэтому разные приложения в основном должны доставлять разные местоположения в одном домене.
С чем я борюсь, так это с тем, что одно из приложений должно быть запасным вариантом для несуществующих URL-адресов, поэтому, если первое не соответствует, а второе нет, тогда третье должно обрабатывать запрос.
У меня есть структура:
/ etc / nginx / sites-enabled / main_site, здесь, кроме имени сервера и журналов include /etc/nginx/subsites-enabled/*
, где у меня есть 3 файла конфигурации, по одному для каждого приложения.
Каждый из 3 файлов конфигурации содержит блок местоположения.
Я попытался использовать regex с отрицательным прогнозом (в основном пытался жестко закодировать URL-адреса, которые обрабатывают другие приложения), но не получилось.
Итак, подведем итог:
/ и / сообщество должно быть доставлено с помощью /etc/nginx/subsites-enabled/example.org/home (несколько сценариев на Perl)
/ новости должны быть доставлены /etc/nginx/subsites-enabled/example.org/news (wordpress)
все остальное должно быть доставлено с помощью /etc/nginx/subsites-enabled/example.org/app (приложение для торта)
Бит perl работает отлично. У меня проблема в том, что приложение получает новости (возможно, потому что они совпадают. *), Я пробовал различные варианты (я занимался этим 2 дня), но ни одна из них не решила все проблемы (иногда статические активы не будут работать и т. д.).
Моя конфигурация:
/etc/nginx/sites-enabled/example.org:
server {
listen 80;
server_name example.org;
error_log /var/log/nginx/example.org.log;
include /etc/nginx/subsites-enabled/example.org/*;
}
/etc/nginx/subsites-enabled/example.org/home:
location = / {
rewrite ^.*$ /index.pl last;
}
location ~* /community(.*) {
rewrite ^.*$ /index.pl last;
}
location ~ \.pl {
root /var/www/vhosts/home;
access_log /var/log/nginx/home/access.log;
error_log /var/log/nginx/home/error.log;
include /etc/nginx/fastcgi_params;
fastcgi_index index.pl;
fastcgi_param SCRIPT_FILENAME /var/www/vhosts/home$fastcgi_script_name;
fastcgi_pass unix:/var/run/fcgiwrap.socket;
}
/ И т.д. / ngins / подсайты с поддержкой / Новости
location /news {
access_log /var/log/nginx/news/access.log;
error_log /var/log/nginx/news/error.log debug;
error_page 404 = /news/index.php;
root /var/www/vhosts/news;
index index.php;
if (!-e $request_filename) {
rewrite ^.*$ /index.php last;
}
location ~ \.php {
include /etc/nginx/fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/vhosts/news$fastcgi_script_name;
}
}
/ И т.д. / Nginx / подсайты с поддержкой / приложение:
location ~ .* {
access_log /var/log/nginx/app/access.log;
error_log /var/log/nginx/app/error.log;
rewrite_log on;
index index.php;
root /var/www/vhosts/app/app/webroot;
if (-f $request_filename) {
expires 30d;
break;
}
if (!-e $request_filename) {
rewrite ^.*$ /index.php last;
}
location ~ \.php {
include /etc/nginx/fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/vhosts/app/app/webroot$fastcgi_script_name;
}
}
@
префикс), который отображается в ваше приложение по умолчанию. Вы также можете настроить страницу error_, которая отображает 404 на указанное местоположение.location ^~ /news
. б) для вашего блока приложения вы должны быть в состоянии сделатьlocation /
это (это не то же самоеlocation = /
, но должно соответствовать всему, что еще не сопоставлено. в) в некоторых случаях (особенно регулярные выражения) порядок имеет значение - вы можете захотеть объединить 3 файлы в один файл с блоками в правильном порядке. Также используйте try_files вместо!-e
. Наконец, смотрите wiki.nginx.org/HttpCoreModule#location .Ответы:
Есть несколько вещей, которые не так с вашей конфигурации, две соответствующие:
Например, возьмите URL example.org/news/test.htm
location /news
Блок будет соответствовать его/news/test.htm
- он не меняется, только потому, что он находится в блоке местоположения/var/www/vhosts/news/news/test.htm
if (!-e $request_filename)
заявление должно захватить этот несуществующий файл/index.php
last
процессы начинается снова (выход из блока местоположения)/index.php
сейчас захваченlocation /app block
.Упомянутая выше проблема с корневой директивой усугубляется, когда вы переходите в блок местоположения вашего приложения. В отличие от блока «новости», где вы могли бы просто удалить «новости» из пути (так как он будет добавлен обратно), вы не можете сделать это для пути приложения, который заканчивается «webroot».
Решение лежит в
alias
директиве. Это не меняет document_root, но меняет путь к файлу, который используется для обслуживания запроса. К сожалению,rewrite
иtry_files
склонны вести себя немного неожиданноalias
.Давайте начнем с простого примера - без PHP - только HTML и вашего блока Perl - но со структурой папок, соответствующей вашей (проверено на Nginx 1.0.12, CentOS 6):
location = /
- будет соответствовать только корневому путиlocation ^~ /community
- будет соответствовать каждому пути, начиная с / сообществаlocation ~ \.pl
- будет соответствовать всем файлам, которые содержат .pllocation ^~ /news
- будет соответствовать каждому пути, начиная с / новостиlocation ^~ /app
- будет соответствовать каждому пути, начинающемуся с / applocation /
- будет соответствовать всем путям, не сопоставленным вышеВы должны быть в состоянии удалить
^~
- но это может предложить небольшое улучшение производительности, так как он прекращает поиск, как только найдено совпадение.Несмотря на то, что добавление блоков PHP должно быть простым делом, к сожалению, есть небольшая сложность -
try_files
(и ваше переписывание) не в конечном итоге передать желаемый путь к вложенному блоку местоположения - и использовать,alias
когда только расширение является указанный в блоке местоположения не работает.Одним из решений является использование отдельных блоков местоположения, которые выполняют захват вместе с директивой псевдонима - это не совсем элегантно, но, насколько я могу судить, оно работает (опять же, протестировано на Nginx 1.0.12, CentOS 6 - из Конечно, я не настраивал CakePHP, Wordpress и Perl - я просто использовал пару файлов PHP и HTML в каждой папке)
Приведенный выше конфиг, берет простой выше и делает два изменения:
location ~* ^/news/(.*\.php)$
- будет соответствовать всем файлам, заканчивающимся на .php, с путями, начинающимися с / news /location ~* ^/app/(.*\.php)$
- будет соответствовать всем файлам, заканчивающимся на .php, с путями, начинающимися с / app /^~
сопоставление - это необходимо для того, чтобы два добавленных блока местоположения могли сопоставляться с путями (в противном случае сопоставление остановится на блоках / news или / app).Следует отметить, что порядок сопоставления местоположений здесь очень важен:
=
)^~
вторымСоответствующее регулярное выражение заменит прямую строку!
Важным моментом является то, что при использовании перехватов с псевдонимом заменяется весь URL-адрес, а не только ведущая папка. К сожалению, это означает, что
$fastcgi_script_name
оставлено пустым, поэтому я использовал$1
выше.Я уверен, что вам нужно будет сделать несколько изменений, но основная предпосылка должна быть функциональной. Вы должны иметь возможность разделять блоки на несколько файлов по мере необходимости - порядок не должен влиять на конфигурацию.
источник