Эта статья не просто объясняет, что такое веб-сервер, зачем он нужен и как работает, но и проводит читателя по пути создания своего собственного сервера, так что читатель впоследствии сам сможет дать устраивающий его ответ на все эти вопросы.
Вступление
Каждый новый пользователь интернета достаточно рано начинает понимать, что появляющаяся в его навигаторе информация скачивается с сервера. Также он очень быстро усваивает, что разные сайты, скорее всего, расположены на разных серверах. Но что такое сервер, как он выглядит, и как отличить его от любого другого предмета, знают, оказывается, далеко не все. Рассказы людей, видевших сервер своими глазами, интригуют. Из этих рассказов можно понять, что сервер - это суперкомпьютер с двумя процессорами, расположенный в специальном подвале под замком, а всемогущий администратор регулярно "тельнетится" к своему детищу, чтобы просматривать логи и отражать хакерские атаки, подобно герою звёздных войн. Всё это правда, но количество вопросов она не уменьшает.
Провести ликбез я предлагаю радикальным способом: создайте свой веб-сервер. Причём не уступающий функционально серверу, к примеру, "яндекса". Вы скоро убедитесь, что это не требует денежных затрат и по силам каждому. Нам потребуется только персональный компьютер под управлением операционной системы Windows 2000 (Pro, Server) или похожей (XP, 2003) и соединение с интернетом. Я уверен, что лет через 20 в мире (или, как сейчас модно говорить, "на рынке") личных серверов с личными сайтами будет столько же, сколько сейчас мобильных телефонов.
Что такое сервер
Начнём с определения. Сервер (от to serve - служить) - это программа, способная принимать запросы от других программ и выдавать им ответ; то есть, обслуживающая другие программы. Предположим, что у нас есть программа calc.exe, способная понимать запросы в виде математических выражений и выдавать результат вычисления этих выражений. Это будет самый что ни на есть типичный сервер! Программа, способная делать запросы к другой программе и получать от неё ответ, называется клиентом.
Кроме того, "сервером" часто называют компьютер, на котором запущена программа-сервер и основная роль которого - эту программу выполнять. Компьютер-сервер совсем не обязан быть мощным. Но если он обрабатывает сотни запросов в секунду, то мощным ему быть не помешает, чтобы клиенту не пришлось слишком долго ожидать отклика. Кстати, такая ситуация уже несколько лет существует на сервере, адресуемом narod.yandex.ru - файлы с него качаются очень медленно (особенно из-за границы).
Веб-сервер - это серверная программа, обрабатывающая запросы по протоколу HTTP. Протокол HTTP регламентирует вид запросов на получение гипертекстовой информации и вид ответов на эти запросы. Роль клиентов веб-серверов чаще всего играют навигаторы, но ими также могут быть менеджеры закачек и разные другие программы. Когда вы набираете в адресной строке навигатора "http://rambler.ru", он делает запрос HTTP к соответствующему серверу с просьбой получить главную страницу, а полученную страницу отображает в своём окне.
В слове "веб-сервер" приставку "веб-" часто отбрасывают для краткости, что вносит окончательную неразбериху в терминологию. Давайте для ясности вспомним, что термином "сервер" обозначают: программу-сервер, компьютер-сервер, а в частных случаях - программу-веб-сервер, компьютер-веб-сервер, программу-сервер баз данных и т.д.
Теория и практика клиентсерверного взаимодействия
Итак, смысл жизни программы-сервера - обслуживать программы-клиенты. Как одна программа может обратиться к другой? Современные операционные системы (Windows, *NIX и др.) предоставляют для этих целей два основных средства: каналы (pipes) и сокеты (по-русски - розетки). Причём при помощи сокетов (я буду употреблять этот американизм по причине всеобщего непонимания русских слов) клиент может обратиться не только к серверу, запущенному на том же компьютере, где он сам, но и к расположенному на другом компьютере, доступ к которому происходит через сеть. Все сетевые протоколы (HTTP, FTP,...) предполагают клиент-серверное взаимодействие только через сокеты.
Любая программа может открыть сокет, присвоив ему номер, называемый номером порта. Между двумя любыми открытыми сокетами (портами) возможно перетекание информации. Как правило, сервер открывает порт с постоянным номером (чтобы клиенты всегда знали, куда обращаться) в самом начале своей работы, а клиент открывает порт с произвольным меняющимся номером (если один номер занят - выбирается другой) непосредственно перед транзакцией и закрывает порт после неё. Некоторые программы сочетают в себе функции сервера и клиента, например, ICQ в качестве сервера ожидает новые сообщения, а в качестве клиента сама посылает сообщения другому экземпляру ICQ, запущенному на другом компьютере.
Кстати, из-за внутренней ошибки программа может выдать не то, что у неё запросили. Например, та же ICQ (а ошибок в ней тьма) может вдруг выдать удалённому клиенту содержимое какого-нибудь файла на вашем компьютере (а этот файл может содержать какой-нибудь ваш пароль).
Какие порты открыты у вас в данный момент, и кто к ним подключен, можно посмотреть в фаирволе (если ваша фаирволь поддерживает такую возможность) или утилитой "fport". Если запустить ICQ, то в списке портов вы обнаружите что-то вроде "ICQLITE.EXE TCP all:4752", то есть, открыт порт 4752 (проверьте).
Номер порта можно назвать адресом программы внутри компьютера. Но для осуществления межсокетной коммуникации нужно ещё знать адрес компьютера внутри сети. Каждый компьютер тоже имеет номер, называемый адресом IP. Адрес IP - 4-байтное число. Чаще всего каждый байт записывают отдельно через точку, например "1.2.3.4", хотя можно и в шестнадцатеричном или восьмеричном виде, например "0x01020304".
Адреса от 127.0.0.0 до 127.255.255.255 зарезервированы для работы внутри собственного компьютера, и адрес 127.0.0.1 практически всегда адресует собственный компьютер. Адреса в диапазонах 10.0.0.0 - 10.255.255.255, 172.16.0.0 - 172.31.0.0 и 192.168.0.0 - 192.168.255.0 адресуют компьютеры в локальной сети. Куда вы попадёте, набирая эти адреса, зависит от того, к каким компьютерам ведёт провод, выходящий из вашей сетевой карты, от конфигурации этих компьютеров, но, самое главное, от их наличия (отсутствия), и от наличия самой сетевой карты :) Если адрес компьютера не входит в вышеупомянутые диапазоны, значит, мы имеем дело с компьютером во внешней сети (интернет). [1].
Теперь я предлагаю сделать HTTP-запрос к какому-нибудь серверу, например, к серверу, запущенному на компьютере с адресом 1.2.3.4 и открывшему порт номер 80. Для того, чтобы делать любые запросы к любому серверу, используйте программу telnet, входящую в дистрибутив Windows. Откройте командную строку и напишите:
telnet 1.2.3.4 80
Скорее всего, эта попытка провалится, так как мала вероятность того, что в сети окажется сервер с таким адресом. Поэтому нужно узнать адрес какого-нибудь существующего сервера. Для этого используем утилиту ping, тоже изначально имеющуюся в Windows. Напишем:
ping ya.ru
...и увидим на экране примерно следующее:
Обмен пакетами с ya.ru [213.180.204.8] по 32 байт:
Ответ от 213.180.204.8: число байт=32 время=449мс TTL=57
Ответ от 213.180.204.8: число байт=32 время=369мс TTL=57
Ответ от 213.180.204.8: число байт=32 время=546мс TTL=57
Ответ от 213.180.204.8: число байт=32 время=639мс TTL=57
Статистика Ping для 213.180.204.8:
Пакетов: отправлено = 4, получено = 4, потеряно = 0 (0% потерь),
Приблизительное время передачи и приема:
наименьшее = 369мс, наибольшее = 639мс, среднее = 500мс
Как вы догадались, анализируя увиденное, 213.180.204.8 - это адрес IP сервера ya.ru. Если вы видите какой-нибудь другой адрес, это означает, что он изменился с тех пор, как я написал статью. Подтельнетимся к тому адресу, который у вас получился, и 80му порту:
telnet 213.180.204.8 80
Сделав это, вы (в зависимости от версии вашего тельнета) могли увидеть пустой экран. Напечатайте в нём запрос, который хотите послать серверу. Например:
GET / HTTP/1.0
Не смущайтесь, если набираемый вами текст не показывается на экране. В конце надо сделать два перевода строки. И результат должен быть примерно таким:
Кстати, тельнету можно давать не только адреса IP, но и доменные имена, он сам определит, какой адрес соответствует имени:
telnet ya.ru 80
Но почему 80, спросите вы? Потому что мы заранее знаем, что веб-сервер ya.ru ждёт подключений на 80м порту, так как, набрав в навигаторе "http://ya.ru:80", мы получаем от сервера ответ (а набрав "http://ya.ru:81", не получаем). В адресе формата "URL" номер порта записывается после имени хоста через двоеточие. Если порт не указан, то навигатор (и большинство других программ) автоматически подставляет значение по умолчанию. Для протокола HTTP это значение - 80. Таким образом, две нижеследующие строки эквивалентны:Но почему 80, спросите вы? Потому что мы заранее знаем, что веб-сервер ya.ru ждёт подключений на 80м порту, так как, набрав в навигаторе "http://ya.ru:80", мы получаем от сервера ответ (а набрав "http://ya.ru:81", не получаем). В адресе формата "URL" номер порта записывается после имени хоста через двоеточие. Если порт не указан, то навигатор (и большинство других программ) автоматически подставляет значение по умолчанию. Для протокола HTTP это значение - 80. Таким образом, две нижеследующие строки эквивалентны:
http://ya.ru
http://ya.ru:80
Когда вы наберете такой адрес в навигаторе, последний сделает точно такой же запрос к серверу ya.ru (порт 80), какой мы сделали с помощью тельнета. Кстати, вы знали, что вместо имени хоста можно указать IP?
http://213.180.204.8
http://213.180.204.8:80
...а можно IP в шестнадцатеричном или восьмеричном представлении...
Для справки: портом по умолчанию для протокола SMTP является 25, POP3 - 110, FTP (данные) - 20, FTP (управление) - 21, NNTP - 119... [2].
Установка и настройка серверного ПО
Вы уже поняли, что такое веб-сервер и как с ним работать. А теперь я предлагаю вам превратить свой компьютер в сервер, чтобы с ним можно было работать так же, как со всеми остальными серверами. Для этого, как вы знаете, на вашем компьютере надо запустить программу, обрабатывающую HTTP-запросы. Писать такую программу мы с вами сейчас не будем (как-нибудь в другой раз), а установим одну из уже готовых. Программ веб-серверов много в мире, но самые распространённые - это Internet Information Services (IIS) и Apache. Пользователям Windows 2000 лучше всего подходит IIS, потому что он интегрирован в операционную систему, и именно о нём я буду рассказывать. Apache хорош для *NIX-ов, если он вас интересует, обратитесь к сайту dklab.ru.
Для установки IIS зайдите в меню "пуск", выберите "настройка", и откройте "панель управления". Вызовите "установка и удаление программ". Нажмите на кнопку "добавление и удаление компонентов Windows". Теперь вы должны видеть "мастер компонентов Windows" со списком компонентов, которые можно отмечать птичкой (галочкой), и среди них должен быть IIS. Выделите IIS, и нажмите кнопку "состав". В составе отметьте птичками все компоненты, которые считаете полезными (можно вообще все). Главное - отметить "веб-сервер", "документация", "общие файлы", и "оснастка IIS". Можете выбрать FTP-сервер, если он вам нужен, хотя особой пользы от него, если есть HTTP-сервер, я не вижу. А вот "служба SMTP" - очень полезная вещь (правда о ней я в этой статье не рассказываю).
После проделанных действий сервер должен начать работать. Чтобы убедиться в этом, наберите в навигаторе адрес своего компьютера (http://127.0.0.1). Должна появиться страница по умолчанию. Она называется Default.asp и находится в папке %SystemDrive%\Inetpub\wwwroot (например, c:\Inetpub\wwwroot). Всё содержимое этой папки теперь доступно программам-клиентам, в том числе через интернет. Например файл icon1.png (если он там есть) будет доступен по адресу "http://127.0.0.1/icon1.png". Я рекомендую стереть всё, что Билл Гейтс положил вам в эту папку (или перенести куда-нибудь, чтобы потом изучать), и наполнить её чем-нибудь своим. Помните, что файл с именем Default.html, а если его нет, то Default.asp (обязательно с заглавной буквы), открывается по умолчанию.
Администрирование веб-сервера
Администрирование веб-сервера IIS включает в себя изменение следующих параметров:
Порт сервера (по умолчанию 80)
Домашний каталог (по умолчанию %SystemDrive%\Inetpub\wwwroot)
Документ, открываемый по умолчанию (изначально Default.html или Default.asp)
Разрешение запуска сценариев и программ
Разрешение просмотра содержимого папок
Выставление прав доступа к документам
Создание виртуальных каталогов
Определение, необходимо ли вести лог (журнал) и какие данные в нём протоколировать
Другое
Администрирование осуществляется при помощи "оснастки IIS". Оснастку можно вызвать, зайдя в панель управления, дважды щёлкнув "администрирование", а затем "диспетчер служб интернета". Перед вами раскроется древовидная структура, корнем которой будет сетевое имя вашего компьютера (вероятно, заданное во время инсталляции операционной системы). Этим именем можно адресовать ваш компьютер в локальной сети. Одним из подэлементов корня должен быть "веб-узел по умолчанию". Выделив его, вы увидите (в правом кадре) список всех файлов, доступных для скачивания с вашего сервера. Чтобы ограничить доступ к какому-нибудь файлу, щёлкните по его названию правой кнопкой мыши и выберите пункт "свойства". В появившемся диалоговом окне всё вполне прозрачно, и вы сами сможете в нём разобраться. Кстати, щёлкнув правой кнопкой мыши по "веб-узел по умолчанию", вы тоже вызовете меню с пунктом "свойства".
Эксплуатация веб-сервера
Конечно, ваш сервер доступен всему миру только тогда, когда ваш компьютер включен и соединён с интернетом; а полноценный публичный сервер должен быть доступен круглосуточно. Чтобы обратиться к вашему компьютеру, удалённый клиент должен адресовать вас по вашему внешнему IP-адресу (127.0.0.1 сработает только с вашего собственного компьютера, а адрес типа 10.11.12.13 только с компьютера в вашей локальной сети). Внешний IP можно определить на странице ip.xss.ru (или на любой другой, позволяющей определить IP). Если IP у вас постоянный, то клиентам достаточно знать его, чтобы всегда иметь возможность к вам подключиться. Но это сопряжено с кое-какой проблемой: ни одно живое существо на свете никогда ваш адрес IP не запомнит. Есть и ещё парочка неприятных нюансов: некоторые поисковые системы откажутся индексировать ваш сайт, а письма, отправленные с вашего SMTP-сервера, автоматически попадут в категорию "спам".
Выйти из ситуации можно, приобретя доменное имя (domain name). Доменные имена - это имена наподобие "google.com", каждое из которых ассоциировано с определённым IP. Чтобы перевести доменное имя в IP, операционная система использует серверы DNS (Domain Name Service), которые обычно расположены у провайдеров интернета.
Доменное имя на самом деле состоит из нескольких имён, разделённых точкой. Самое правое называется именем первого уровня, или зоной. Есть зоны общие (com, net, org, info) есть тематические (edu, gov, mil, biz, travel), а есть - региональные (ru, ua, us, ca, uk и др). Слева от имени первого уровня идёт имя второго уровня, затем третьего и т.д. Владелец имени уровня n может создавать неограниченное количество любых имён уровня n+1 внутри своего.
Правами на каждую зону владеет определённая коммерческая организация, зарегистрированная в ICANN. Эта организация продаёт имена второго уровня (около $15/год). Информация об именах в каждой зоне (например, цены и правила, которым должны подчиняться сайты в данной зоне) чаще всего доступна на сайте администрации зоны. Этот сайт как правило имеет адрес "nic." плюс имя зоны (например "nic.com", "nic.ru"). Домены третьего уровня можно найти бесплатные.
Приобретя домен, вы сможете связать его со своим адресом IP. Если ваш IP изменится, вы должны будете внести изменения в настройки домена. Эти изменения будут сообщены всем серверам DNS на земном шаре, что займет около суток.
Сегодня у провайдеров интернета распространена практика выдавать пользователю новый адрес IP при каждом новом соединении со шлюзом, поэтому у подавляющего большинства пользователей интернета динамический (часто меняющийся) IP. Что делать в таком случае? Можно воспользоваться услугами служб динамических имён, таких как dyndns.com. DynDNS позволяет управлять доменом второго или третьего уровня, связывая домен с постоянным или динамическим IP. В случае с динамическим IP вам предложат использовать специальную программу DynDNS Updater, которая будет отслеживать изменение IP и автоматически посылать новое значение на сервер DynDNS. Изменение IP вступает в силу мгновенно, а не спустя сутки, как в случае с обычными доменными именами (см. выше). Вы можете иметь один аккаунт на DynDNS бесплатно.
После того, как вы создадите сервер, обзаведётесь для него доменным именем и сделаете на нём свой сайт, вы, наверное, захотите, чтобы ваш сайт начали посещать. Как люди узнают о нём? Чаще всего люди узнают о сайте после того, как попадут на него с поисковой машины. Поисковые машины узнают о новом сайте либо когда владелец сайта явно им об этом сообщает (google.com/addurl, webmaster.yandex.ru, rambler.ru/doc/add_site.shtml), либо самостоятельно найдя новый сайт по ссылке. Могу вам сказать, что я свой сайт в поисковики не добавлял, но указал пару раз его адрес при заполнении формы в одной гостевой книге (это была гостевая книга очень раскрученного сайта). Спустя две-три недели у меня в серверных логах начали появляться следы роботов, индексирующих сайты.
Первое, что делает индексирующий робот - запрашивает файл "robots.txt" из корневой директории сервера. Если этот файл отсутствует, то ваш сайт будет проиндексирован (целиком, если так решит робот). Если robots.txt существует, то он должен содержать информацию о том, какие части сайта каким роботам индексировать нельзя. Синтаксис этого файла описан на странице www.robotstxt.org/wc/exclusion-admin.html.
На своём сервере функционально вы ни в чём не ограничены и можете установить всё, что угодно: форум (например, популярный бесплатный форум "phpbb"), базу данных, или сервер знакомств. У обладателей собственного сервера намного больше возможностей, чем у владельцев платного хостинга на общем сервере. Ваши скрипты могут прибегать к помощи любых программ. Но делая свой сервер, вы берёте на себя заботу о его безопасности. Помните, преступник, взломавший ваш компьютер, может получить или испортить любые данные на вашем жестком диске.
Напоследок хочу пожелать вам, чтобы ваш сайт внёс весомый вклад в культурную жизнь интернета! Удачи!
Литература
[1] Linux Network Administrators Guide (Olaf Kirch) http:/sec.pmg17.vn.ua/teacher/nag-20/lnag.htm
[2] Программирование на Java. 1001 совет. (Марк С. Чен, Стивен В. Грифис, Энтони Ф. Изи)