Nginx + Symfony. Создаем виртуальные хосты автоматически

Давно использую symfony в роли фреймворка php. В роли веб сервера nginx + php-fpm, заметил что многие не используют замечательной вещи, которую умеет nginx.

Ниже описанный скрипт, подходит как раз для проектов написанных на symfony в принципе для любых проектов, но данный пример лично я использую для symfony. Создавать виртуальные хосты без рукаприкладства! ;)

Допустим у вас есть директория с проектами — /var/www/git/… Условие что директории проектов мы называемаем также как и хосты. Например /var/www/git/sait.ru. (если вы хотите что бы и www. работал, то достаточно просто сделать симлинк на данную папку (ln -s… )).
Итого: достаточно только создать хост в /etc/hosts и зарелодить nginx. Он сам подхватит проекты лежащие в вашей рабочей директории.

server {
listen 80;
root /var/www/git/$host/web; # ваша папка с сайтами
server_name _;
charset utf-8;

location / {
if (-f $request_filename) {
expires max;
break;
}
if ($request_filename !~ "\.(js|htc|ico|gif|jpg|png|css)$") {
rewrite ^(.*) /index.php last;
}
}

location ~ \.php$ {
set $script $uri;
set $path_info "";
if ($uri ~ "^(.+\.php)(/.+)") {
set $script $1;
set $path_info $2;
}
root /var/www/git/$host;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/git/$host/web$fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT /var/www/git/$host/web;
fastcgi_param PATH_INFO $path_info;
include /usr/local/nginx/conf/fastcgi_params;
}

location ~ /\.ht {
deny all;
}
}
+16
17 августа 2009, 01:22
83
N3mfis 6,0

комментарии (27)

0
SkyCat #
Пожалуйста, перенесите в блог Nginx, кармы вам теперь хватает. ))
+1
N3mfis #
благодарю ;)
0
kibizoidus #
Простите, уважаемый, вы предлагаете править конфиг nginx'a из symphony, запущеного под рутом? Я вас правильно понял?
0
dinamyte #
Разумеется, нет.
0
kibizoidus #
А можно тогда поподробнее — КАК?
+2
dinamyte #
Только с помощью собственных возможностей сервера Nginx. Он определяет текущий хост в переменной $host. Эта переменная подставляется в путь «root /var/www/git/$host/web». Дальше все интуитивно. Почитайте справочную информацию.

Если вас вводят в заблуждение переменные вида $name, то это собственные переменные сервера, а не переменные PHP.
0
kibizoidus #
Хм… До меня дошел сакральный смысл.

Слова «Ниже описанный скрипт» вводят в заблуждение. Или нужно больше спать и меньше работать? В любом случае это не скрипт.
+1
SMiX #
… ниже описанный конфиг. И это относится далеко не только к проектам на symphony
–1
dinamyte #
Может быть с натяжкой, но это действительно скрипт. Сам посудите: есть последовательность действий, установка переменных, даже ветвления есть (этакий гибрид конфигурационного файла и скрипта).
0
ExH #
А $host всегда без www?
0
SMiX #
$host — это хост, который находится в запросе. Если я обращусь по www.site.ru, то host будет www.site.ru
0
LDEV #
А хаки вида www.site.ru:80? Apache такое безобразие пропускает в эту директиву…
0
SMiX #
$server_port, эта переменная равна порту сервера, на который пришёл запрос;
$host, эта переменная равна строке «Host» в заголовке запроса или имени сервера, на который пришёл запрос, если этой строки нет;
$hostname, эта переменная равна имени хоста;

© sysoev.ru/nginx/docs/http/ngx_http_core_module.html
0
Tonik #
Спасибо больше — очень интересный пример!
Раз пошла такая пьянка, есть вопрос про конфиг nginx и переменные.

Есть модуль аплоуда файлов www.grid.net.ru/nginx/upload.ru.html
Модуль использует некую дерикторию для записи файлов www.grid.net.ru/nginx/upload.ru.html#upload_store

Есть сервер с N дисками. (в реале — несколько серверов с разным N)

Задача: для снижения нагрузки на диски заставить nginx равномерно расппределять файлы по разным дискам. То есть сделать чтото типа

upload_store /disk_$disknumber/tmp_files/

где $disknumber это случайная цифра от 1 до N

Можно ли как то извернуться в nginx с переменными конфига что бы она генерилась случайно или вычислялась как хитрый хэш от входных данных?

PS: Да я знаю что www.grid.net.ru/nginx/upload.ru.html#upload_store позволяет задавать уровни папок по которым будут разбиваться файлы. То есть можно настроить
путь вида

/storage/tmp_files/[A]/[B]/tmpfile.001

где A,B будут произвольно менять от 1 до 10

и поиграться симлинками на разные разделы, но проблема в том, что если 10 будет не кратно числу дисков (скажем 4), nj какие то диски будут использоваться больше чем другие.

1 — disk1
2 — disk2
3 — disk3
4 — disk4
5 — disk1
6 — disk2
7 — disk3
8 — disk4
9 — disk1
10 — disk2

Диски 1 и 2 будут нагруженные больше чем 3 и 4
0
alexkbs #
Например, можно сделать RAID0 из всех дисков.
НЛО прилетело и опубликовало эту надпись здесь
0
flyaway #
Круто, да
Надо бы только разорбаться с www и другими префиксами
Например, так:

if ( $host ~ ^.+\.([\w-]+)\.(\w+)$ ) {
set $mypath "$1.$2";
}
root /var/www/git/$mypath;


Или же с помощью sysoev.ru/nginx/docs/http/ngx_http_map_module.html:

map $http_host $mypath {
hostnames;
default host.com;

.example.com example.com;
.example.ru example.com;
.host.com host.com;
.site.pp.ru host.com;
}
root /var/www/git/$mypath;


НЛО прилетело и опубликовало эту надпись здесь
–4
N3mfis #
В принципе вы правы, т.к. данный скрипт подходит для многих другиз php движков.
+1
everzet #
Для многих других не только php и не только движков =)
НЛО прилетело и опубликовало эту надпись здесь
+1
zhekanax #
Мда. Увидев слово symfony незадумываясь открыл топик.
Ожидал твики или еще что-нибудь невероятно полезно, а увидел… :)
0
Serafim #
> fastcgi_pass 127.0.0.1:9000;
лучше все же использовать unix-socket (fastcgi_pass unix:/tmp/fastcgi.sock)
0
kenoko #
Проклятие! Это самое чудесное что я видел за сегодня.
0
patt #
прикольно, спасибо, уже опробовал, кстати если есть хосты, кот. не соответствуют /var/www/git/$host/web их можно прописывать отдельно и всё будет работать :)
0
smok #
чтобы не было проблем с «www.» я делаю так:

set $p $host;
if $host ~* ^www\.(.*) {
set $p $1;
}

и дальше пользуюсь переменной $p.
0
smok #
С таким конфигом у меня в пехепешке пропала переменная $PHP_SELF, со всеми вытекающими (в том числе, перестали работать ссылки в сгенерированном фреймворком бекенде). Более правильный конфиг описан тут: kbeezie.com/view/php-self-path-nginx/

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.