Как написать свой сервер

Создадим HTTP-сервер, который обрабатывает запросы браузера и возвращает ответ в виде HTML-страницы.

Введение в HTTP

Для начала разберемся, что из себя представляет HTTP. Это текстовый протокол для обмена данными между браузером и веб-сервером.

Пример HTTP-запроса:

Первая строка передает метод запроса, идентификатор ресурса (URI) и версию HTTP-протокола. Затем перечисляются заголовки запроса, в которых браузер передает имя хоста, поддерживаемые кодировки, cookie и другие служебные параметры. После каждого заголовка ставится символ переноса строки
.

У некоторых запросов есть тело. Когда отправляется форма методом POST, в теле запроса передаются значения полей этой формы.

Тело запроса отделяется от заголовков одной пустой строкой. Заголовок «Content-Type» говорит серверу, в каком формате закодировано тело запроса. По умолчанию, в HTML-форме данные кодируются методом «application/x-www-form-urlencoded».

Иногда необходимо передать данные в другом формате. Например, при загрузке файлов на сервер, бинарные данные кодируются методом «multipart/form-data».

Сервер обрабатывает запрос клиента и возвращает ответ.

Пример ответа сервера:

В первой строке ответа передается версия протокола и статус ответа. Для успешных запросов обычно используется статус «200 OK». Если ресурс не найден на сервере, возвращается «404 Not Found».

Тело ответа так же, как и у запроса, отделяется от заголовков одной пустой строкой.

Полная спецификации протокола HTTP описывается в стандарте rfc-2068. По понятным причинам, мы не будем реализовывать все возможности протокола в рамках этого материала. Достаточно реализовать поддержку работы с заголовками запроса и ответа, получение метода запроса, версии протокола и URL-адреса.

Что будет делать сервер?

Сервер будет принимать запросы клиентов, парсить заголовки и тело запроса, и возвращать тестовую HTML-страничку, на которой отображены данные запроса клиента (запрошенный URL, метод запроса, cookie и другие заголовки).

О сокетах

Для работы с сетью на низком уровне традиционно используют сокеты. Сокет — это абстракция, которая позволяет работать с сетевыми ресурсами, как с файлами. Мы можем писать и читать данные из сокета почти так же, как из обычного файла.

В этом материале мы будем работать с виндовой реализацией сокетов, которая находится в заголовочном файле . В Unix-подобных ОС принцип работы с сокетами такой же, только отличается API. Вы можете подробнее почитать о сокетах Беркли, которые используются в GNU/Linux.

Создание сокета

Создадим сокет с помощью функции socket , которая находится в заголовочном файле . Для работы с IP-адресами нам понадобится заголовочный файл .

Мы подготовили все данные, которые необходимо для создания сокета и создали сам сокет. Функция socket возвращает целочисленное значение файлового дескриптора, который выделен операционной системой под сокет.

Привязка сокета к адресу (bind)

Следующим шагом, нам необходимо привязать IP-адрес к сокету, чтобы он мог принимать входящие соединения. Для привязки конкретного адреса к сокету используется фукнция bind . Она принимает целочисленный идентификатор файлового дескриптора сокета, адрес (поле ai_addr из структуры addrinfo ) и размер адреса в байтах (используется для поддержки IPv6).

Подготовка сокета к принятию входящих соединений (listen)

Подготовим сокет к принятию входящих соединений от клиентов. Это делается с помощью функции listen . Она принимает дескриптор слушающего сокета и максимальное количество одновременных соединений.

В случае ошибки, функция listen возращает значение константы SOCKET_ERROR . При успешном выполнении она вернет 0.

В константе SOMAXCONN хранится максимально возможное число одновременных TCP-соединений. Это ограничение работает на уровне ядра ОС.

Ожидание входящего соединения (accept)

Функция accept ожидает запрос на установку TCP-соединения от удаленного хоста. В качестве аргумента ей передается дескриптор слушающего сокета.

При успешной установке TCP-соединения, для него создается новый сокет. Функция accept возвращает дескриптор этого сокета. Если произошла ошибка соединения, то возвращается значение INVALID_SOCKET .

Получение запроса и отправка ответа

После установки соединение с сервером, браузер отправляет HTTP-запрос. Мы получаем содержимое запроса через функцию recv . Она принимает дескриптор TCP-соединения (в нашем случае это client_socket ), указатель на буфер для сохранения полученных данных, размер буфера в байтах и дополнительные флаги (которые сейчас нас не интересуют).

Читайте также:  Как записать звонок на диктофон самсунг

При успешном выполнении функция recv вернет размер полученных данных. В случае ошибки возвращается значение SOCKET_ERROR . Если соединение было закрыто клиентом, то возвращается 0.

Мы создадим буфер размером 1024 байта для сохранения HTTP-запроса.

После получения запроса мы сразу же отправили ответ клиенту с помощью функции send . Она принимает дескриптор сокета, строку с данными ответа и размер ответа в байтах.

В случае ошибки, функция возвращает значение SOCKET_ERROR . В случае успеха — количество переданных байт.

Попробуем скомпилировать программу, не забыв предварительно завершить функцию main .

Если скомпилировать и запустить программу, то окно консоли «подвиснет» в ожидании запроса на установление TCP-соединения. Откройте в браузере адрес http://127.0.0.1:8000/. Сервер вернет ответ, как на рисунке ниже и завершит работу.

Последовательная обработка запросов

Чтобы сервер не завершал работу после обработки первого запроса, а продолжал обрабатывать новые соединения, нужно зациклить ту часть кода, которая принимает запрос на установку соединения и возвращает ответ.

Когда сервер закончит обработку запроса одного клиента, он закроет соединение с ним и будет ожидать нового запроса.

Во второй части этой статьи мы напишем парсер HTTP-заголовков и создадим нормальное API для управления HTTP-запросами и ответами.

Примечание: если вы используете MinGW в Windows, то библиотеку Ws2_32.lib нужно вручную прописать в настройках линковщика.

Наверное, я бы не стал писать на эту тему ни одной статьи, если бы не слишком частые просьбы рассказать, как сделать свой сервер для сайта. То есть превратить обычный домашний компьютер в сервер, на котором можно размещать свои сайты и на которые смогут зайти люди из любой точки мира. Задача это очень сложная, но постараюсь кратко описать порядок действий.

Прежде чем задумываться о своём сервере, нужно понять, удовлевторяет ли Ваш компьютер минимальным требованиям? Вот их список:

  • Статический IP. Это зависит от провайдера, как правило, они требуют за статический IP-адрес денег.
  • Хорошая скорость. Минимально допустимая скорость — это 10mbps. Могу смело сказать, что такая скорость на данный момент — это редкость даже для Москвы, я уже молчу про регионы, где ещё часто сидят на модемах. А вообще нормой является 100mbps, которая имеется лишь у единиц, и стоит даже в Москве очень и очень дорого.

Из этих двух требования становится понятно, что дешевле и проще будет арендовать физический сервер. О чём я всегда и пишу всем тем, кто хочет создать свой сервер для сайта.

Но для тех, кто не хочет доверять обслуживание сервера другим лицам и у кого выполняются оба требования, для тех я напишу, что необходимо сделать:

  1. Установить Unix-систему. Например, Linux. Действительно, можно и на Windows всё сделать, но я бы рекомендовал именно Unix-систему для сервера.
  2. Установить Apache. Про установку Apache полно материала в Интернете. В установке ничего ничего сложного: скачиваете архив, распаковываете через командную строку и далее запускаете установку (опять же через командную строку).
  3. В /etc/httpd/conf/httpd.conf (конфигурации Apache) надо прописать: listen 80:Ваш_IP.
  4. Открыть 80-й порт на вход в Firewall. Как это сделать, зависит от конкретной ОС, которую Вы выберете.

Теперь при вводе в адресной строке: http://Ваш_IP, — должен открываться Apache. Поменять корневую директорию для сайтов можно также в httpd.conf.

Если Вы хотите, чтобы сайт был доступен не только по IP, но и по домену, то тогда нужно поднимать DNS.

Также можно установить ещё PHP и MySQL, а также PHPMyAdmin. Если планируете иметь доступ с другого компьютера, то потребуется и FTP-сервер.

Установка каждого из этих элементов — это отдельная статья, причём достаточно большая. Поэтому ещё раз подумайте, действительно ли Вам необходимо создать свой сервер для сайта? Если да, то смотрите на последовательность действий из этой статьи и, используя поисковую систему, узнавайте более подробно по каждому этапу и применяйте это на практике.

И, напоследок, не забудьте, что компьютер должен быть всегда включённым, иначе Ваши сайты будут недоступны.

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

Читайте также:  Как играть вдвоем в сони плейстейшен

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

Она выглядит вот так:

  • BB-код ссылки для форумов (например, можете поставить её в подписи):
  • Комментарии ( 23 ):

    добрый вечер. на самом деле ничего сложного в этом нет. но вот если у сервера не дай бог что нибудь испортиться и у вас не будет возможности починить, вы потеряете всех своих клиентов. лучше хостинг покупайте. свой сервер не самый лучший вариант

    На хостинге тоже могут быть проблемы. Надо просто делать резервную копию и всё

    Я бы с большим удовольствием себе сделал, но я ума не приложу как я буду пользоватся юниксом, один раз порылся и комп завис с ошибкой перегрузки ОС. Не дай бог кому нибудь иметь с ней дело

    Кстати, я делаю свой сервер на виндовс xp, и тем кто решится тоже попробовать, советую использовать nginx, apache немного устарел. Кстати для новичков как я могу посоветовать статью про установку, для чайников пойдёт, хотя я когда творил сервер не знал про эту статью: http://www.easycoding.org/2011/05/09/ustanovka-i-nastrojka-nginx-php-pod-windows.html | Кстати известная ошибка файлов .exe на 32 битной системе, чтобы заработал php-cgi.exe или php.exe советую качать php установщик .msi, работа гарантирована. Будут вопросы по статье — пишите.

    А зачем нужен свой сервер?Для того ,чтобы сайт выдерживал огромный трафик и посетителей?Свои сервера наверно используют крупные социальные сети.

    Да, выделенный сервер нужен для больших нагрузок.

    А ваш сайт на каком сервере?Сколько посетителей выдержит

    Сегодня ночью переехал на другой сервер, но пока ничего говорить не буду, расскажу о результатах через пару недель. А сколько выдержит посетителей, зависит от множества факторов.

    О это интересно ,буду ждать видео ,обязательно присылайте на почту.И ксатати вы можете сделать так ,что бы на вашем сайте не нужно было постоянно авторизироваться

    И в валтдаторе у меня вылазит 2 ошибки : "Линия 1, столбец 50 : символ " ", разделителем "[", идентификатор системы, "CDATA", "NDATA", "SDATA» и разделители параметров позволило TML . PUBLIC "- / / W3C / / DTD XHTML 1.1 / / EN" Ответить

    Не пишите теги заглавными буквами. И используйте такой doctype:

    А после установки apache, можно воспользоваться компьютерам в других целях. (У меня просто Windows 10)

    Здраствуйте, Михаил! Как можно сделать постраничную навигацию, чтобы на экране появились название, картинки видеороликов, и потом внутри картинки были код видеороликов.Как это реализовать, какой запрос нужно написать?

    Совершенно не ясен вопрос.

    Я хотель сказать как в сайте ютубе или других видеохостингах есть же внизу сайта постраничная навигация, они как это делают, если много видео на сайте.

    Все данные видео хранятся в базе данных, а дальше вот это: http://myrusakov.ru/php-page-navigation.html

    Вы обещали кинуть видео где расскажете о вашем новом сервере.

    Здравствуйте Кирилл, если и обещалось, то сделано будет, времени на все не хватает, ожидайте.

    а что, 10Mb/s это предел мечтаний? =) У меня вот например дома канал 100Mb/s в обе стороны, полный безлимит. И стоит он всего $20 в месяц. Хотя конечно для коммерческих целей этот же канал будет стоить в 10 раз дороже + оплата биллинга, но и то это не страшно =)

    Случайно нашел эту статью, по-этому могу не в тему написать и неверно поставить вопрос, но все же) У меня такой вопрос, может кто-то подсказать (вопрос может быть не корректным с профессиональной точки зрения) Цель: обеспечить комфортное нахождение на сайте 50 тыс пользователей единовременно Вопрос: как организавать серверное оборудование и какое оно должно быть, сколько, чтобы обеспечить данную цель? P.S. Серверы мы будем покупать собственные, и размещать в дата центре

    Здравствуйте. Такая вот проблема. Если я сделал свой веб сервер, как создать свой домен DNS?

    Михаил здравствуйте , Понимаю вопрос возможно глупый . Но извините я в этой сфере совершенно не силен и только начинаю ее осваивать . Вот что именно меня интересует . Если я к примеру захочу запустить кино сайт могу ли я поставить в дата центр обычный персональный ПК и использовать его в качестве сервера , там будет и сайт и сами файлы . Если да то какую желательно делать характеристику этого пк . Точнее что и сколько может понадобиться ? Сколько ОЗУ , Какой процессор и т.д . Просто в моей стране самый дешевый сервер что я нашел стоит 6000$ а зарплата в стране среднестатистическая (100$ , у меня 300$ ) . Извините если вопрос очень глупый но уж больно важный для меня . Заранее большое спасибо за ответ .

    Читайте также:  Как зарегистрироваться в вичате на телефоне

    Решила создать свой сайт, но не была уверена, на какой платформе лучше всего его делать. Думала сначала про разные конструкторы, но наткнулась на эту статью https://ifish2.ru/sozdat-rabochij-sajt/ и поняла, почему все-таки лучше сделать это сразу на WordPress. В статье в принципе описаны оба способа, и каждый может решить для себя сам, какой ему подходит больше)

    Для добавления комментариев надо войти в систему.
    Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.

    Copyright © 2010-2019 Русаков Михаил Юрьевич. Все права защищены.

    Все о локальных сетях и сетевом оборудовании

    Создание собственного локального сервера на базе обычного персонального компьютера – занятие достаточно сложное и кропотливое. Здесь необходимо понимать следующие моменты:

    1. 1. Для чего создается сервер, и нужен ли вам вообще свой сервер. Это один из ключевых вопросов, требующий четкого и однозначного ответа от будущего администратора.
    2. 2. Какие технические ресурсы есть в вашем распоряжении, и какие будут необходимы для работы полноценного сервера. Минимальные технические требования для создания «добротного» сервера достаточно высоки: только оборудование обойдётся в 70 — 80 тыс. рублей.

    3. Какие денежные средства вы готовы тратить на создание и поддержку работоспособности сервера. Помимо обозначенных выше затрат «на железо» для создания полноценного сервера на компьютере требуется выделенный (статистический) ip адрес и высокая скорость приема и передачи данных (минимальным показателем является 10 Мбитсек). Соответственно, за это придётся доплатить провайдеру и заключить дополнительный договор на оказание подобного рода услуг.

    И прежде чем пытаться из компьютера сделать сервер нужно четко определить все эти нюансы.

    Как сделать сервер из домашнего компьютера?

    Чтобы создать свой сервер прежде всего нужно установить многопользовательскую сетевую операционную систему.

    Выбор огромный: «Debian», «FreeBSD», «CentOS», «OpenSUSE», «Ubuntu», «Windows» и многие другие.

    В сети можно найти немало примеров тестирования в работе вышеупомянутых операционных систем и их рейтинг в соответствии с результатами тестов. К примеру, рейтинг «SOS» за 2016:

    1 место: «Debian» и «Ubuntu Server»;

    3 место: «FreeBSD» и «Windows Server»;

    4 место: «Red Hat Enterprise»;

    Разумеется, львиную доля рынка сетевого софта составляют операционные системы, занимающие первое место в рейтинге. Поэтому чтобы в первый раз создать сервер на компьютере, рекомендуем остановить свой выбор на одной из них.

    В рамках примера остановимся на установке операционной системы «Ubuntu Server».

    Как настроить локальный сервер с нуля на ubuntu?

    1. Скачайте и занесите образ операционной системы на загрузочную флешку. С флешки загрузите компьютер: на первом этапе вам будет предложено выбрать язык.

    2. Далее выберите «Установка Ubuntu Server» и нажмите «Enter»;

    3. На следующих шагах выберите «Регион» и «Настройки раскладки клавиатуры»;

    4. Укажите имя пользователя, учётной записи компьютера и пароль,

    после чего нажмите «Продолжить»;

    5. Далее укажите «Часовой пояс»,

    настройте «Разметку Диска»

    и выберите на какой диск устанавливается система;

    6. Дождитесь завершения установки и обновления системы.

    7. Выберите программное обеспечения, которое вам требуется для работы.

    8. Подтвердите завершение установки, нажав на кнопку «Продолжить»;

    9. После перезагрузки компьютера для входа в учётную запись потребуется ввести логин и пароль, созданный на шаге «4»;

    10. На этом установка серверной операционной системы и первичное создание сервера завершены.

    Далее требуется провести начальные настройки для работоспособности сервера (все настройки проводятся в консоли управления).

    Как сделать себя админом на своем сервере?

    1. 1. Для получения администраторских прав введите команду «sudo su»;
    2. 2. По умолчанию сетевые настройки сервера поступают с помощью DHCP, но для работы сервера потребуется изменить значение «iface eth0 inet static» в файле «/etc/network/interfaces» на «статистический ip адрес». Текст должен выглядит примерно так:

    iface eth0 inet static
    address 192.168.0.100
    netmask 255.255.255.0
    network 192.168.0.0
    broadcast 192.168.0.255
    gateway 192.168.0.1

    После сохранения перезагрузите сеть командой «/etc/init.d/networking restart».

    Далее настройки носят опционный характер, и всё будет зависеть от цели создания сервера и функциональной части, которая вам от него необходима.

    Adblock
    detector