Титла: Конфигурация за уеб сървър Публикувано от: bILLY в Aug 21, 2015, 20:00 И ако искате може и да коментирате :)
Титла: Re: Конфигурация за уеб сървър Публикувано от: pennywise в Aug 21, 2015, 23:46 Трябваше да има опция само Nginx. Поне за php+mysql е най-добрата опция според мен, а със fastcgi можеш да кешираш, също nginx има microcache ама то може да причини малко неудобства. С apache обаче може лесно да добавяш модули, и не е нужно да компилираш всичко отново.
Всичко зависи от ситуацията, но като знам, че питаш за WordPress мисля, че Nginx+phpfastgi е добра комбинация. Ама да знаеш, че има няколко подводни камъка :) Титла: Re: Конфигурация за уеб сървър Публикувано от: jet в Aug 22, 2015, 00:53 Apache + SSD disk
Титла: Re: Конфигурация за уеб сървър Публикувано от: gat3way в Aug 22, 2015, 02:28 Тотално няма значение. Сървърът няма толкова голямо значение, всичко зависи от това какво и как прави приложението. Съвсем извън това, дори и това е ирелевантно, понеже днес скалирането е евтино и лесно и пак опираме до приложението, което може и да не може да се скалира лесно и евтино. Иначе има една стара дилема изкристализирала под формата на драмата с C10K проблема - и случаите и решенията са доволно много и доволно различни за да може отговорът да опре до "ползвам apache+varnish" или "ползваме nginx който reverse-проксира и балансира няколко инстанции на tornado приложение". Апропо където има значение, и в общия случай когато трябва просто да си хостнеш блога някъде, няма никакво значение, но все пак - когато това вече има значение, трябва да си доволно малоумен за да довериш избора на хора, за които всичко опира до сценариите описани в анкетата, без никакви негативни помисли. Така че спокойно, когато такива решения трябва да се вземат, то обикновено последните хора, които биват запитани са същите тези хора, които спорят за дистрибуции, графични среди или уеб сървъри защото нещо им се струвалo по-удобнo и по-приятнo.
Та накратко въпросът е горе-долу от сорта на какъв производител на превозни средства бихте избрали ако искахте да стигнете от София до Лондон - обаче без да се уточнява точно колко и какъв багаж ще се носи, дали има значение колко бързо ще се стигне дотам и дали цената е критерий. Титла: Re: Конфигурация за уеб сървър Публикувано от: BRADATA в Aug 22, 2015, 07:14 Абсолютно некоректно зададен въпрос... Ама гейта е дал уникален пример :). Има и нещо друго - огромно значение има и СУБД дето дава дейтата отзад. Та така...
Титла: Re: Конфигурация за уеб сървър Публикувано от: NorthBridge в Aug 22, 2015, 15:28 Има и нещо друго - огромно значение има и СУБД дето дава дейтата отзад. Та така... Ъъъ, какво общо има субд-то с уеб сървъра? Иначе няма голямо значение, имаше един пич дето му беше писнало да обясняват че nginx бил не знам колко пъти по-бърз от Apache, хвана се, направи една камара бенчове и в крайна сметка стигна до извода че двата са на практика с еднакъв performance, с лек превес за nginx при сервиране на статично съдържание. Така че май отговорът е "който те кефи повече". Аз преди ползвах само Apache. После ми се наложи да свикна с nginx, две седмици го псувах, после ми се видя по-лесно даже и от Apache. Иначе добавете и lighttpd в отговорите :) Титла: Re: Конфигурация за уеб сървър Публикувано от: BRADATA в Aug 22, 2015, 15:35 Ми от контекста на писанките от Били става ясно, че той иска да ползва распбери за да хоства уордпрес сайтове и разни други динамични неща, ползващи СУБД. Та за това има общо...Има и нещо друго - огромно значение има и СУБД дето дава дейтата отзад. Та така... Титла: Re: Конфигурация за уеб сървър Публикувано от: gat3way в Aug 22, 2015, 17:21 Има грубо три подхода при писане не само на уеб приложение/уеб сървър, но и на какъвто и да е сървър. Най-тривиалният е с pool от worker процеси, всяка клиентска връзка се обслужва от един такъв - това е най-лесният за реализиране, защото се избягват разни криви проблеми. Но от гледна точка на производителност също и най-неоптималния - защото е ресурсоемък и защото има огромен overhead от превключвания на контексти, интерпроцесна комуникация, латентност при форкване на нови процеси когато се налага и т.н. Но това е начина по който се случват в масовия случай нещата с apache/mod_php.
Вторият подход е сходен с първия - само че worker-ите не са процеси, а нишки. Това позволява по-малки разхищения на памет, по-евтино превключване между контексти, споделената памет лесно се използва за бърза комуникация между нишките и като цяло позволява по-висок брой обслужени паралелни заявки за същото време. Обаче това създава и проблеми - уеб приложението трябва да е thread-safe, а специално PHP много дълго време имаше проблеми с това и дори не знам дали към днешно време са решени изцяло. Което е по-криво, проблемите се случват в PHP интерпретатора и не винаги са очевидни. Apache го подържа, просто трябва да се използва друг mpm модел, не mpm_prefork. Третият подход е радикално различен - там нямаме отделни worker процеси и нишки за всяка заявка, вместо това всички използвани сокети се вкарват в един fd set и се ползва select()/poll()/epoll()/etc за да се poll-ва set-а за събития - когато на някой файлов дескриптор се появи събитие, съответно заявката се обслужва. Това е едновременно и благодат и проклятие - ако всичко е написано като хората, резултатите са с порядъци по-добри от подхода с worker-ите, ако обаче не е - тогава резултатите са плачевни. Проблемът е че това е до известна степен друга парадигма - приложението трябва да се напише така че да работи по този начин и писането на такива приложения е тотално различно и доста досадно. И всичко трябва да е направено с идеята да работи така - например handler-ите за заявките ти може да са асинхронни, но ако правят синхронни заявки към базата, това означава че докато тече тази заявка, сървърът не може да обслужва нищо друго и останалите клиенти стоят и чакат. Така че файловите дескриптори ползвани при достъпване на базата също трябва да се вкарат във fd set-а и да минават през polling механизъма. Като цяло, PHP като език и като имплементация е тотално непригоден за да се пишат такива приложения и затова при такива случаи се ползват разни по-екзотични неща като node.js или пък tornado. В apache имаше някакъв експериментален event-базиран mpm модел доколкото помня - въпреки че е абсолютно непригоден за използване с PHP приложения изпълнявани през mod_php, просто смисълът се губи. Асинхронния/event-базиран подход също сам по себе си не е перфектен, защото когато всичко се обслужва в рамките на един процес, сървърът с приложението не може да утилизира многоядрена/многопроцесорна машина. Затова съответно има хибридни изпълнения - няколко worker-а с poll-ване на отделни множества от файлови дескриптори. И най-накрая, тези неща като цяло в последно време не са толкова важни, откакто се появиха облаците и стана лесно да си вдигнеш като ти кефне нова инстанция. Като цяло това кара хората да се замислят повече за лесното скалиране на приложението, отколкото за оптималното изтискване на ресурсите. Като това не винаги е прост проблем, лесен за решаване. Титла: Re: Конфигурация за уеб сървър Публикувано от: daniel_vulchev в Aug 22, 2015, 23:05 Мериш с рулетката и преценяш кое да ползваш може и исс сървър да е
Титла: Re: Конфигурация за уеб сървър Публикувано от: NorthBridge в Aug 23, 2015, 14:21 Обаче това създава и проблеми - уеб приложението трябва да е thread-safe, а специално PHP много дълго време имаше проблеми с това и дори не знам дали към днешно време са решени изцяло. Хм, последно като гледах имаше един списък с 6-7 extensions, които не бяха thread-safe, останалото беше ОК. Едни колеги бяха тръгнали да пишат нещо по този тертип, не съм ги чувал да се оплакват от езика. Цитат Третият подход е радикално различен - там нямаме отделни worker процеси и нишки за всяка заявка, вместо това всички използвани сокети се вкарват в един fd set и се ползва select()/poll()/epoll()/etc за да се poll-ва set-а за събития Не бях чувал за това :) Можеш ли да пратиш линк към някое гитхъбско репо писано така да разгледам, че ми стана интересно? Цитат И най-накрая, тези неща като цяло в последно време не са толкова важни, откакто се появиха облаците и стана лесно да си вдигнеш като ти кефне нова инстанция. Като цяло това кара хората да се замислят повече за лесното скалиране на приложението, отколкото за оптималното изтискване на ресурсите. Като това не винаги е прост проблем, лесен за решаване. Е това е нормално, никой няма да си играе да пише оптимизации при положение че може просто да налее още малко долари на месец и да си вдигне параметрите на чарколяка който наема. Стига да не стигнеш момента когато тези пари ще станат неприятно големи, и тогава щеш не щеш ще ти се наложи да правиш магии ;D Титла: Re: Конфигурация за уеб сървър Публикувано от: gat3way в Aug 23, 2015, 15:02 Цитат Не бях чувал за това :) Можеш ли да пратиш линк към някое гитхъбско репо писано така да разгледам, че ми стана интересно? Мммм произволно node.js приложение предполагам. Макар че аз поне node.js никога не съм пипал, javascript нещо не ми е от любимите неща, такива неща съм правил на питон с tornado фреймуърка. Та предполагам из github ще има доста tornado неща също, за тях бих могъл да коментирам повече какво и как го правят :) P.S всъщност торнадо-то си идва с доста демо примери, може да хвърлиш едно око: https://github.com/tornadoweb/tornado/tree/master/demos Титла: Re: Конфигурация за уеб сървър Публикувано от: Naka в Aug 23, 2015, 16:13 Добре де аз кой подход съм правил ??? ??? Преди се опитвах да правя на PHP сървер... и го направих и ми върши работа.
Общо взето в тази последователност: socket_create() socket_bind() socket_listen() след това с socket_select() се определят сокетите на които има движение, а чрез socket_accept() се приема нова клиентска конекция ако има такава и се добавят в $client_socks[]. правят се два масива: $client_socks[] с всички активни клиентски сокети и масива $read[], които са тези сокети сред активните на които е детекнато движение. След това по този списък се облужват(четат) един по-един тези на които преди това е детекното движението. е това е кода дето успях да скалъпя...Орязъл съм го за пригледност така че може да има и несъответсвия. Код
Обаче въпроса който ме мъчи е как може да се ограничи броя на приеманите конекции? например разрешени са три едновременни конекции и искам на четвъртият клиент да му се откаже конекциятя? да му се върне нещо то рода на Server busy, access denied..... Това не можах да разбера как се прави и дали изобщо е възможно с tcp? в socket_listen() има параметър дето се нарича 'backlog' той е някакъв кърнелси стек? за броя конекции но изобщо не оказва влияние на броя конекции. Едиственото което успях да измисля е като дойде 4-та конекция да я приема да изпиша нещо към клиента от рода на Server busy и веднага да затворя съответният клиентски сокет? Титла: Re: Конфигурация за уеб сървър Публикувано от: gat3way в Aug 23, 2015, 16:28 Не точно, backlog-а е по-скоро максималния брой на клиентските връзки които чакат да ги accept-неш, а като удариш тази бройка на клиентите им се връща обикновено грешка при connect() и вече си е тяхна работа дали да върнат грешка или да пробват отново.
Няма нещо наготово, което да те лимитира колко клиентски връзки да приемеш - това си зависи от теб. Може примерно да пазиш броя на клиентските връзки и като стигнеш до максимума отворени, да не accept-ваш нови. Цитат Добре де аз кой подход съм правил ??? ??? Преди се опитвах да правя на PHP сървер... и го направих и ми върши работа. Ами третия, само че не оптимално. Апропо, нещата са описани доста по-детайлно тук: http://www.kegel.com/c10k.html Титла: Re: Конфигурация за уеб сървър Публикувано от: Naka в Aug 23, 2015, 16:50 Ами третия, само че не оптимално. В смисъл? че третият подход не е оптимален или че греша някъде в постановката. Скорост и ниска латенция изобщо не ми е нужна, защото процеса който обслужва е хиляди пъти по бавен. Единствено ме интересува постановката да е правилна, защото все имам неприятно усещане че нещо греша със сокетите. Цитат Може примерно да пазиш броя на клиентските връзки и като стигнеш до максимума отворени, да не accept-ваш нови. Да но те се трупат в опашката точно заради backlog-а. например клиентите 4,5,6,7,..... седят и чакат и по никакъв начин не могът да разберат че немогат да се вържат. Едва когато се затвори някоя от активните конекции от 1,2,3 тогава на някой от чакащите му идва реда. А аз това не искам да се случва. Титла: Re: Конфигурация за уеб сървър Публикувано от: gat3way в Aug 23, 2015, 17:23 В смисъл че не ползваш неблокиращо IO и че select е бавно и лимитирано откъм максимален брой дескриптори в сета. Но ако производителността не е критична, значи няма значение.
А иначе, backlog-а няма отношение към това дали затваряш активни конекции. Можеш да затвориш всички, но да не викаш accept и тогава ще продължат да се трупат там, просто ако искаш да сложиш твърд лимит на активните клиенти го прави преди accept и да не ти пука толкова за опашката чакащи - това така или иначе е работа на операционната система, ти единствено можеш да кажеш колко да се трупат там преди да почне да им се връща грешка. Титла: Re: Конфигурация за уеб сървър Публикувано от: Naka в Aug 23, 2015, 17:32 :D Колкото и да се мъчих да го направя неблокиращо не ми се получаваше!!! Едва когато ги направих в blocking-mode тогава тръгна както трябва.
Титла: Re: Конфигурация за уеб сървър Публикувано от: gat3way в Aug 23, 2015, 17:45 Вярно е, кочината много бързо става пълна с неблокиращи сокети. Особено като ги poll-ваш и почнат нон-стоп да ти се връщат "фалшиви" събития.
|