Фундаментальный
Модель процесса Nginx
Сервер Nginx при нормальной работе:
- мультипрогресс: один главный процесс, несколько рабочих процессов
-
Основной процесс: Управление рабочими процессами
- Внешний интерфейс: получить
外部的操作
(Сигнал) - Входящая переадресация: согласно
外部的操作
разница, через信号
Управление работниками - Мониторинг: отслеживайте текущее состояние рабочего процесса и автоматически перезапускайте рабочий процесс после аварийного завершения рабочего процесса.
- Внешний интерфейс: получить
-
Рабочий процесс: все рабочие процессы равны
- Фактическая обработка: сетевые запросы, обрабатываемые рабочим процессом;
- Количество рабочих процессов: настраивается в nginx.conf, обычно установлено значение
核心数
, полностью использовать ресурсы ЦП и в то же время избегать слишком большого количества процессов, избегать конкуренции процессов за ресурсы ЦП и увеличивать потери при переключении контекста.
считать:
- Запрос подключен к Nginx, а процесс Master отвечает за обработку и пересылку?
- Как выбрать, какой рабочий процесс будет обрабатывать запрос? Проходит ли результат обработки запроса через главный процесс?
Установление HTTP-соединения и обработка запросов:
- При запуске Nginx процесс Master загружает файл конфигурации.
- Мастер-процесс, который инициализирует прослушивающий сокет
- Мастер-процесс, разветвление нескольких рабочих процессов
- Процесс Worker соревнуется за новые соединения, победившая сторона устанавливает соединение Socket через трехстороннее рукопожатие и обрабатывает запрос.
Высокая производительность Nginx, высокий параллелизм:
- Nginx использует:
多进程
+异步非阻塞
Способ(IO 多路复用
Эполл) - Полный процесс запроса:
- установить соединение
- запрос на чтение: разбор запроса
- обработать запрос
- Отвечать на запросы
- Полный процесс запроса, соответствующий нижнему слою, таков: чтение и запись событий сокета.
Модель обработки событий Nginx
request: http-запрос в Nginx.
Базовый режим работы веб-сервера HTTP:
-
получить запрос: читать построчно
请求行
а также请求头
, посчитав, что у сегмента есть тело запроса, прочтите请求体
- обработать запрос
-
вернуть ответ: По результату обработки сформировать соответствующий HTTP-запрос (
响应行
,响应头
,响应体
)
Nginx — это та же рутина, и общий процесс такой же.
Модульная архитектура
Модули nginx можно условно разделить на следующие типы в зависимости от их функций:
- event module: Создайте структуру механизма обработки событий, независимую от операционной системы, и обеспечьте обработку определенных событий. Включая ngx_events_module, ngx_event_core_module и ngx_epoll_module и т. д. Какой модуль обработки событий использует nginx, зависит от конкретной операционной системы и параметров компиляции.
- phase handler: Модули этого типа также напрямую называются модулями-обработчиками. Он в основном отвечает за обработку клиентских запросов и создание содержимого, на которое нужно ответить, например, модуль ngx_http_static_module, который отвечает за обработку запроса статической страницы клиента и подготовку соответствующего файла на диске для вывода содержимого ответа.
- output filter: также известный как модуль фильтра, он в основном отвечает за обработку выходного содержимого и может изменять вывод. Например, может быть реализована такая работа, как добавление предопределенной нижней панели ко всем выходным HTML-страницам или замена URL-адреса выходного изображения.
- upstream: восходящий модуль реализует функцию обратного прокси, перенаправляет реальный запрос на внутренний сервер, считывает ответ с внутреннего сервера и отправляет его обратно клиенту. Upstream-модуль — это специальный обработчик, но содержимое ответа на самом деле не генерируется само по себе, а считывается с внутреннего сервера.
- load-balancer: модуль балансировки нагрузки реализует определенный алгоритм и выбирает сервер в качестве сервера пересылки для запроса среди множества внутренних серверов.
Анализ общих проблем
Nginx vs. Apache
nginx против апача:
Модель сетевого ввода-вывода:
- nginx: мультиплексирование ввода-вывода, epoll (kqueue на freebsd)
- высокая производительность
- Высокий параллелизм
- Занимают меньше системных ресурсов
- Apache: блокировка + многопроцессорность/многопоточность
- более стабильный и менее глючный
- больше модулей
Ссылаться на:Ууху. Call.com/question/19…
Сцены:
При обработке нескольких запросов вы можете использовать:
IO 多路复用
или阻塞 IO
+多线程
- мультиплексирование ввода-вывода:
一个
线程
, который отслеживает несколько состояний сокетов,就绪
, в зависимости от того, что читается или пишется;- блокировка ввода-вывода + Многопоточность: для каждого запроса создайте новый сервисный поток.
считать:IO 多路复用
а также多线程
применимые сценарии?
-
IO 多路复用
: Нет преимущества в скорости обработки запросов одного соединения, подходит дляИнтенсивный ввод-выводсцена, управляемая событиями- большой параллелизм: использовать только один поток, обрабатывать большое количество одновременных запросов, сокращатьконтекстПотери при переключении, нет необходимости учитывать проблемы параллелизма, можно обработать относительно больше запросов;
- Потреблять меньше системных ресурсов (не требуется
线程调度开销
) - применять к
长连接
case (многопоточный режим长连接
Легко вызывает线程过多
,причина频繁调度
)
-
阻塞IO
+多线程
: Прост в реализации, не может полагаться на системные вызовы, подходит дляинтенсивное использование процессораСцены- Каждая нить требует времени и места;
- Когда количество потоков растет, накладные расходы на планирование потоков растут экспоненциально.
Nginx максимальное количество подключений
Основной фон:
- Nginx — это многопроцессная модель, и для обработки запросов используется рабочий процесс;
- Количество подключений (файловый дескриптор fd) для одного процесса с верхним пределом (
nofile
):ulimit -n
- Настройте максимальное количество соединений для одного рабочего процесса на Nginx:
worker_connections
ограниченоnofile
- Настройте количество рабочих процессов на Nginx:
worker_processes
Поэтому максимальное количество подключений для Nginx:
- Максимальное количество подключений к Nginx:
Worker 进程数量
x单个 Worker 进程的最大连接数
- Выше указано максимальное количество подключений при использовании Nginx в качестве основного сервера.
- Nginx как
反向代理
сервер, максимальное количество подключений, которые можно обслужить :(Worker 进程数量
x单个 Worker 进程的最大连接数
)/ 2. - Когда обратный прокси-сервер Nginx установит
Client 的连接
а также后端 Web Server 的连接
, занимает 2 соединения
считать:
- Каждый открытый сокет занимает один fd
- Почему,
一个进程
Есть ли ограничение на количество открываемых fd?
приложение
HTTP-запросы и ответы
- HTTP-запрос:
- Строка запроса:
method
,uri
,http version
- заголовок запроса
- тело запроса
- Строка запроса:
- HTTP-ответ:
- Строка ответа:
http version
,status code
- заголовок ответа
- тело ответа
- Строка ответа:
Модель ввода-вывода
Сцены:
При обработке нескольких запросов вы можете использовать:
IO 多路复用
или阻塞 IO
+多线程
- мультиплексирование ввода-вывода:
一个
线程
, который отслеживает несколько состояний сокетов,就绪
, в зависимости от того, что читается или пишется;- блокировка ввода-вывода + Многопоточность: для каждого запроса создайте новый сервисный поток.
считать:IO 多路复用
а также多线程
применимые сценарии?
-
IO 多路复用
: нет преимущества в скорости обработки запросов от одного подключения- большой параллелизм: использовать только один поток, обрабатывать большое количество одновременных запросов, сокращатьконтекстПотери при переключении, нет необходимости учитывать проблемы параллелизма, можно обработать относительно больше запросов;
- Потреблять меньше системных ресурсов (не требуется
线程调度开销
) - применять к
长连接
case (многопоточный режим长连接
Легко вызывает线程过多
,причина频繁调度
)
-
阻塞IO
+多线程
: Реализация проста и не может полагаться на системные вызовы.- Каждая нить требует времени и места;
- Когда количество потоков растет, накладные расходы на планирование потоков растут экспоненциально.
Сравнение select/poll и epoll
Для получения подробной информации см.:
выбрать/опросить системный вызов:
// select 系统调用int select(int maxfdp,fd_set *readfds,fd_set *writefds,fd_set *errorfds,struct timeval *timeout); // poll 系统调用int poll(struct pollfd fds[], nfds_t nfds, int timeout);
select:
- Запрос fd_set, есть ли
就绪
изfd
, вы можете установить超时时间
, когда fd (файловый дескриптор) готов или истекло время ожидания; - fd_set — это
位集合
, размер указан编译内核
константа, размер по умолчанию 1024 - Функции:
- Лимит подключений, число fd, которое может быть представлено fd_set, слишком мало;
- Линейное сканирование: Чтобы определить, готов ли fd, вам нужно пройти одну сторону fd_set;
- репликация данных: пространство пользователя и пространство ядра, копироватьсостояние готовности соединенияИнформация
poll:
- решеноЛимит подключений:
- В опросе fd_set в select заменяется на pollfd
数组
- решать
fd 数量过小
Проблема
- В опросе fd_set в select заменяется на pollfd
- репликация данных: пространство пользователя и пространство ядра, копироватьсостояние готовности соединенияИнформация
epoll: событие управляемое событием
-
механизм события:избегатьЛинейное сканирование
- для каждого фд,
注册
Один监听事件
- фд изменился на
就绪
, добавить fd в就绪链表
- для каждого фд,
- количество фд: Неограничено (ограничение на уровне ОС, сколько fds может быть открыто одним процессом)
выбрать, опрос, epoll:
-
I/O多路复用
Механизмы; -
I/O多路复用
С помощью механизма можно отслеживать несколько дескрипторов, и как только дескриптор готов (обычно готов к чтению или записи), программа может быть уведомлена о выполнении соответствующих операций чтения и записи.- монитор
多个文件描述符
- монитор
- А вот select, poll, epoll по сути все
同步I/O
:-
用户进程
ответственный读写
(от内核空间
скопировать в用户空间
), в процессе чтения и записи пользовательский процесс блокируется; -
异步 IO
, без того, чтобы пользовательский процесс отвечал за чтение и запись, асинхронный ввод-вывод будет отвечать за内核空间
скопировать в用户空间
;
-
Возможности параллельной обработки Nginx
Что касается возможностей параллельной обработки Nginx:
- Количество одновременных подключений после общей оптимизации может поддерживаться на уровне около 1~3 Вт. (Количество памяти и процессорных ядер разное, будет место для дальнейшей оптимизации)
адрес блога:www.liangsonghua.com
Обратите внимание на общедоступную учетную запись WeChat: отчет о консервированных яйцах Songhua Preserved Egg на доске, становитесь более захватывающим!
Введение в общедоступную учетную запись: делитесь техническими знаниями о работе на JD.com, а также технологиями JAVA и лучшими отраслевыми практиками, большинство из которых являются прагматичными, понятными и воспроизводимыми.