Большинство веб-разработчиков знакомы с процессом редактирования файла /etc/hosts
для того, чтобы направить трафик по адресу coolproject.dev на 127.0.0.1. Многие также хорошо знают сложности данного подхода: необходимость изменять настройки каждый раз при добавлении или удалении проекта и необходимость доступа с правами администратора для каждого изменения.
Установка локального DNS
-сервера, такого как Dnsmasq, и настройка системы так, чтобы она использовала этот сервер избавляет от этих сложностей.
Далее в статье:
- установка
Dnsmasq
вOS X
; - настройка
Dnsmasq
так, чтобы он на все запросы адресов в доменной зоне .dev отвечал 127.0.0.1; - настройка
OS X
для отправки всех запросов .dev вDnsmasq
;
ВАЖНО: инструкция ниже предполагает установку нового системного ПО и изменение настроек операционной системы — не делайте того, что не понимаете или не можете отменить изменения!
Установка Dnsmasq
Dnsmasq — лекговесный, простой в настройке сервер DNS и DHCP [...] ориентированный на домашние сети.
Цитата с сайта проекта
Dnsmasq
:
Есть много способов установить Dnsmasq
, но мой любимый (на OS X
) — это установка при помощи менеджера пакетов Homebrew. Установка самого Homebrew
очень проста, но выходит за пределы этой статьи.
Имея установленный Homebrew
, установить с его помощью Dnsmasq
очень просто:
Обновляем
Homebrew
:brew up
Устанавливаем
Dnsmasq
:brew install dnsmasq
Процесс установки покажет несколько команд, с помощью которых можно настроить автозапуск Dnsmasq
c настройками по-умолчнию. Я предпочитаю команды, представленные ниже, но это не мешает использовать другие варианты:
Копируем конфигурационный файл по-умолчанию:
cp $(brew list dnsmasq | grep /dnsmasq.conf.example$) /usr/local/etc/dnsmasq.conf
Копируем файл настроек демона в соответствующий каталог:
sudo cp $(brew list dnsmasq | grep /homebrew.mxcl.dnsmasq.plist$) /Library/LaunchDaemons/
Включаем автозапуск
Dnsmasq
:sudo launchctl load /Library/LaunchDaemons/homebrew.mxcl.dnsmasq.plist
Настройка Dnsmasq
После установки и запуска Dnsmasq
самое время настроить его!
Конфигурационный файл по-умолчанию — /usr/local/etc/dnsmasq.conf, открываем его в любимом редакторе
Среди множества вещей, которые может делать Dnsmasq
, есть сравнение DNS
-запросов с базой паттернов и использование его для формирования корректного ответа. Я использую этот функционал для обработки всех запросов, которые оканчиваются на .dev, чтобы ответ сервера в данном случае всегда был один: 127.0.0.1. Строка в файле конфигурации, описывающая это крайне проста:
address=/dev/127.0.0.1
Добавляем её в файл /usr/local/etc/dnsmasq.conf и сохраняем файл.
После этого необходим перезапустить Dnsmasq
, чтобы это сделать надо выполнить две команды launchd
:
sudo launchctl stop homebrew.mxcl.dnsmasq
sudo launchctl start homebrew.mxcl.dnsmasq
Можно протестировать работу Dnsmasq
, послав запрос при помощи команды dig
. Указываем доменное имя, заканчивающееся на .dev и с помощью dig запрашиваем наш новый DNS
-сервер:
dig testing.testing.one.two.three.dev @127.0.0.1
Ответ должен выглядеть примерно так:
;; ANSWER SECTION:
testing.testing.one.two.three.dev. 0 IN A 127.0.0.1
Настройка OS X
Теперь, имея работающий DNS
-сервер, необходимо настроить операционную систему на его использование. Есть два пути использования сервера:
- посылать все
DNS
-запросы вDnsmasq
; - посылать только запросы, оканчивающиеся на .dev.
Первый вариант проще — надо всего-лишь поменять настройки DNS
в Системных настройках, но этот вариант, возможно, не будет правильно работать без дополнительной настройки самого Dnsmasq.
Второй слегка сложнее, но не намного. Многие UNIX
-подобные операционные системы имеют конфигурационный файл /etc/resolv.conf, который управляет формированием DNS
-запросов, включая выбор сервера DNS по-умолчанию для обработки запросов (эта настройка может настраиваться автоматически, когда Вы подключаетесь к сети или меняете DNS
-сервер/ы в Системных настройках).
OS X
также позволяет настраивать дополнительные резолверы (настройки выбора DNS
-серверов) при помощи создания файлов в каталоге /etc/resolver/. Этот каталог может не существовать в системе, поэтому прежде всего необходимо его создать:
sudo mkdir -p /etc/resolver
Теперь необходимо создать новый файл в этом каталоге для каждого резолвера, который вы хотите настроить. Каждый резолвер соответствует (исключительно в нашем случае) домену верхнего уровня, такому, как dev. Есть ряд деталей, которые можно настраивать для каждого резолвера, но я, как правило, ограничиваюсь двумя:
- имя резолвера (что соответствует определяемому доменному имени);
DNS
-сервер, который будет для этого использоваться.
Полная информация об этих файлах доступна на man-странице resolver:
man 5 resolver
Создаем новый файл с названием домена верхнего уровня (.dev) в каталоге /etc/resolver/ и добавляем в него сервер `DNS при помощи следующих команд:
sudo tee /etc/resolver/dev >/dev/null <<EOF
nameserver 127.0.0.1
EOF
Теперь на запросы, относящиеся к доменной зоне .dev будут обрабатываться нашим Dnsmasq, находящимся на адресе 127.0.0.1.
После создания этого файла OS X
автоматически прочитает его и применит настройки.
Тестирование
Тестирование новой конфигурации просто: при помощи ping
надо проверить как резолвятся DNS
имена домена .dev.
Проверяем, что DNS
работает:
ping -c 1 www.google.com
Результат должен быть примерно таким:
PING www.google.com (77.37.250.227): 56 data bytes
64 bytes from 77.37.250.227: icmp_seq=0 ttl=58 time=4.395 ms
--- www.google.com ping statistics ---
1 packets transmitted, 1 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 4.395/4.395/4.395/0.000 ms
Проверяем, что имена .dev name работают:
ping -c 1 this.is.a.test.dev
ping -c 1 iam.the.walrus.dev
Результат выполнения команды должен выглядеть примерно так:
PING iam.the.walrus.dev (127.0.0.1): 56 data bytes
64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.031 ms
--- iam.the.walrus.dev ping statistics ---
1 packets transmitted, 1 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 0.031/0.031/0.031/0.000 ms
Теперь можно спокойно использовать новые DNS
имена в .dev при любой необходимости ничего не настраивая и не меняя. Congratulations!