Советы по разработке веб-сервера - PullRequest
10 голосов
/ 16 мая 2009

После некоторого поиска я не нашел вопросов по разработке веб-сервера.

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

Так что вопросы просты.

  • Вы разработали веб-сервер? (независимо от того, на каком языке)
  • Какие уловки и другие полезные советы вы можете предоставить

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

Ответы [ 8 ]

17 голосов
/ 16 мая 2009

Веб-сервер изначально представляет собой чрезвычайно простой фрагмент кода:

  • открыть сокет TCP / IP на порту 80
  • пока не прекращено
    • ждать соединения в этом сокете
    • когда кто-то отправляет вам заголовки HTTP
      • найти путь к файлу
      • скопировать файл в сокет

Итак, набросок кода прост.

Теперь вам нужно разобраться с некоторыми сложностями:

  • в простейшей версии кода, пока вы разговариваете с одним браузером, все остальные не могут подключиться. Вам нужно придумать способ обработки нескольких соединений.
  • часто удобно иметь возможность отправлять что-то большее, чем просто статический файл (хотя первые HTTP-серверы делали именно это), поэтому вам нужно иметь возможность запускать другие программы.

Обработка возможности множественных подключений также относительно проста с рядом возможных вариантов.

  • Простейшая версия (опять же, именно так, как это было сделано изначально) состоит в том, чтобы код, который прослушивает порт 80, настраивал конкретный сокет для этого соединения, а затем разветвлял свою копию для обработки этого одного соединения. Этот процесс выполняется до тех пор, пока сокет не будет закрыт, а затем завершается. Тем не менее, это относительно дорого: разветвление обычно занимает десятки миллисекунд, что ограничивает скорость, с которой вы можете работать.
  • Второй вариант - создать облегченный процесс - a / k / a thread - для обработки запроса.

Запуск программы тоже довольно прост. В общем, вы определяете специальный путь к каталогу CGI; URL, который имеет путь через этот каталог, затем интерпретирует имя пути как путь к программе. Затем сервер создаст подпроцесс, используя fork / exec, с STDOUT, подключенным к сокету. Затем программа запускается, отправляя вывод в STDOUT и отправляя его в браузер клиента.

Это основной шаблон; все остальное, что делает веб-сервер, это просто добавление излишеств и дополнительной функциональности к этому базовому шаблону.

Вот некоторые другие источники, например, код:


Это почти ничего не делает из того, что вы действительно хотели, но для просто трудно победить это из http://www.commandlinefu.com:

$ python -m SimpleHTTPServer

9 голосов
/ 16 мая 2009

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

Хорошо, вот что нужно иметь в виду:

  1. Тема, которая принимает соединения должны быть переданы фоновые темы, как только возможный.
  2. Вы не можете иметь тему для каждого соединения - с большие объемы у вас закончатся предел потока.
  3. Используйте какой-то пул рабочих потоков для обработки вашего Запросы.
  4. Убедитесь, что вы чистите URL, когда вы получаете HTTP GET запрос. Так что я не мог что-то сделать лайк http://localhost/../../Users/blah/ чтобы получить доступ более высокого уровня.
  5. Убедитесь, что вы всегда устанавливаете соответствующие типы контента и пантомимы.

Удачи - это адская работа.

1 голос
/ 09 мая 2014

local-web-server является примером простого веб-сервера разработки, написанного на node.js. Он более надежен и имеет больше возможностей, чем python -m SimpleHTTPServer

1 голос
/ 17 мая 2009

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

Итак, вы собираетесь в конечном итоге сделать много изменений заголовка, чтобы сделать вашу жизнь проще. А именно, HTTP / 1.0 намного легче иметь дело, чем HTTP / 1.1. Вы не хотите иметь дело с управлением таймаутами, хранением сообщений и тому подобным. Самое простое соединение - одна транзакция.

Вы будете делать много-много разборов. Разбор труден в C. Я бы посоветовал вам написать что-то вроде

int readline(char *buff, int maxLen) {
    while((c = readNextCharFromSocket(&s)) && c != '\n' && i < maxLen)
      buff[i++] = c;
    return i;
}

и обрабатывать его по одной строке за раз, потому что проще всего использовать существующие строковые функции Си по одной строке за раз. Кроме того, помните, что строки разделены \ r \ n, а заголовки оканчиваются на \ r \ n \ r \ n.

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

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

1 голос
/ 16 мая 2009

Несколько лет назад я написал легкий веб-сервер на Python, также в качестве учебного проекта.

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

1 голос
/ 16 мая 2009

Работа в сети и др. Довольно стандартны, так что не беспокойтесь об этом. (есть несколько «мгновенных», примеров сетевых серверов практически на любом языке.)

Вместо этого сосредоточьтесь на фактической реализации спецификации HTTP. Вы будете поражены: а) тем, чего не знаете, и б) тем, сколько вещей, которые должны быть совместимы с HTTP, на самом деле не так, но подделайте это хорошо.

Тогда вы удивитесь, что сеть вообще работает.

Когда вы закончите с HTTP, попробуйте реализовать IMAP.

0 голосов
/ 03 января 2015

Я уже разработал веб-сервер, который работает (HTML и PHP) с использованием языка Си это не так сложно, вы должны знать, как использовать сокеты TCP / IP, Thread для обработки нескольких запросов, процессы fork (необходимо создать дочерний элемент для выполнения командной строки php (я использовал execvp))

Я думаю, что самая сложная часть - это обработка строк в языке C и отправка запросов POST / GET в командной строке.

Удачи

0 голосов
/ 16 мая 2009

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

Вот несколько статей в стиле учебника: 1 & 2

...