Вопрос: Должен ли CNAME использоваться для субдоменов?


Я управляю несколькими веб-сайтами, которые в настоящее время имеют следующую конфигурацию DNS:

example.com      - A Record - Production Server IP
test.example.com - A Record - Test Server IP
www.example.com  - CNAME    - example.com
beta.example.com - CNAME    - test.example.com
dev.example.com  - CNAME    - test.example.com

Является ли это подходящим использованием записей CNAME? Я посмотрел онлайн и не нашел четкого ответа. Некоторые люди утверждают, что записи CNAME плохи (они, однако, не ясно, почему это так) и предлагают следующую настройку:

example.com      - A Record - Production Server IP
test.example.com - A Record - Test Server IP
www.example.com  - A Record - Production Server IP
beta.example.com - A Record - Test Server IP
dev.example.com  - A Record - Test Server IP

Какой из них - лучший подход (и почему)?

Заметка: Субдомены не требуют собственных записей MX, так что это не проблема.


73
2017-09-16 17:55


Источник


Я чувствую, что это должен быть ответ на wiki. DNS настолько трудно получить право, и этот принятый ответ по-прежнему хорош через 6 лет? - the0ther
@ thepother Да, даже сегодня подтвержденный ответ, от Йеспер Мортенсен, по-прежнему остается в силе (даже если можно спорить об именах вещей или правильных значениях TTL для использования, но это отдельные точки из вопроса об использовании записей CNAME или нет). DNS - это 30-летний протокол, поэтому основные вещи, такие как записи CNAME, со временем не меняются. - Patrick Mevzek


Ответы:


Да, это подходящее использование CNAME. В дискуссиях, в которых я участвовал, аргументы имеют тенденцию идти так:

Против CNAME:

  • Существует (крошечное) ограничение производительности, так как тайники DNS по нисходящей линии должны выполнять 2 поиска DNS, один для CNAME и один для A-Record, на который указывает CNAME.
  • Смутные, фиктивные аргументы в отношении CNAME, имеющих меньше полномочий или проблем совместимости.

В пользу CNAME:

  • Они обеспечивают чистую абстракцию между аппаратными средствами (физическими серверами) и службами.
  • Они упрощают управление DNS - когда сервер перемещается, вам нужно только изменить одну запись.

Попробовав пару разных способов для этого у меня теперь есть личный любимый стиль. Это:

  • Одна запись A для каждого физического сервера; с довольно низким TTL (возможно, 30 минут); давая серверу удобное для человека имя,
  • Один CNAME для каждой службы; с высокой TTL (возможно, 24 часа); указывая на указанные выше имена серверов.
  • В качестве единственного решения вышеприведенных правил корень домена является A-Record, указывая на балансировщик веб-сервера / сети. (@ Должен быть A-записью.)

Я считаю, что эта настройка работает хорошо. Он сохраняет дополнительные DNS-запросы для CNAMES; и если сбой сервера, я все равно могу изменить общедоступный DNS довольно быстро.

Вот пример (импровизированный) в синтаксисе BIND:

;name     ttl   class rr     value 
server01  30m   IN    A      192.168.0.3
server02  30m   IN    A      192.168.0.4

webmail   24h   IN    CNAME  server01
extranet  24h   IN    CNAME  server02
ftp       24h   IN    CNAME  server02

76
2017-09-16 19:45



Спасибо, наконец, разумное мнение о CNAME, которое изложено четко и кратко. - Tyler
@Jesper Mortensen: не могли бы вы немного обновить ответ небольшим примером, особенно я не понял ваш третий пункт, когда вы говорите: «Как единственное исключение из правил выше, корень домена - это A-Record», вы уже сказал в 1-м пункте, что вы используете одну запись A для каждого сервера физического уровня. (Кстати, ссылки ушли) - Marco Demaio
@Marco Demaio: О «корневой A-Record домена»: домен второго уровня, такой как company.comявляется вершиной зоны. Он нуждается в записи SOA. Таким образом, это должна быть запись A, а не CNAME - см. serverfault.com/questions/170194/... - Jesper Mortensen
@ не требуется иметь запись A; скорее, CNAME запрещен. - Michael Hampton♦
Просто хотелось добавить, что CNAMEs особенно полезны, если ваши серверы также поддерживают адреса IPv6, так как вам понадобится как минимум две записи на сервер (одна запись A и AAAA), поэтому использование CNAME для поддоменов в этом случае намного, намного проще. Если вы используете рекомендации Jesper для TTL (или ваш провайдер DNS имеет хорошую автоматическую обработку), то не должно быть реального штрафа за производительность. - Haravikk


Да, это уместно.

Моя лучшая практика, которую многие люди разделяют, заключается в создании 1 A записи для каждого IP-сервера; и используйте CNAMES для чего-либо еще.

Общим примером может служить:

server1.example.com.      IN A      192.168.0.1
server2.example.com.      IN A      192.168.5.2
www                       IN CNAME  server1
ftp                       IN CNAME  server1
beta                      IN CNAME  server2

12
2017-09-16 18:03



Я знаю, что в этом вопросе они сказали, что почта здесь не проблема, но давайте предположим, что вы также используете почту, как бы вы пошли с MX-записями? Благодаря! - Marco Demaio
Запись MX также укажет на имя сервера. IN MX server1 и для удобства я бы рекомендовал также настроить imap или pop а также smtp CNAME, возможно, также mail, так как многие программы электронной почты угадывают это. Настройка правильных записей SRV также является хорошей идеей, но поскольку это относительно простой вопрос, записи SRV могут быть немного важны для простой конфигурации. - Chris S
Быстрый комментарий, MXзаписи не должны быть CNAME, см. serverfault.com/a/232243/2874  Вероятно, на практике это прекрасно работает - но все же лучше не делать этого. - Jesper Mortensen
BIND откажется загружать зону, если вы укажете запись MX или SRV в CNAME ... Возможно, я должен был четко указать, что запись MX должна указывать на запись A. Спасибо. - Chris S
@ChrisS, как насчет редактирования вашего ответа и явного упоминания о том, что запись MX не может указывать на запись CNAME? - Alexis Wilke