Nginx 浠ュ�堕���ц�斤�绋冲���э�涓板�������斤�绠�������缃���浣�璧�婧�娑������诲��������浠�搴�灞��������� Nginx 涓轰�涔�杩�涔�蹇�锛�

Nginx ��杩�绋�妯″��

Nginx搴�灞�����锛�涓���瑙f��Nginx涓轰�涔�骞跺���板��浠ヨ揪��3w锛�


Nginx ���″��锛�姝e父杩�琛�杩�绋�涓�锛�

  • 澶�杩�绋�锛�涓�涓� Master 杩�绋���澶�涓� Worker 杩�绋���

  • Master 杩�绋�锛�绠$�� Worker 杩�绋���瀵瑰��ュ�o��ユ�跺��ㄧ����浣�锛�淇″�凤�锛�瀵瑰��潘���锛��规��澶��ㄧ����浣���涓���锛���杩�淇″�风�$�� Worker锛����э����� Worker 杩�绋���杩�琛��舵��锛�Worker 杩�绋�寮�甯哥�姝㈠��锛����ㄩ���� Worker 杩�绋���

  • Worker 杩�绋�锛����� Worker 杩�绋��芥��骞崇������疏浚���澶���锛�缃�缁�璇锋�锛��� Worker 杩�绋�澶�����Worker 杩�绋��伴��锛��� nginx.conf 涓���缃�锛�涓���璁剧疆涓烘�稿��起������╃�� CPU 璧�婧�锛����讹��垮��杩�绋��伴��杩�澶�锛��垮��杩�绋�绔�河渠� CPU 璧�婧�锛�澧���涓�涓������㈢��������

  • ����锛�

  • 璇锋���杩��ュ�� Nginx锛�Master 杩�绋�璐�璐e�����潘���锛�

  • 濡�浣���疏浚���涓� Worker 杩�绋�澶���璇锋�锛�璇锋���澶���缁���锛�����杩�瑕�缁�杩� Master 杩�绋�锛�

  • Nginx搴�灞�����锛�涓���瑙f��Nginx涓轰�涔�骞跺���板��浠ヨ揪��3w锛�


    HTTP 杩��ュ缓绔���璇锋�澶���杩�绋�

    HTTP 杩��ュ缓绔���璇锋�澶���杩�绋�濡�涓�锛�

  • Nginx ���ㄦ�讹�Master 杩�绋�锛���杞介��缃���浠躲��

  • Master 杩�绋�锛���彭��������� Socket��

  • Master 杩�绋�锛�Fork �哄�涓� Worker 杩�绋���

  • Worker 杩�绋�锛�绔�河渠��扮演��杩��ワ��疯���归��杩�涓�娆℃�℃��锛�寤虹�� Socket 杩��ワ�骞跺���璇锋���

  • Nginx 楂��ц�姐��楂�骞跺��

    Nginx 涓轰�涔��ユ��楂��ц�藉苟涓��藉�����楂�骞跺��锛�

  • Nginx ���ㄥ�杩�绋�+寮�姝ラ���诲��瑰�锛�IO 澶�璺�澶��� Epoll锛���

  • 璇锋���疏浚��磋�绋�锛�寤虹��杩��モ��璇诲��璇锋���瑙f��璇锋���澶���璇锋�����搴�璇锋���

  • 璇锋���疏浚��磋�绋�瀵瑰��板�灞�广大辨��锛�璇诲�� Socket 河渠�浠躲��

  • Nginx ��河渠�浠跺���妯″��

    Request锛�Nginx 涓� HTTP 璇锋���

    �烘���� HTTP Web Server 宸ヤ�妯″�锛�

  • �ユ�惰�锋�锛���琛�璇诲��璇锋�琛���璇锋�澶达��ゆ��娈垫��璇锋�浣���锛�璇诲��璇锋�浣���

  • 澶���璇锋���

  • 杩�����搴�锛��规��澶���缁���锛������稿��� HTTP 璇锋�锛���搴�琛�����搴�澶淬����搴�浣�锛���

  • Nginx 涔���杩�涓�濂�璺�锛��翠�娴�绋�涓��达�

    Nginx搴�灞�����锛�涓���瑙f��Nginx涓轰�涔�骞跺���板��浠ヨ揪��3w锛�


    妯″����浣�绯荤���

    Nginx搴�灞�����锛�涓���瑙f��Nginx涓轰�涔�骞跺���板��浠ヨ揪��3w锛�


    Nginx ��妯″���规���跺���藉�烘��涓���浠ュ��涓轰互涓���绉�绫诲��锛�

    ��event module锛���寤轰���绔�河渠���浣�绯荤���河渠�浠跺����哄�剁��妗��讹�����岛�河渠����蜂�河渠�浠剁��澶��������� ngx_events_module锛�ngx_event_core_module �� ngx_epoll_module 绛���

    Nginx �蜂�浣跨�ㄤ�绉�河渠�浠跺���妯″��锛�杩�岛�璧�河渠��蜂�����浣�绯荤���缂�璇���椤广��

    ��phase handler锛�姝ょ把����妯″��涔�琚��存�ョО涓� handler 妯″����涓昏�璐�璐e���疏浚㈡�风��璇锋�骞朵骇��寰���搴���疏浚癸�姣�濡� ngx_http_static_module 妯″��锛�璐�璐e�㈡�风��������椤甸�㈣�锋�澶���骞跺�瀵瑰���纾�����浠跺��澶�涓哄��搴���疏浚硅��恒��

    ��output filter锛�涔�绉颁负 filter 妯″��锛�涓昏���璐�璐e�硅��雾����疏浚硅�琛�澶���锛���浠ュ�硅��鸿�琛�淇��无边��

    岛�濡�锛���浠ュ���板�硅��雾������ html 椤甸�㈠���棰�疏浚�涔��� footbar 涓�绫荤��宸ヤ�锛�����瀵硅��雾���剧���� URL 杩�琛��挎��涔�绫荤��宸ヤ���

    ��upstream锛�upstream 妯″��疏浚��板����浠g�������斤�广大���姝g��璇锋�潘����板��绔����″�ㄤ�锛�骞朵���绔����″�ㄤ�璇诲����搴�锛�����疏浚㈡�风����

    upstream 妯″����涓�绉��规���� handler锛���涓�杩���搴���疏浚逛�����姝g�辫��宸变骇����锛�����浠���绔����″�ㄤ�璇诲������

    ��load-balancer锛�璐�潘藉��琛℃ā��锛�疏浚��扮演�瑰����绠�娉�锛��ㄤ�澶�����绔����″�ㄤ腑锛����╀�涓����″�ㄥ�烘�ヤ�涓烘��涓�璇锋���潘������″�ㄣ��

    甯歌���棰�����

    Nginx vs Apache

    Nginx锛�

  • IO 澶�璺�澶���锛�Epoll锛�freebsd 涓��� kqueue锛�

  • 楂��ц��

  • 楂�骞跺��

  • ���ㄧ郴缁�璧�婧�广大�

  • Apache锛�

  • �诲�+澶�杩�绋�/澶�绾跨�

  • �寸ǔ疏浚�锛�Bug 广大�

  • 妯″���翠赴瀵�

  • Nginx ��澶ц��ユ��

    �雾�����锛�

  • Nginx ��澶�杩�绋�妯″��锛�Worker 杩�绋��ㄤ�澶���璇锋���

  • ��涓�杩�绋���杩��ユ�起���浠舵��杩扮�� fd锛�锛���涓���锛�nofile锛�锛�ulimit -n��

  • Nginx 涓���缃���涓� Worker 杩�绋�����澶ц��ユ�起�worker_connections 涓���涓� nofile��

  • Nginx 涓���缃� Worker 杩�绋����伴��锛�worker_processes��

  • ��姝わ�Nginx ����澶ц��ユ�起�

  • Nginx ����澶ц��ユ�起�Worker 杩�绋��伴�� x ��涓� Worker 杩�绋�����澶ц��ユ�般��

  • 涓��㈡�� Nginx 浣�涓洪���ㄦ���″�ㄦ�讹���澶х��杩��ユ�般��

  • Nginx 浣�涓哄����浠g�����″�ㄦ�讹��藉����$����澶ц��ユ�起�锛�Worker 杩�绋��伴�� x ��涓� Worker 杩�绋�����澶ц��ユ�起�/ 2��

  • Nginx ����浠g���讹�浼�寤虹�� Client ��杩��ュ����绔� Web Server ��杩��ワ����� 2 涓�杩��ャ��

  • ����锛�

  • 姣���寮�涓�涓� Socket ���ㄤ�涓� fd锛�

  • 涓轰�涔�锛�涓�涓�杩�绋��藉���寮��� fd �伴�������讹�

  • HTTP 璇锋�����搴�

    HTTP 璇锋�锛�

  • 璇锋�琛�锛�method��uri��http version

  • 璇锋�澶�

  • 璇锋�浣�

  • HTTP ��搴�锛�

  • ��搴�琛�锛�http version��status code

  • ��搴�澶�

  • ��搴�浣�

  • IO 妯″��

    澶���澶�涓�璇锋��讹���浠ラ����锛�IO 澶�璺�澶��ㄦ�����诲� IO+澶�绾跨�锛�

  • IO 澶�璺�澶���锛�涓�涓�绾跨�锛�璺�韪�澶�涓� Socket �舵��锛���涓�广大辩华锛�广大辫�诲����涓���

  • �诲� IO+澶�绾跨�锛�姣�涓�涓�璇锋�锛��板缓涓�涓����$嚎绋���

  • IO 澶�璺�澶��ㄥ��澶�绾跨������ㄥ�烘��锛�

  • IO 澶�璺�澶���锛���涓�杩��ョ��璇锋�澶�����搴�娌℃��浼��裤��

  • 澶у苟����锛���浣跨�ㄤ�涓�绾跨�锛�澶���澶ч����骞跺��璇锋�锛���浣�涓�涓�����澧����㈡����锛�涔�涓���瑕�����骞跺����棰�锛��稿�瑰��浠ュ����村���璇锋���

  • 娑����村���绯荤�璧�婧�锛�涓���瑕�绾跨�璋�搴�寮���锛���

  • ���ㄤ��胯��ョ�����碉�澶�绾跨�妯″��胯��ュ�规������绾跨�杩�澶�锛�����棰�绻�璋�搴�锛���

  • �诲� IO +澶�绾跨�锛�疏浚��扮演����锛���浠ヤ�岛�璧�绯荤�璋��ㄣ��

  • 姣�涓�绾跨�锛��介��瑕��堕�村��绌洪�淬��

  • 绾跨��伴��澧��挎�讹�绾跨�璋�搴�寮������板��裤��

  • select/poll �� epoll 姣�杈�濡�涓�锛�

    select/poll 绯荤�璋���锛�

    //�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 (File descripter) 广大辩华��瓒��惰�����

  • fd_set ��涓�涓�浣�����锛�澶у����ㄧ�璇����告�剁��甯搁��锛�榛�璁ゅぇ广大�涓� 1024��

  • �圭�戊寅�杩��ユ�伴���讹�fd_set ��琛ㄧず�� fd �伴��澶�广大�河渠�锛�绾挎�ф����锛��ゆ�� fd ����广大辩华锛���瑕�����涓�杈� fd_set锛��版��澶��讹��ㄦ�风┖�村�����哥┖�达�澶��惰��ュ氨缁��舵��淇℃����

  • poll锛�

  • 瑙e�充�杩��ユ�伴���讹�poll 涓�广大� select 涓��� fd_set �挎�㈡��河渠�涓�涓� pollfd �扮演�锛�瑙e�� fd �伴��杩�广大�����棰���

  • �版��澶��讹��ㄦ�风┖�村�����哥┖�达�澶��惰��ュ氨缁��舵��淇℃����

  • epoll锛�event 河渠�浠堕┍��锛�

  • 河渠�浠舵�哄�讹��垮��绾挎�ф����锛�涓烘��涓� fd锛�娉ㄥ��涓�涓�����河渠�浠讹�fd ���翠负灏辩华�讹�广大� fd 娣诲���板氨缁��捐〃��

  • fd �伴��锛������讹�OS 绾у�������讹���涓�杩�绋��芥��寮�澶�广大�涓� fd锛���

  • select锛�poll锛�epoll锛�

  • I/O 澶�璺�澶��ㄧ���哄�躲��

  • I/O 澶�璺�澶��ㄥ氨��杩�涓�绉��哄�讹���浠ョ��瑙�澶�涓���杩扮��锛�涓�����涓���杩扮��广大辩华锛�涓�����璇诲氨缁�������广大辩华锛�锛��藉����ョ�搴�杩�琛��稿���璇诲����浣�锛���瑙�澶�涓���浠舵��杩扮����

  • 浣� select锛�poll锛�epoll ��璐ㄤ��芥����姝� I/O锛��ㄦ�疯�绋�璐�璐h�诲��锛�浠����哥┖�存�疯��扮演�ㄦ�风┖�达�锛�璇诲��杩�绋�涓�锛��ㄦ�疯�绋����诲���锛�寮�姝� IO锛������ㄦ�疯�绋�璐�璐h�诲��锛�寮�姝� IO锛�浼�璐�璐d����哥┖�存�疯��扮演�ㄦ�风┖�淬��

  • Nginx ��骞跺��澶����藉��

    �充� Nginx ��骞跺��澶����藉��锛�骞跺��杩��ユ�起�涓���浼�����锛�宄板�艰�戒����� 1~3w 宸��炽��锛���海洋��� CPU �稿��颁���锛�浼���杩�涓�姝ヤ���绌洪�达���