Теперь мы знаем, что из себя представляет статический сайт, то есть такой сайт, который построен только с применением HTML и CSS. Пришла пора разобраться с тем, как сделать его доступным в интернете.
Интернет — это глобальная сеть, объединяющая огромное число устройств. К устройствам относятся далеко не только стационарные компьютеры и ноутбуки, но также и мобильные устройства, камеры, различные электронные и бытовые приборы. Хотя все эти устройства совершенно разные, они без проблем общаются друг с другом с помощью единого языка. Таким языком в мире машин стал стек протоколов#TCP/IP. Не вдаваясь в детали, скажем, что протокол — это правила, по которым происходит общение. При этом природа общающихся устройств не важна.
Главным элементом в TCP/IP является#IP-адрес. В версии#IPv4 он выглядит так: 10.123.23.1. Четыре числа, разделенные точкой. У всех устройств, подключенных к сети напрямую, этот адрес уникальный. Фактически, любой запрос в интернете всегда обращен к какому-то ip адресу, даже если вы этого не видите.
Современный мир помешался на Internet of Things (IoT). Статистика говорит о том, что количество устройств, подключенных к сети, превысило число персональных компьютеров, также подключенных к интернету.
Среди компьютеров, подключенных к интернету, выделяется класс машин, которые выполняют роль#сервер. Эти серверы, как правило, располагаются у#хостер, и именно они обслуживают многочисленные интернет сайты.
#Хостер — это компания, предоставляющая услугу, называемую хостинг, то есть ресурсы для размещения и обслуживания сайта в интернете. Хостинг бывает очень разным, начиная от уже полностью готовой среды, в которую заливается код сайта, до железных серверов, которыми можно и нужно управлять самостоятельно. Работает это обычно так: после регистрации на сайте хостера выбирается тариф, привязывается банковская карточка, и с вас списывается ежемесячная плата за обслуживание и дополнительные услуги. Взамен вы получаете доступ к вашим ресурсам, например, IP-адрес и пару логин/пароль для ssh- или ftp-доступа.
Важно понимать, что обычный хостинг (говорят, “shared”) подходит не всем и не всегда. С одной стороны, он дёшев и не требует настройки, с другой - очень ограничен в ресурсах и возможностях, в том числе по конфигурации. Серьезные решения все же располагаются на виртуальных или железных серверах, предоставляемых теми же хостерами. Для самых сложных систем строят свои собственные дата-центры, к таким можно отнести Google или Facebook.
Важно, что shared хостинг, как правило, поддерживает очень ограниченный набор языков, чаще всего это#PHP. Поэтому программисты вне PHP мира почти всегда предпочитают виртуальные сервера (#VPS ).
Если вам интересна эта тема, не забудьте посмотреть#PaaS(платформа как сервис) и#IaaS (инфраструктура как сервис) решения.
Рассмотрим последний элемент в нашей системе —#domain. Откуда берется доменное имя, и как оно связано с местом, где расположен сайт?
Когда интернет только зарождался, у сайтов не было доменных имен. Для обращения к сайту использовались прямые IP-адреса машин (серверов), например, 10.132.234.4 (вместо понятного hexlet.io). Довольно быстро стало понятно, что это слишком сложно для запоминания. К тому же адреса могли меняться. Нужно было что-то вроде записной книжки для адресов.
Первым решением стал специальный файл hosts, расположенный на каждой машине, с которой происходил доступ к сайтам. Он содержит сопоставление между ip-адресом и именем, удобным для запоминания. Этот файлик существует до сих пор и часто используется программистами во время разработки. Формат файла:
# Формат файла: <ip-адрес> <имена сайта>
123.12.43.12 hexlet.io
172.10.11.200 facebook.com m.facebook.comКогда происходит запрос по адресу, например, hexlet.io, то сначала проверяется файл hosts, и если домен найден (как в примере выше), то браузер устанавливает соединение с сервером. В нашем примере он пойдет по адресу 123.12.43.12.
Довольно быстро стало понятно, что такой подход очень неэффективен. В каждой подсети использовался собственный файлик hosts, который рассылался на все компьютеры, входящие в подсеть. Кроме того, если появляется новый сайт, то всех нужно оповестить. Да и самих сайтов становилось слишком много. Для решения этих проблем создали Domain Name System (#DNS ). Основное предназначение этой системы заключается в сопоставлении имени домена конкретному IP-адресу, на котором находится сайт. Другими словами, любой сервис может обратиться к DNS и спросить «какой адрес у хоста hexlet.io?».
# Пример обращения к DNS с помощью утилиты host
host facebook.com
facebook.com has address 31.13.72.36
facebook.com has IPv6 address 2a03:2880:f10a:83:face:b00c::25de
facebook.com mail is handled by 10 msgin.vvv.facebook.com.Важно понимать, что#DNS - это именно служба, а не конкретный сервер. Так как весь интернет зависит от стабильности работы этой системы, то в нее входит множество серверов по всему миру. Кроме того, DNS устроена таким образом, что нет центральной организации, управляющей этими серверами. Подробнее про DNS можно прочитать в вики
Веб, по большей части, построен по клиент-серверной архитектуре. Это означает, что программы-клиенты делают запросы к программам-серверам. Например, браузер — это клиент, а программа, которая отвечает на запросы браузера и предоставляет содержимое сайта (например, HTML и CSS) — это сервер. Конкретно в случае сайтов он называется веб-сервер.
Когда браузер запрашивает сайт, то происходит так называемый#HTTP-запрос. Это название связано с тем, что запрос идет по протоколу HTTP, с которым мы сталкиваемся в нашей жизни буквально каждый день. Прямо сейчас не так важно, как конкретно это происходит. Важно, что у браузера есть способ обратиться к веб-серверу и сказать, какой сайт нам нужен. А веб-сервер, в свою очередь, отдаёт сайт браузеру. Под «отдает сайт» можно понимать передачу HTML в виде текста, от веб-сервера в браузер.
И действительно, получив содержимое сайта в виде html, браузер проводит сложные манипуляции, результатом которых становится красивая картинка на экране.
Пример HTTP-запроса из терминала для любознательных:
curl --verbose -k https://ru.hexlet.io
* Rebuilt URL to: https://ru.hexlet.io/
* Trying 52.19.232.70...
* Connected to ru.hexlet.io (52.19.232.70) port 443 (#0)
* Server certificate: Lets Encrypt Authority X3
> GET / HTTP/1.1
> Host: ru.hexlet.io
> User-Agent: curl/7.51.0
> Accept: */*
>
< HTTP/1.1 200 OK
< Access-Control-Allow-Origin: *
< Cache-Control: max-age=0, private, must-revalidate
< Content-Type: text/html; charset=utf-8
< Date: Mon, 01 May 2017 16:54:12 GMT
< ETag: W/"d757ff03391838ff56a232570f683b5a"
< Content-Length: 28960
< Connection: keep-alive
<
<!DOCTYPE html>
<html>
<head>
// тут много много htmlНа собеседованиях программистов часто задают следующий вопрос: «что происходит после того, как вы нажимаете enter в поле с введенным адресом?»
На этот вопрос есть исчерпывающий ответ на гитхабе. Вкратце происходит следующее:
- Браузер делает запрос к DNS-серверам, у которых узнает необходимый IP-адрес
- Браузер, который запущен по найденному адресу, устанавливает соединение с веб-сервером, используя протоколы TCP/IP
- Браузер делает HTTP-запрос
- Веб-сервер возвращает HTML страницу для указанного адреса
- Браузер отрисовывает HTML
Попробуйте самостоятельно поэкспериментировать на этом сайте — whois.domaintools.com. Вбейте любой домен и изучите вывод.
Выдачей доменов занимаются организации, именуемые регистраторами. На их сайте вы можете подобрать незанятый домен и оплатить его. После этого каждый год необходимо продление, иначе он вновь станет свободным, и его смогут купить другие. Затем, прямо там же у регистратора, вы можете настроить DNS, например, указать адрес вашего хостинга (в реальности все чуть сложнее, сначала надо указать NS-сервера), на котором находится сайт. Спустя примерно сутки ваш сайт начнет открываться. Такой срок связан с тем, что информация о новой связке домен-адрес должна распространиться по всем DNS серверам по всему миру. Такая же история происходит и при изменении IP-адреса. Процесс может занять до суток.
Не следует путать регистраторов доменных имен и хостеров. Часто хостеры выступают как ресселеры и предлагают купить домены через себя, но, в общем случае, регистраторы — это отдельные компании, которые никак не связаны с хостингом.