0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>В этом уроке мы рассмотрим, для чего нужен веб-сервер, и как устроено сетевое взаимодействие.</p>
1
<p>В этом уроке мы рассмотрим, для чего нужен веб-сервер, и как устроено сетевое взаимодействие.</p>
2
<h2>Процессы</h2>
2
<h2>Процессы</h2>
3
<p>Единицей исполнения в операционных системах является процесс. Это некоторая абстракция внутри ОС. Любая запущенная программа - это либо один процесс, либо набор процессов. Например, в браузерах одна вкладка, как правило, - это один процесс.</p>
3
<p>Единицей исполнения в операционных системах является процесс. Это некоторая абстракция внутри ОС. Любая запущенная программа - это либо один процесс, либо набор процессов. Например, в браузерах одна вкладка, как правило, - это один процесс.</p>
4
<p>Особенность процессов в том, что они изолированы друг от друга. Например, сбой в одном процессе не влечет за собой остановку работы других. Такое свойство процессов можно наблюдать в тех ситуациях, когда одна из вкладок браузера начинает тормозить и зависает. В это время можно без проблем продолжать использовать другие вкладки.</p>
4
<p>Особенность процессов в том, что они изолированы друг от друга. Например, сбой в одном процессе не влечет за собой остановку работы других. Такое свойство процессов можно наблюдать в тех ситуациях, когда одна из вкладок браузера начинает тормозить и зависает. В это время можно без проблем продолжать использовать другие вкладки.</p>
5
<p>Внутри себя процесс может делиться на потоки:</p>
5
<p>Внутри себя процесс может делиться на потоки:</p>
6
<p>Посмотреть список процессов в Linux можно командой ps aux либо top.</p>
6
<p>Посмотреть список процессов в Linux можно командой ps aux либо top.</p>
7
<p>Подробнее о менеджменте процессов можно прочитать в<a>книгах</a>по операционным системам.</p>
7
<p>Подробнее о менеджменте процессов можно прочитать в<a>книгах</a>по операционным системам.</p>
8
<p>Понимание процессов тесно связано с сетевым взаимодействием. Взаимодействие между двумя компьютерами в сети - всегда сводится к взаимодействию двух процессов. То есть нельзя подключиться к компьютеру в целом - можно подключиться только к конкретному процессу конкретной программы.</p>
8
<p>Понимание процессов тесно связано с сетевым взаимодействием. Взаимодействие между двумя компьютерами в сети - всегда сводится к взаимодействию двух процессов. То есть нельзя подключиться к компьютеру в целом - можно подключиться только к конкретному процессу конкретной программы.</p>
9
<p>Происходит это так: одна программа, которая хочет, чтобы к ней можно было подключаться по сети, при запуске начинает слушать сетевой сокет. Такая программа называется сервером. Другая программа к ней подключается - клиент. В случае веба, сервер - это конкретный веб-сервер, например, nginx, а клиент - это браузер.</p>
9
<p>Происходит это так: одна программа, которая хочет, чтобы к ней можно было подключаться по сети, при запуске начинает слушать сетевой сокет. Такая программа называется сервером. Другая программа к ней подключается - клиент. В случае веба, сервер - это конкретный веб-сервер, например, nginx, а клиент - это браузер.</p>
10
<p>Сетевое взаимодействие между программами двух компьютеров осуществляется с помощью одного из транспортных протоколов - например TCP, поверх которого уже работает HTTP. Для обращения к другому компьютеру нужно знать два параметра:<strong>IP-адрес</strong>и<strong>порт</strong>. "Слушать сетевой сокет" - это занять определенный порт на определенном сетевом интерфейсе и дать возможность обращаться к процессу через него. По номеру порта операционная система понимает, к какому процессу пытаются обратиться.</p>
10
<p>Сетевое взаимодействие между программами двух компьютеров осуществляется с помощью одного из транспортных протоколов - например TCP, поверх которого уже работает HTTP. Для обращения к другому компьютеру нужно знать два параметра:<strong>IP-адрес</strong>и<strong>порт</strong>. "Слушать сетевой сокет" - это занять определенный порт на определенном сетевом интерфейсе и дать возможность обращаться к процессу через него. По номеру порта операционная система понимает, к какому процессу пытаются обратиться.</p>
11
<p>Благодаря DNS браузер получает IP-адрес компьютера, на котором расположен сайт указанного домена. Также существует соглашение, согласно которому веб-сервер, обслуживающий сайт по протоколу HTTP, слушает порт 80, а протокол HTTPS обслуживается на порту 443. Поэтому браузер знает порт, на котором висит веб-сервер в ожидании входящих запросов.</p>
11
<p>Благодаря DNS браузер получает IP-адрес компьютера, на котором расположен сайт указанного домена. Также существует соглашение, согласно которому веб-сервер, обслуживающий сайт по протоколу HTTP, слушает порт 80, а протокол HTTPS обслуживается на порту 443. Поэтому браузер знает порт, на котором висит веб-сервер в ожидании входящих запросов.</p>
12
<p>Но так бывает не всегда. Во время локальной разработки обычно используются другие порты, например, 3000 или 4000. Сам номер не принципиален. Главное, что он доступен для веб-сервера, и мы обращаемся через браузер именно к нему. Порт указывается через двоеточие после названия сайта, например, www.google.com:80.</p>
12
<p>Но так бывает не всегда. Во время локальной разработки обычно используются другие порты, например, 3000 или 4000. Сам номер не принципиален. Главное, что он доступен для веб-сервера, и мы обращаемся через браузер именно к нему. Порт указывается через двоеточие после названия сайта, например, www.google.com:80.</p>
13
<h2>Веб-сервер</h2>
13
<h2>Веб-сервер</h2>
14
<p><strong>Веб-сервер</strong>- специализированная программа для обслуживания сайтов. Один веб-сервер может обрабатывать практически любое число сайтов (Virtual Hosts в HTTP). Он перенаправляет входящие сетевые запросы на код сайтов, получает от них ответ и возвращает его браузеру.</p>
14
<p><strong>Веб-сервер</strong>- специализированная программа для обслуживания сайтов. Один веб-сервер может обрабатывать практически любое число сайтов (Virtual Hosts в HTTP). Он перенаправляет входящие сетевые запросы на код сайтов, получает от них ответ и возвращает его браузеру.</p>
15
<p>Еще у веб-серверов есть большое количество вспомогательных функций. Среди них кеширование, перезапись запросов, раздача статики, reverse proxy, балансировка нагрузки и многое другое.</p>
15
<p>Еще у веб-серверов есть большое количество вспомогательных функций. Среди них кеширование, перезапись запросов, раздача статики, reverse proxy, балансировка нагрузки и многое другое.</p>
16
<p>Веб-сервера не знают, на чем написан сайт. Все способы взаимодействия веб-сервера и сайта на любом языке стандартизированы. Благодаря этому веб-серверов существует не так много, и они могут работать с сайтами, которые написаны на чем угодно.</p>
16
<p>Веб-сервера не знают, на чем написан сайт. Все способы взаимодействия веб-сервера и сайта на любом языке стандартизированы. Благодаря этому веб-серверов существует не так много, и они могут работать с сайтами, которые написаны на чем угодно.</p>
17
<p>Первым и самым простым способом взаимодействия веб-сервера с сайтом был<strong>CGI</strong>- Common Gateway Interface. Этот стандарт сразу разрабатывался с учетом того, что сервер не должен зависеть от того, на чем написан сайт. Он основан на переменных окружения.</p>
17
<p>Первым и самым простым способом взаимодействия веб-сервера с сайтом был<strong>CGI</strong>- Common Gateway Interface. Этот стандарт сразу разрабатывался с учетом того, что сервер не должен зависеть от того, на чем написан сайт. Он основан на переменных окружения.</p>
18
<p>По сути, сайт - это исполняемый файл, который запускается веб-сервером во время обработки входящего запроса и передает в него все параметры запроса через переменные окружения. Все, что требуется от скрипта, - это вернуть HTTP-ответ в стандартный вывод (STDOUT). Общий алгоритм работы выглядит так:</p>
18
<p>По сути, сайт - это исполняемый файл, который запускается веб-сервером во время обработки входящего запроса и передает в него все параметры запроса через переменные окружения. Все, что требуется от скрипта, - это вернуть HTTP-ответ в стандартный вывод (STDOUT). Общий алгоритм работы выглядит так:</p>
19
<ol><li>Клиент запрашивает страницу сайта</li>
19
<ol><li>Клиент запрашивает страницу сайта</li>
20
<li>Веб-сервер принимает запрос и устанавливает переменные окружения. Через них приложению передаются данные и служебная информация</li>
20
<li>Веб-сервер принимает запрос и устанавливает переменные окружения. Через них приложению передаются данные и служебная информация</li>
21
<li>Веб-сервер перенаправляет запросы через стандартный поток ввода (stdin) на вход вызываемой программы</li>
21
<li>Веб-сервер перенаправляет запросы через стандартный поток ввода (stdin) на вход вызываемой программы</li>
22
<li>CGI-приложение выполняет все необходимые операции и формирует результаты в виде HTML</li>
22
<li>CGI-приложение выполняет все необходимые операции и формирует результаты в виде HTML</li>
23
<li>Сформированный гипертекст возвращается веб-серверу через стандартный поток вывода (stdout). Сообщения об ошибках передаются через поток ошибок (stderr)</li>
23
<li>Сформированный гипертекст возвращается веб-серверу через стандартный поток вывода (stdout). Сообщения об ошибках передаются через поток ошибок (stderr)</li>
24
<li>Веб-сервер передает результаты запроса клиенту</li>
24
<li>Веб-сервер передает результаты запроса клиенту</li>
25
</ol><h2>WSGI</h2>
25
</ol><h2>WSGI</h2>
26
<p>У CGI-серверов был один важный недостаток - они запускали скрипты на каждый запрос, значит, каждый раз запускался интерпретатор. В ответ CGI в Python-комьюнити предложили новый стандарт, описанный в<a>PEP3333</a>- WSGI (Web Server Gateway Interface).</p>
26
<p>У CGI-серверов был один важный недостаток - они запускали скрипты на каждый запрос, значит, каждый раз запускался интерпретатор. В ответ CGI в Python-комьюнити предложили новый стандарт, описанный в<a>PEP3333</a>- WSGI (Web Server Gateway Interface).</p>
27
<p>Основная идея WSGI - простое взаимодействие Python-приложения и веб-сервера. Согласно стандарту, веб-приложение - это просто функция или другой callable объект, которая принимает два аргумента</p>
27
<p>Основная идея WSGI - простое взаимодействие Python-приложения и веб-сервера. Согласно стандарту, веб-приложение - это просто функция или другой callable объект, которая принимает два аргумента</p>
28
<ul><li>Словарь переменных окружения</li>
28
<ul><li>Словарь переменных окружения</li>
29
<li>Функцию, которая устанавливает параметры ответа, а возвращает iterable в качестве ответа</li>
29
<li>Функцию, которая устанавливает параметры ответа, а возвращает iterable в качестве ответа</li>
30
</ul><p>Минимальное WSGI-приложение, то есть приложение, которое поддерживает стандарт WSGI, выглядит примерно так:</p>
30
</ul><p>Минимальное WSGI-приложение, то есть приложение, которое поддерживает стандарт WSGI, выглядит примерно так:</p>
31
<p>WSGI-сервер внутри себя вызовет функцию app и с помощью механизма замыканий передаст в нее необходимые аргументы. Все, что касается конкретного запроса, приходит в аргументе environ. Функция start_response() устанавливает параметры ответа. В приведенном примере - размер ответа и тип содержимого. Затем функция просто возвращает итератор, который построчно отдает ответ.</p>
31
<p>WSGI-сервер внутри себя вызовет функцию app и с помощью механизма замыканий передаст в нее необходимые аргументы. Все, что касается конкретного запроса, приходит в аргументе environ. Функция start_response() устанавливает параметры ответа. В приведенном примере - размер ответа и тип содержимого. Затем функция просто возвращает итератор, который построчно отдает ответ.</p>
32
<p>Все современные веб-фреймворки в Python поддерживают стандарт WSGI, то есть предоставляют на верхнем уровне этот callable объект - app во Flask, wsgi модуль в Django. А все WSGI-серверы умеют с этим объектом работать. Некоторые веб-серверы, как nginx, не поддерживают стандарт, но все равно умеют общаться с WSGI совместимыми (gunicorn, uWSGI). Поэтому мы часто будем встречать классическую связку как nginx-gunicorn-Django.</p>
32
<p>Все современные веб-фреймворки в Python поддерживают стандарт WSGI, то есть предоставляют на верхнем уровне этот callable объект - app во Flask, wsgi модуль в Django. А все WSGI-серверы умеют с этим объектом работать. Некоторые веб-серверы, как nginx, не поддерживают стандарт, но все равно умеют общаться с WSGI совместимыми (gunicorn, uWSGI). Поэтому мы часто будем встречать классическую связку как nginx-gunicorn-Django.</p>
33
<h2>Реализации</h2>
33
<h2>Реализации</h2>
34
<p>Веб-серверов довольно много. Самым популярным и эффективным решением на текущий момент является nginx. Именно с ним и стоит познакомиться. Для разработки он не понадобится, но в продакшен-среде без него нельзя.</p>
34
<p>Веб-серверов довольно много. Самым популярным и эффективным решением на текущий момент является nginx. Именно с ним и стоит познакомиться. Для разработки он не понадобится, но в продакшен-среде без него нельзя.</p>
35
<p>Также набирает популярность веб-сервер Caddy, который хоть и не такой быстрый, но обладает рядом важных особенностей. Он значительно проще в настройке, из коробки умеет генерировать сертификаты и многое другое.</p>
35
<p>Также набирает популярность веб-сервер Caddy, который хоть и не такой быстрый, но обладает рядом важных особенностей. Он значительно проще в настройке, из коробки умеет генерировать сертификаты и многое другое.</p>
36
<p>Еще в Python самым популярным решением для WSGI-сервера остается gunicorn. Хоть gunicorn и является полноценным веб-сервером, его чаще используют в связке с nginx или Caddy. Так он отдает все сложности по кешированию, балансировке, раздаче статики, сертификатам и многое другое на их плечи.</p>
36
<p>Еще в Python самым популярным решением для WSGI-сервера остается gunicorn. Хоть gunicorn и является полноценным веб-сервером, его чаще используют в связке с nginx или Caddy. Так он отдает все сложности по кешированию, балансировке, раздаче статики, сертификатам и многое другое на их плечи.</p>