Чи варто використовувати CNAME для субдоменів?


84

Я керую декількома веб-сайтами, які наразі мають таку конфігурацію 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, тому це не проблема.


1
я відчуваю, що це має бути відповідь на вікі. DNS настільки важко отримати правильний і чи сприйнята ця відповідь ще 6 років пізніше?
the0ther

1
@ the0ther Так, навіть сьогодні підтверджена відповідь від Jesper Mortensen все ще справедлива (навіть якщо можна поспорити про називання речей або правильні значення TTL для використання, але це окремі пункти від питання використання записів CNAME чи ні ). DNS - це 30-старий протокол, тому основні речі, такі як записи CNAME, не змінюються з часом.
Патрік Мевзек

Відповіді:


85

Так, це належне використання 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

1
Дякую, нарешті, розумна думка щодо CNAME, викладена чітко і стисло.
Тайлер

@Jesper Mortensen: Чи можете ви, будь-ласка, оновити відповідь на невеликому прикладі, особливо я не зрозумів ваш 3-й пункт, коли ви говорите "Одиноке виключення до правил вище, корінь домену - A-Record", ви вже в першій точці сказано, що ви використовуєте одну запис A для кожного сервера фізичного рівня. (BTW посилання пішла)
Marco Demaio

2
@Marco Demaio: Про "A-Record кореня домену": Домен другого рівня, як апеляційна company.comзона. Для цього потрібен запис SOA. Таким чином, це повинен бути запис A, а не CNAME - див. Serverfault.com/questions/170194/…
Jesper Mortensen

4
@ не потрібно мати запис A; швидше, CNAME заборонено.
Майкл Хемптон

1
Просто хотілося б додати, що CNAME особливо корисні, якщо ваш сервер підтримує IPv6 адреси, оскільки вам потрібно буде принаймні дві записи на сервері (один запис A і AAAA кожен), тому використовуючи CNAME для субдоменів в цьому випадку набагато, набагато простіше. Якщо ви використовуєте рекомендації Jesper щодо TTL (або ваш постачальник DNS має хороший автоматичний поводження), реальна неустойка не повинна бути реальною.
Харавік

13

Так, це доречно.

Мої найкращі практики, якими ділиться багато людей, - це створити 1 запис для кожного 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

Я знаю, що в цьому запитанні вони сказали, що пошта тут не є проблемою, але припустимо, що ви також використовуєте пошту, як би ви йшли із записами MX? Дякую!
Марко Демайо

1
Запис MX також вказуватиме на ім’я сервера. IN MX server1і для зручності я б рекомендував також створення imapабо popі smtpCNAMEs, можливо , також mail, як і багато програм електронної пошти здогадуються це. Налаштування правильних записів SRV також є хорошою ідеєю, але, оскільки це відносно основне питання, записи SRV можуть бути трохи для простої конфігурації.
Chris S

1
Швидкий коментар, MXзаписи не повинні бути CNAME, див. Serverfault.com/a/232243/2874 Це, мабуть, добре працює на практиці - але все ж, краще цього не робити.
Jesper Mortensen

BIND відмовиться завантажувати зону, якщо ви вкажете запис MX або SRV на CNAME ... Можливо, я мав би дати зрозуміти, що запис MX повинен вказувати на запис A. Дякую.
Chris S

@ChrisS, як щодо редагування вашої відповіді та чіткого згадування того факту, що запис MX не може вказувати на запис CNAME?
Алексіс Вілке
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.