Ценителям тонких извращений. NGINX под Виндой.

Самые популярные товары с Али по лучшей цене:

Оригинальный RTL-SDR v3 c TCXO 2908 руб.
Зарядное устройство USB Quick Charge3, 4 порта 200 руб.
FM/MW/SW приемник 2000 руб.

16 ноября 2011, 22:10

Ценителям тонких извращений. NGINX под Виндой.

Игорь Сысоев, автор NGINX.

Демону сложно
Уцелеть в нашем мире.
Помочь ему надо...

Как и всякий потомственный извращенец, свято верящий в непреложные истины типа «лучше день потерять, потом за пять минут долететь» © из мультика про «крылья, ноги, хвосты», местный автор в своей повседневной деятельности придерживается вытекающего отсюда принципа: автоматизируй всё, что можно, и пусть оно дальше само упирается рогом.

Но поскольку природная лень и почитание Бритвы Оккама не сподвигли местного автора на изучение какого-либо языка программирования под Винду, вся автоматизация обычно городится на базе не очень-то подходящего для таких вещей Пых-Пыха. Язык, конечно, воистину скриптовый и ортодоксально мощный, но чуток для других задач всё-таки.

Как водится, преодоление собственноручно созданных трудностей обычно порождает бесценный опыт. Изливание которого на неподготовленного читателя даст пищу для ума другим потомственным извращенцам. Каковые, столкнувшись с чем-то подобным, вспомнят потом про этот топик, вернутся сюда, воздадут ему должное, и порешают свой обидный трабл за двадцать минут времени.

Засада на демона.

Представим, что нам потребовался круглосуточно работающий бот. Который присосался к Интернету, и тащит с него периодически какие-то постоянно меняющиеся данные через банальный XML. Анализирует их, принимает решения о своих действиях, и управляет через API чем-то где-то очень далеко.

В данный момент нам не интересно, что это такое конкретно. Хоть бот для биржи, хоть контролька для красной кнопки ядерного чемоданчика Первого Лица. Важно лишь, чтобы эта штука не впадала в спячку, не висла, не отваливалась, не самоубивалась любым другим способом ни при каких обстоятельствах.

Ибо гейша, потерявшая самообладание - это ужасно.
Что уж говорить о красной кнопке...

Программеры уже поняли, что мы имеем дело с так называемым демоном. Задача выживания которого давно и успешно решена человечеством четыре раза подряд четырьмя же разными способами. Под крики «Бинго» и запах пива.

Вместе с тем понятно, что потомственные извращенцы, создающие демонов путём выкуривания могучего косяка Пых-Пыха, сами же обрекают себя на изобретение велосипеда. Всё дальнейшее - только для велосипедистов.

Конечно, все вопросы самозапуска демона и его возрождения, ежели что, тоже решаются. Как и любой другой форс-мажор. Засада совсем в другом.

Так как Пых-Пых не относится к транслируемым языкам, ему нужна окружающая среда. В виде веб-сервера, всяких там библиотек, PHP-шной сборочки под операционку, и прочих мелочей. У нас это делается так, прям-таки ничтоже сумняшеся:

Где-нибудь в обиталище потомственного извращенца ищется клочок свободной поверхности. Формата, близкого к А4. Нехай это будет верхняя грань вон той колонки «Вега-50АС-106». Которая пела и плясала последний раз году этак в двухтысячном, а сейчас хрен её знает, зачем тут стоит. Видимо, просто выкинуть жалко, а подарить некому.

Сверху ставится ноут, достатый из пыльных глубин бездонной тумбочки. Раньше ноуты делать умели, а потому живут они вечно. Ни хрена им не делается. Хотя толку с того чуть - всё равно такие вещи уже давно не апгрейдятся, а железо там откровенно слабое.

В ноут вливается Денвер, в нём поднимается домен, в домен кладётся скрипт, и всё это запускается в виде демона. Что исправно работает, если бы не одна беда.

Индеец, нещадно жрущий память.

Хотя операционка плюс весь подключенный софт в памяти занимают около 250 мегов (на XP), а самой оперативки по моде 1999 года там традиционных полгига, странным образом кончается она весьма скоро. Начинаются свопинг, тормоза, подвисон, и всё это вполне способно завершиться позорным крахом и нечаянным пуком. Денвер прощается с жизнью и рисует напоследок на экране страшно матерный эррор.

Любые попытки как-то облегчить ему жизнь ничего не дают. Да, можно переписать всего демона заново, совершенно точно не допуская ляпов, могущих привести к утечки памяти через банальное не освобождение переменной. Да, можно поотключать излишества в виде насильно приляпанных разработчиком почтового демона и MySQL (так ли уж они всем нужны?), и сделать множество других напрашивающихся телодвижений.

Бестолку.

Память утекает именно через Апач, причём полноводной рекой. Периодически его перезапускать - не выход. Наращивать оперативку - тоже, ибо один фиг кончится всё равно, сколько бы её там ни было, только чуть позже.

Давайте так же не станем ругаться на самого Апача. Он монструозен, может быть, не сильно грамотно в Денвера портирован, не все дырки в нём заткнуты заглушками подходящего диаметра. Зверушка интересная, но не подходит она для наших демонических дел ну никак. Для пробного отладочного сервера может быть использован, но не более того.

Так что хороним весь этот Денвер.
Без почестей, ибо расстроил.

Другой Чингачгук.

После ряда тестов и прочих проявлений любознательности, была найдена достойная замена Денверу. Для жизни под этой штукой демонического бота штуковина оказалась незаменимой. Зовут её nginx, и сейчас мы станем толковать, как втетенивать её под Винду и вешать на неё всякие там PHP и прочие Zend-ы.

Потому что на оффсайте тулзы Вам ничем не помогут.

Установка базового дистрибутива собственно сервера.

Сначала в соответствующем разделе скачиваем ту версию, что значится стабильной. На момент написания данного топика это была nginx/Windows-1.0.10 Весит меньше мега, вынимается из архива, и сохраняется папкой под именем nginx в корне диска С.

Во избежание недоразумений давайте договоримся, что корневой папкой Чингачгука будет именно download Расположенная на указанном диске и в папке с таким вот именем. А далее все папки и файлы станем перечислять только с указанием полного пути от корня диска. Чтоб даже самый невнимательный читатель понимал сущности правильно. Потому что никто ему ничего индивидуально объяснять на пальцах решительно не будет.

Внутри папки Вы найдёте одинокий экзешник, и несколько папочек с очень подозрительными файлами, изучать содержимое которых Вы точно не станете.

Собственно, и делать с этим nginx-ом тоже особо нечего. Ну можно запустить его из-под консоли, увидеть через браузер на локалхосте HTML документ, лежащий в папке "html", убить сервер опять же из-под консоли. Кому это интересно?

Поэтому поразвлекавшись с консолькой, как это рекомендуется, давайте вспомним про нашего несчастного демона. А демон страдает по Пых-Пыху...

Установка PHP.

В данном месте автор поступил парадоксально, и ни разу не так, как предписано. Вместо того, чтобы идти на какой-то из сайтов сообщества PHP, и тащить оттуда одну из сборок, актуальных на данный момент, местный автор занялся разграблением могил.

Похороненный давеча Денвер был откопан обратно, из его директории \usr\local\ была уворована папка php5, которая попала в корень nginx, и под немного другим именем, став С:\nginх\php\

Если Вы спросите, зачем так, то вот ответ.

Поскольку PHP при запуске его как CGI, ни на копейку не отличается от PHP, запущенного модулем Апача, то вполне сгодится и то, что ранее было собрано по кусочкам (сам PHP-5.2.x, необходимые модули расширения к нему, плюс Зенды там всякие) для Денвера. Проходить тот же квест по новой совершенно ни к чему.

Только есть один момент.

nginx устроен значительно проще, и не разумеет всяких там вложенных директорий в папке С:\nginх\php\ Поэтому делаете две вещи.

В файле С:\nginx\php\php.ini любуетесь на секцию «Windows Extensions», и все не задокументированные там модули (которые, видимо, нужны для работы совершенно точно либо предположительно) перетаскиваете из папки С:\nginx\php\ext\ прямо в С:\nginx\php\ А саму папку С:\nginx\php\ext\ убиваете. Как и две другие - С:\nginx\php\extras\ и С:\nginx\php\PEAR\

И вторая вещь. Делается при наличии Зенда.

Зенд на РНР в Денвере цепляется обычно в виде файла С:\nginx\php\ZendExtensionManager.dll, который требует наличия другого, по пути С:\nginx\php\php-5.2.x\ZendOptimizer.dll Естественно, при ограблении мёртвого Апача Вы это всё перетащите к новому владельцу. Но только надо, чтоб он смог вступить в права владения.

С этой целью переправьте в конце С:\nginx\php.ini файла пути на правильные:

[Zend]
zend_extension_ts="ZendExtensionManager.dll"
zend_extension_manager.optimizer_ts="C:\nginx\php"
zend_optimizer.enable_loader=1
zend_optimizer
.optimization_level=15
Чистка PHP:

Папку С:\nginx\php\ при наличии желания можно почистить от всего ненужного. Ненужного там много (почти всё, особо то, у чего в именах есть явное упоминание Апача), но, если не распознаёте файлы на свой-чужой, воздержитесь.

Минимальный набор PHP запчастей, который необходим и достаточен:

Минимальный состав PHP.

Красным обведено то, что требуется конкретному скрипту дополнительно, подцеплено через php.ini, как сказано выше, и перетащено сюда из мест, опять-таки оговоренных ранее.

Если Вам такие модули не нужны, и Вы их не присоединяете через php.ini, то отсюда тоже можно вычеркнуть. Останется всего ничего.

Конфигурирование nginx:

Также стоит познакомить nginx с PHP расширением - внесите в файл mime.types по аналогии с уже имеющимся там новую запись:

   text/php                              php;

И, раз оказались в этой директории, в файле nginx.conf замените вот этот кусок:

    server {
        
listen       80;
        
server_name  localhost;
 
        
#charset koi8-r;

        #access_log  logs/host.access.log  main;

        
location / {
            
root   html;
            
index  index.html index.htm;
        }
 
        
#error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        
error_page   500 502 503 504  /50x.html;
        
location = /50x.html {
            
root   html;
        }
 
        
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    
}

на не менее страшный, но более полезный:

   server {
       
listen 80 default;
       
server_name  my.bot;
       
server_tokens off;
 
       
location / {
          
root   html;
          
index  index.html index.htm index.php;
       }
 
       
location ~ .php$ {
          
fastcgi_pass   127.0.0.1:9000;
          
fastcgi_index  index.php;
          
fastcgi_param  SCRIPT_FILENAME  c:/nginx/html$fastcgi_script_name;
          include        
fastcgi_params;
          
fastcgi_param  QUERY_STRING     $query_string;
          
fastcgi_param  REQUEST_METHOD   $request_method;
          
fastcgi_param  CONTENT_TYPE     $content_type;
          
fastcgi_param  CONTENT_LENGTH   $content_length;
          
fastcgi_param  REMOTE_ADDR      $remote_addr;
       }
 
       
location ~ /.ht {
          
deny  all;
       }
 
       
error_page   404 500 502 503 504  /50x.html;
       
location = /50x.html {
          
root   html;
       }
   }

В третьей строчке второго куска Вам встретится домен my.bot - это произвольное имя домена. Домен может быть каким угодно, в данном случае демон живёт вот в таком. В Вашем случае будет что-то иное - это иное доменом и пишите.

В этом же файле обратите внимание на запись в секции http:

    #access_log  logs/access.log  main;

Чтобы не копить в процессе работы гигабайты логов акцесса, которые Вы ни смотреть, ни анализировать точно не будете, модифицируйте этот кусок кода вот так:

    #access_log  logs/access.log  main;
    
access_log off;
Человеческий домен в адресе браузера.

Любому сайту нравится, когда в процессе его разработки и отладки с ним обращаются не как с недоделком, а по-взрослому. То есть сайт живёт в том же домене, что и на реальном хосте.

Местному автору непонятно, как может быть иначе. Хоть он и потомственный извращенец, но никаких буковок про localhost и циферок про 127.0.0.1 в адресе браузера категорически не приемлет.

Поэтому давайте затратим пару минут, создадим папку download с двумя файлами внутри. Их можно сделать Блокнотом Винды в кодировке ANSI.

Файл первый, С:\nginx\host\hosts.default Содержит такой код:

127.0.0.1       localhost

Второй файл, С:\nginx\host\hosts.work чуть сложнее:

127.0.0.1       localhost
127.0.0.1       my
.bot

Тут опять-таки понимайте, что вместо имени домена my.bot надо писать то же самое, что Вы подставляли в файл С:\nginx\conf\nginx.conf

Теперь, когда у нас есть два варианта файла хоста, мы будем их попеременно подсовывать операционной системе при старте Чингачгука и при его отбое.

Педали газа и тормоза.

Чтоб не общаться с консолью, столь милой сердцу линуксятника, но обычно ненавистной виндузятнику, имеет большой смысл создать парочку командных файлов, первый из которых запускает сервер со всеми его потрохами, а второй стопорит яростным домкратом. Что делается с трудом, так как даже базовые сведения про DOS давно и успешно забыты. Но попытаемся.

Стартовый файл С:\nginx\start.bat пусть содержит в себе такие команды:

@ECHO OFF
 
start C
:/nginx/nginx.exe
 
set PHP_FCGI_MAX_REQUESTS
=0
start C
:/nginx/php/php-cgi.exe -b 127.0.0.1:9000 -c C:/nginx/php/php.ini
 
XCOPY C
:/nginx/host/hosts.work C:/WINDOWS/system32/drivers/etc/hosts /Y
 
EXIT

Обратите внимание, где расположена системная папка. У Вас она может быть на другом диске, называться не так, и иметь внутри себя иной путь до файла хоста, так как операционка не обязательно XP.

Командный файл остановки С:\nginx\stop.bat обратен по смыслу:

@ECHO OFF
 
taskkill 
/IM nginx.exe /F
taskkill 
/IM php-cgi.exe /F
 
DEL 
/Q C:/nginx/logs/*.*
 
XCOPY C:/nginx/host/hosts.default C:/WINDOWS/system32/drivers/etc/hosts /Y
 
EXIT

Все те же соображения про путь до файла хоста операционки опять же в силе.

Приступим, помолясь.

Разместив в папке С:\nginx\html\ индексный php файл с echo-оператором про сакраментальное Hello World, и кликнув в стартовый командный файл, мы увидим мельтешение трёх DOS-овских окошек, два из который тут же рассосутся, а одно останется в фоне. Это запущен PHP в режиме Fast CGI. Окошко убивать не надо.

На всякий случай глянув в диспетчер задач, Вы там должны увидеть два процесса nginx.exe, весом по три мега, и один php-cgi.exe, потяжелее. В авторском варианте этот процесс потянул на 11 мегов, так как демону оказалось нужно много тяжёлых модулей.

Если открыть браузер, то в домене my.bot можно увидеть ритуальный вопль про Hello World, рождённый PHP. Значит, всё работает, и в папку С:\nginx\html\ можно заселять демона (или сайт). При этом С:\nginx\html\50x.html рекомендуется оставить в покое - он прописан настройками в качестве страницы ошибок.

Впечатления.

Хотя по мегабайтам оперативки, казалось бы, исходно никакого заметного выигрыша нет (Апач не очень жирен), по истечении суток работы демона на nginx, оба процесса nginx.exe сдулись в памяти с изначальных более чем трёх мегов до 800 и 52 кило. Процесс php-cgi.exe похудел с 11 мегов до шести. Такое ощущение, что от них отвалилось то, что демоном не используется. Что само по себе странно, навевает мысль об искусственном интеллекте, а потому пугает.

При запуске того же самого демона под Денвером вся память обычно пожирается менее чем через 10-12 часов. Денвер придётся перегружать два-три раза в сутки. Причём не факт, что этого достаточно. При интенсивной деятельности демона иногда случается даже крах Апача.

Конечно, по удобству работы nginx-у далеко до того же Денвера. К примеру, .htaccess тут не поддерживается в принципе, модреврайтовые инструкции эмулируются через вывих мозга, а кучка доменов цепляется через хитрости. Потомственный извращенец всё это осилит, но...

Но для бота, работающего круглосуточно, самое оно.

Ну и конечно, необходимо воздать хвалу Игорю Сысоеву.
Судя по лаконичности хомепаги, ему близки самурайские идеалы :)

Пара слов о браузере.

При построении демона на PHP удобно управлять им через веб-интерфейс, что подразумевает использование браузера. Не в консольке же команды писать.

Но.

Современные программерские конторы пишут сильно сложный софт, ввиду чего по головотяпству (это следствие командной работы) вычислительные ресурсы иногда просто разбазариваются. Например, многие браузеры грешны тем, что и жрут оперативку без всякой меры, да ещё и позволяют этой самой оперативке «утекать». Что нам совсем не надо - оперативки у нас не три вагона.

Поэтому в данном случае очень уместна крохотная оболочка, бегающая на движке ИЕ. Несмотря на всеобщую и совершенно справедливую нелюбовь (а то и ненависть) народа и web-дизайнеров к ИЕ, сам движок от ИЕ идеален. Он часть операционки, быстр и лёгок, и категорически не позволяет себе жрать память ни при каких обстоятельствах. Ни один альтернативный браузер по данным параметрам и близко не стоит.

В качестве оболочки для фиксации результатов деятельности демона рекомендуется Fastest Web Browser. Настроек у него вообще нет :)

Если же это обстоятельство коробит, то можно взять QtWeb
Причём лучше всего в виде простого zip-архива.

Утечки памяти через эти два браузера не зафиксированы (привет всяким Мозилам). Общий расход оперативки 220 мегов на Винду и весь запущенный зоопарк. Показометр стоит, как приклеенный, сутками.

Аллилуйя.

Другие статьи категории «Маленькие лайфхаки»

Бразильский Онанизм. Пять лет спустя.

Бразильский Онанизм. Пять лет спустя. Каждый из блоггеров периодически просматривает, чего у него в закромах накопилась, и решительно делает секир-башка уже неактуальным опусам про давно минувшее и нахрен никому не интересное. И это здравый поступок. Забота об экологии, так сказать. Вот и местный автор, просматривая древние посты в поисках агнца для заклания, вдруг наткнулся на чуть ли не пятилетней выдержки повесть про Онанизм по бразильской методике.

AdSense арбитраж.

AdSense арбитраж. Опа. Только не пугайтесь промелькнувшего в титле страшного слова «арбитраж». Никто тут Вас грузить и напрягать не будет, ибо, напротив, речь пойдёт о делах очень даже весёлых. Местный автор надеется, что все вы знаете, кто такой АдСенс, и на ваших серваках непременно торчит по блогу, у которого под АдСенс забронировано тепленькое местечко.

Серый Гугл и три поросёнка.

Серый Гугл и три поросёнка. Тот, кому в детстве не повезло расти под присмотром гранд-парантов, имел сомнительное удовольствие регулярно посещать детский сад. А там он в рамках программы дошкольного воспитания непременно был отловлен за ухо и усажен задницей на стульчик ознакамливаться с концептуальейшими произведениями художественной литературы для соответствующей возрастной категории.
17 ноября 2011, 02:37

№ 1Можно проще

Если PHP скрипт должен просто как в кроне крутиться, то есть вариант попроще. Через планировщик винды можно стартовать тупо

c:/php/php-cgi.exe "путь к скрипту"

и вся недолга. С контрольным прибиванием после таймаута ну и под другим юзером дабы даже не всплывать. Не?
Можно.

Но если демон написан как сайт, по принципу информационно-командной системы, с обновляемыми данными на морде, и всякими кнопками, то без браузера ему никак.

Хотя, конечно, можно отделить одно от другого.
Александр Хмелев
17 ноября 2011, 02:52

№ 2А может по-другому?

Может установить Linux и поднять сервер на отдельно взятом ноуте?
Сам подумываю уже над реализацией, благо провайдеры дают выделенный IP.

Конечно, там заморочек может и поболее будет, но тогда и сайты можно заселять... Как думаете, Вадим Николаевич?

Ежели сподобитесь внятную инструкцию написать, буду зело благодарен!
Из соображений надёжности и бесперебойности это хуже хостинга. Люди такое делали, и всею толпой дружно увидели, что аптайм страдает.

Да и сами посчитайте - если, к примеру, кучка сайтов даёт в Хитрой Конторе 50 уёв в сутки, и раз в месяц Ваш сервак отвалился на день из-за того, что где-то на чердаке голубь насрал на гнездо свитча провайдера, то Ваши потери и составляют те самые 50 уёв.

При цене-то вопроса 3 уя в месяц у нормального и надёжного хостера.

И такие дауны будут постоянно, по разным причинам.

Из заморочек - только то, что Ваш сервак постоянно хакать будут. Пока не приобретёте бесценный опыт :)

Так что мне идея держать дома сайты кажется сомнительной.
Но могут быть и другие мнения.
airsound
17 ноября 2011, 04:35

№ 3Nginx

Спасибо за статью, хочю сказать что для денвера тоже есть выход но в сторонней тузле - есть прога которая периодически очищает память AnVir Task Manager.

Если кто не осилит - она поможет.

Плохо что новый денвер так работает - у меня старый ещо проблем вроде нет.

Ещо раз спасибо, читаю ридером - поначалу думал хабр :)
Есть сомнения, что очищалка памяти тут поможет.
Память у живого процесса вроде как не должна отбираться.
Ибо процессу кирдык.
djalin
17 ноября 2011, 12:23

№ 5Без темы

А почему все-таки не поставить на этот ноут например Ubuntu, которая устанавливается проще винды, тремя кликами next->next->finish и по которой куча мануалов в сети ? Те же апач+PHP+MySQL там есть в репозиториях и ставятся одной строчкой в консоли. 512Мб ей хватит с головой. У меня такой сервер, правда с 768 Мб памяти, полностью выполняет функции денвера + торренты качает круглые сутки.
Потому что здравый смысл не советует пускаться в тысячекилометровые путешествия на машине, которую в первый раз видишь.

И категорически воспрещает женится на той, кого видишь второй раз в жизни.

Всё-таки должна быть уверенность в софте, и понимание, как он работает. Красную кнопку чему попало не доверяют.

Понятно, что тут возможен холивар. Бога ради. Только давайте будем помнить, что в той же Европе сначала все радостно любили открытое ПО, и массово на него переходили целыми департаментами и министерствами. Сношая всех, кто против. Сейчас переходят обратно, столь же массово, и с не меньшими ништяками.

Оно неспроста так.
Nigthrain
17 ноября 2011, 23:31

№ 6Без темы

Ой нелехка жисть у вас, виндузятников... Пусть в ойропах куда угодно переходят, а сия конкретная проблема другими осями решается елементарно, даже без всяких серверов. Впрочем, каждому свое.
Апач жрет память (в линухе он тоже ее жрет, кстати, если коннектов к нему много становится) возможно потому что на каждый чих рожает дочерний процесс, которого потом почему-то не убивает. И в конце концов сии процессы размножаются как кролики насколько памяти хватает. Если сделавших свое дело прихлопывать насильно -- глядишь, и памяти больше останется. А нгинкс сделан таким, что ему процессов для чихов надо гораздо меньше. Хотя, на истинность особо не претендую.
Если точнее, то воркеры в nginx запускаются из раcчёта одна штука на один физический CPU. Исключения бывают, но они экзотические. Так что процессов в домашних применениях всегда по факту две штуки (Master+Slave, видимо, но зачем-то под одинаковым именем).

Апач, действительно, плодит много процессов, но в конфигах всегда есть разумное ограничение, плюс зависшие должны убиваться. До фига процессов мы в реальности и не видим, их мало, но они жирные. Что не так, только Аллах знает...

Ну да не будем тревожить Аллаха.
Вопрос решился, безудержному счастью теперь ничто не мешает.
Alex
18 ноября 2011, 01:53

№ 7Ибо процессу кирдык.

Вот именно что не кирдык - проверялось на разных компах - уж не знаю механизм, но работает.
djalin
Все заметки категории «Маленькие лайфхаки»