Debian.pro

Блог для пользователей и администраторов Debian


Nginx. Аналог mod_evhost из lighttpd. Используем hostname из заголовка запроса, как переменную. Catch all hosts и братия.

Собственно, я никуда не пропал. Просто задачи у меня из «объяснить новичкам что-нибудь на работе» перешли в «сделать что-нибудь странное, узнав как это делать у других».

На днях у меня всплыла интересная задача. Нужно было организовать пользователям в их домашних каталогах возможность раздавать сайты по доменам вида $username.user.domain.tld.
Первое и очевидное применение этого мануала — раздача статики из домашних каталогов пользователей с доменов 3-4го уровня, первой частью которого является пресловутый $username.
Гуру смогут прикрутить к этому мануалу php-fpm или fcgi и радоваться тому, как легко и просто им добавлять сайты обычным mkdir =) Это уже факультатив.
Вообще этот момент рассматривается в мануалах nginx, но как то бегло и его сложно найти. По крайней мере, мне с наскока не удалось.

Собственно, нам нужен nginx версии 0.8+. Если не ошибаюсь, то фича появилась в 0.7.54, я вам указал с запасом. В целом — неважно как настроенный.
Создаём файлик, в котором мы будем свои правила:
root@nginx-host:~# touch /etc/nginx/sites-available/00-catcher.conf
Создадим симлинк:
root@nginx-host:~# ln -s /etc/nginx/sites-available/00-catcher.conf /etc/nginx/sites-enabled/00-catcher.conf
Приступим к редактированию файла 00-catcher.conf. В нём в итоге у нас должно получиться следующее:
server {
listen 80;
server_name ~^(?<username>[a-z0-9\-]+)\.domain\.ru;
index index.html;
root /home/$username/www;
}
# прикрутим так же домены вида $project.$username.domain.tld
server {
listen 80;
server_name ~^(?<project>[a-z0-9\-]+)\.(?<username>[a-z0-9\-]+)\.domain\.ru;
index index.html;
root /home/$username/www/$project;
}

Немного комментариев:
~^(?<username>[a-z0-9\-]+)\.domain\.ru; — здесь мы говорим о том, что все символы a-z, 0-9 и «-» до .domain.ru в заголовке host пришедшего http запроса становятся переменной $username.
root /home/$username/www; — здесь мы используем эту переменную.
server_name ~^(?<project>[a-z0-9\-]+)\.(?<username>[a-z0-9\-]+)\.domain\.ru; — аналогично прошлому примеру, но мы разделили точкой переменные $project и $username, состоящие из a-z, 0-9 и «-».

Эти переменные можно использовать потом почти в любой директиве. В пути к SSL сертификату (/var/www/certs/$project.$username.crt ?), в параметрах к proxy_pass, к адресу логов и прочему.
Вы можете попытаться использовать такую конструкцию:
server_name ~^(?<subdomain>[a-z0-9\-]+)\.(?<domain>[a-z0-9\-]+)\.(?<tld>[a-z0-9\-]+);
Так можно будет складывать все файлики в /var/www/$subdomain.$domain.$tld и радоваться жизни.

В общем жду историй о применении этой интересной фичи. Ах да. Только что мы организовали mod_evhost из лайти.


Комментариев пока нет.

Написать комментарий