Видове уеб сървъри или Защо Apache
Първо, трябва да обясните как обикновено работят мрежовите сървъри. Запознатите с мрежовото програмиране знаят, че по същество съществуват три модела на сървърна работа:
- Последователен. Сървърът отваря гнездо за слушане и изчаква да се появи връзка (докато чака, той е в блокирано състояние). Когато връзката пристигне, сървърът я обработва в същия контекст, затваря връзката и изчаква връзката отново. Очевидно това далеч не е най-добрият начин, особено когато работата с клиента отнема много време и има много връзки. Освен това последователният модел има много повече недостатъци (например невъзможността да се използват множество процесори) и в реални условия той практически не се използва.
- Мултипроцес (многонишков). Сървърът отваря гнездо за слушане. Когато връзката пристигне, тя я приема, след което създава (или взема от пула на предварително създадени) нов процес или нишка, които могат да работят с връзката толкова дълго, колкото е необходимо, и след завършване на работата, излезте или се върнете към басейна. Междувременно основната нишка е готова да приеме нова връзка. Това е най-популярният модел, тъй като е сравнително лесен за изпълнение, позволява сложни и отнемащи време изчисления за всеки клиент и използва всички налични процесори. Пример за използването му е уеб сървърът на Apache. Този подход обаче има и недостатъци: при голям брой едновременни връзки се създават много нишки (или, още по-лошо, процеси), а операционната система губи много ресурси за превключване на контекста. Особено лошо е, когато клиентите приемат съдържание много бавно. Съществуват стотици нишки или процеси, които са заети само с изпращане на данни до бавни клиенти, което създава допълнително натоварване на планировчика на операционната система, увеличава броя на прекъсванията и консумира много памет.
- Неблокиращи гнезда/държавна машина. Сървърът работи в рамките на една нишка, но използва неблокиращи сокети и механизъм за анкета. Тези. сървърът при всяка итерация на безкраен цикъл избира от всички сокети този, който е готов за получаване/изпращане на данни, като използва повикването select (). След като е избран сокет, сървърът му изпраща данни или ги чете, но не чака потвърждение, а преминава в първоначално състояние и чака събитие в друг сокет, или обработва следващото, в което събитието е настъпило обработка на предишната. Този модел използва процесора и паметта много ефективно, но е доста труден за изпълнение. В допълнение, в рамките на този модел, обработката на събитие в сокет трябва да бъде много бърза - в противен случай много събития ще се натрупват в опашката и в крайна сметка тя ще прелее. Ето как работи nginx. Освен това ви позволява да стартирате множество работни процеси (наречени работници), т.е. може да използва множество процесори.