<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Ars Longa, Vita Brevis &#187; Windows</title>
	<atom:link href="http://blog.sjinks.pro/tag/windows/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.sjinks.pro</link>
	<description>Quod scripsi, scripsi</description>
	<lastBuildDate>Mon, 06 Feb 2012 17:56:02 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Несколько лёгких web-серверов для Windows</title>
		<link>http://blog.sjinks.pro/windows/377-several-lightweight-web-servers-for-windows/</link>
		<comments>http://blog.sjinks.pro/windows/377-several-lightweight-web-servers-for-windows/#comments</comments>
		<pubDate>Mon, 24 Nov 2008 05:17:15 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[Windows]]></category>
		<category><![CDATA[Cygwin]]></category>
		<category><![CDATA[mathopd]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[thttpd]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=377</guid>
		<description><![CDATA[Сборки nginx, mathopd и thttpd для Windows В силу тех или иных причин многие web-разработчики работают под Windows: в силу привычки либо по каким-либо еще причинам. Но мир устроен так, что большая часть серверного программного обеспечения работает под UNIX/Linux. Тем не менее, разработчикам хотелось бы иметь возможность тестировать разработки локально. Я не рассматриваю вариант с [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/windows/377-several-lightweight-web-servers-for-windows/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Сборки <a href="http://blog.sjinks.pro/tag/nginx/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  nginx">nginx</a>, <a href="http://blog.sjinks.pro/tag/mathopd/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  mathopd">mathopd</a> и <a href="http://blog.sjinks.pro/tag/thttpd/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  thttpd">thttpd</a> для <a href="http://blog.sjinks.pro/tag/windows/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Windows">Windows</a></em></h2>
<p>В силу тех или иных причин многие web-разработчики работают под Windows: в силу привычки либо по каким-либо еще причинам. Но мир устроен так, что большая часть серверного программного обеспечения работает под UNIX/<a href="http://blog.sjinks.pro/tag/linux/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Linux">Linux</a>.</p>
<p>Тем не менее, разработчикам хотелось бы иметь возможность тестировать разработки локально. Я не рассматриваю вариант с установкой виртуальной машины, ибо не все хорошо разбираются в Linux.</p>
<p><a href="http://blog.sjinks.pro/windows/58-nginx-php-fastcgi-in-windows/">В статье про nginx</a> я приводил примеры, когда необходимо использовать что-нибудь более легковесное, чем Apache. Но выбор не всегда ограничивается nginx, есть и другие лёгкие web-сервера.</p>
<p>Я собрал под Windows три web-сервера:</p>
<ul>
<li><a href="http://www.mathopd.org/" rel="external nofollow"><strong>mathopd 1.5p6</strong></a>;</li>
<li><a href="http://sysoev.ru/nginx/" rel="external nofollow"><strong>nginx 0.6.33</strong></a>;</li>
<li><a href="http://www.acme.com/software/thttpd/"><strong>thttpd 2.25b</strong></a>.</li>
</ul>
<p><span id="more-377"></span></p>
<p>С nginx всё понятно, про него уже не раз писали. Но в поисках альтернативы nginx я случайно обнаружил <a href="http://www.acme.com/software/thttpd/benchmarks.html" rel="external nofollow">тесты производительности web-серверов</a> (хотя и 10-летней давности).</p>
<p>На диаграмме видно, что Zeus вне конкуренции. Но покупать его у меня не было желания, поэтому я стал рассматривать бесплатные альтернативы, а именно: thttpd и mathopd.</p>
<p>Для mathopd, thttpd и nginx я собрал версии под Windows (в <a href="http://blog.sjinks.pro/tag/cygwin/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Cygwin">Cygwin</a>). Планирую собрать <a href="http://www.boa.org/" rel="external nofollow">Boa</a>, а для <a href="http://www.cherokee-project.com/" rel="external nofollow">Cherokee</a> есть сборка под Windows.</p>
<p><strong>Скачать:</strong></p>
<ul>
<li><strong><a href="http://d.sjinks.pro/lws/mathopd-1.5p6-cyg.zip" rel="nofollow">mathopd 1.5p6 для Windows</a>;</strong></li>
<li><strong><a href="http://d.sjinks.pro/lws/nginx-0.6.33-cyg.zip" rel="nofollow">nginx 0.6.33 для Windows</a>;</strong></li>
<li><strong><a href="http://d.sjinks.pro/lws/thttpd-2.25b-cyg.zip" rel="nofollow">thttpd 2.25b для Windows</a>.</strong></li>
</ul>
<p>В архивы включены все (я надеюсь) требуемые динамически подключаемые библиотеки (DLL).</p>
<p>mathopd и thttpd, возможно, смогут работать и без установленного Cygwin, а nginx&nbsp;&mdash;&nbsp;вряд ли.</p>
<p>nginx конфигурировался следующим образом:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p3772">
        <div class="code bash" id="p377code2">
.<span class="sy0">/</span>configure <span class="re5">--with-mail</span> --with-mail_ssl_module --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_flv_module --with-http_gzip_static_module --with-http_stub_status_module
        </div>
    </div>
</div>

<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/windows/377-several-lightweight-web-servers-for-windows/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/windows/377-several-lightweight-web-servers-for-windows/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Почему я не люблю Microsoft</title>
		<link>http://blog.sjinks.pro/administering/320-why-i-dislike-microsoft/</link>
		<comments>http://blog.sjinks.pro/administering/320-why-i-dislike-microsoft/#comments</comments>
		<pubDate>Wed, 27 Aug 2008 14:57:05 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[Администрирование]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=320</guid>
		<description><![CDATA[Честные методы борьбы? Или на войне все средства хороши? День назад наткнулся на очень любопытную (и вместе с тем мерзкую) статью. На сайте Micro$oft. Называется сей опус "Заменив почтовый сервер на основе Linux на Microsoft Windows Server 2003 и Exchange Server 2003, Российский банк развития повысил доступность почтовых систем" и доступен для прочтения здесь. На [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/administering/320-why-i-dislike-microsoft/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Честные методы борьбы? Или на войне все средства хороши?</em></h2>
<p>День назад наткнулся на очень любопытную (и вместе с тем мерзкую) статью. На сайте Micro$oft. Называется сей опус "Заменив почтовый сервер на основе <a href="http://blog.sjinks.pro/tag/linux/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Linux">Linux</a> на <a href="http://blog.sjinks.pro/tag/microsoft/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Microsoft">Microsoft</a> <a href="http://blog.sjinks.pro/tag/windows/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Windows">Windows</a> Server 2003 и Exchange Server 2003, Российский банк развития повысил доступность почтовых систем" и доступен для прочтения <a href="http://www.microsoft.com/Rus/Casestudies/CaseStudy.aspx?id=480" rel="nofollow">здесь</a>. На мой взгляд, статья направлена на дискредитацию Linux-сообщества и содержит откровенную ложь.<span id="more-320"></span></p>
<p>Полностью статью я приводить не буду, только некоторые цитаты со своими комментариями.</p>
<blockquote>Архитектура Linux-систем такова, что запуск нового сервиса или подключение нового пользователя требует остановки и перезапуска почтовой службы. Это занимает всего 2-3 минуты — но когда в разгар рабочего дня прекращается доступ к почте, из 250 сотрудников кто-то обязательно от этого пострадает. В таких условиях мы не могли обеспечить высокий уровень доступности серверов и гарантировать какое-либо качество обслуживания.</blockquote>
<p>Сотрудники Google и Yahoo!, наверное, рыдают. Я представляю, как им тяжело перезапускать почтовый сервер после регистрации очередного пользователя. С каких пор добавление/удаление пользователя требует перезапуска? Я уже не говорю, что это можно полностью автоматизировать скриптом. И вообще непонятно, какое отношение это имеет к архитектуре Linux? Скорее уж, «архитектура Windows такова, что после установки очередной заплатки на Windows Media Player или Internet Explorer требуется перезапуск системы».</p>
<blockquote>Среди накопившихся проблем, требовавших решения, были также средства наблюдения за Интернет-трафиком и эффективные средства фильтрации электронной почты.</blockquote>
<p>Не вижу проблемы <img src='http://static.sjinks.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  Фильтрация электронной почты: первое, что приходит на ум — SpamAssassin. Потом: Bogofilter, DSPAM… Я уже молчу про HashCash  и greylisting. Интерфейс между MTA и антиспам-демоном или антивирусом может осуществляться, например, при помощи AMaViSd.</p>
<p>Не совсем понимаю, что имелось в виду под «наблюдением за трафиком». Если имеется в виду анализ логов, то здесь могут помочь LightSquid, Swatch, TraffPro и т.п. Нежелательные IP-адреса (например, сервера, пытающиеся использовать систему как открытый релей) можно сразу скармливать фильтру пакетов (iptables); написание простого скрипт займёт минут 10 от силы. Пример подобного скрипта я уже приводил в статье <strong>«<a href="http://blog.sjinks.pro/security/194-say-no-to-intruder/">Скажи “Нет!” взломщику</a>»</strong>.</p>
<blockquote>Вся почта хранилась на рабочих станциях сотрудников, что исключало возможность организации резервного копирования.</blockquote>
<p>Ну можно было использовать IMAP и хранить почту на сервере. На мой взгляд, почта пользователя — вещь сугубо личная, и принимать решение о её резервном копировании должен он сам. Лично я не хочу, чтобы моя конфиденциальная информация гуляла по бэкапам — мне надо, я сделаю копию.</p>
<p>В любом случае, для резервного копирования есть Amanda, Bacula и много других решений.</p>
<blockquote>Когда система зависит от работы одного сотрудника — это очень опасная ситуация для бизнеса: отпуск, болезнь, увольнение и другие жизненные обстоятельства — и решение оказывается полностью неуправляемым. Кроме того, один специалист сам по себе практически неконтролируем.</blockquote>
<p>Минус отделу кадров. И руководству, если оно не может проконтролировать процесс.</p>
<p>По большому счёту и к MS Exchange можно прикрутить скриптов/рюшечек, и после ухода админа их администрирование станет головной болью. Вообще, как говорил классик, «В фирме незаменимых людей быть не должно. Если у вас появился незаменимый сотрудник, сразу увольняйте его».</p>
<blockquote>проведя целый ряд собеседований, мы обнаружили, что претенденты на эту вакансию или не готовы реально управлять Linux-сервером в большой ИТ-среде, или требуют зарплату, значительно превышающую среднюю по рынку.</blockquote>
<p>А жадность никогда до добра не доводит. Если уж человек был так незаменим, неужели у компании не было в нём заинтересованности? Сами виноваты.</p>
<p>Средняя зарплата по рынку: эх, конкретики бы побольше. Какую зарплату они считали средней? Среди студентов-очников?</p>
<blockquote>Поскольку Linux-сервер был вне общей сети, на то, чтобы получить отчеты, вывести файлы, распечатать их, проанализировать — уходило нескольких часов. При администрировании Exchange та же задача решается за 2-3 минуты при помощи мастера.</blockquote>
<p>Одно не пойму: какая разница, в общей сети или вне её находится почтовый сервер? Скорость генерации отчётов зависит от скорости сервера.</p>
<p>Непонятно, зачем всё делать вручную, если можно автоматизировать (<code>sed</code>, <code>awk</code>, <code>grep</code> в помощь)?</p>
<p>По поводу задачи, решаемой за две-три минуты — создаётся впечатление, что говорят не всю правду:</p>
<blockquote>Электронная почта не рассматривалась как критичный бизнес-<a href="http://blog.sjinks.pro/tag/service/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  сервис">сервис</a>, поэтому основным требованием стала минимизация затрат бюджетных средств на начальном этапе проекта.</blockquote>
<blockquote>Для поиска достойного партнера был объявлен тендер, в котором победило консалтинговое подразделение компании «Кварта Технологии». В рамках проекта необходимо было провести миграцию почтовых служб с Linux Qmail на Microsoft Exchange Server 2003, обеспечить перенос почтовых ящиков пользователей, заменить прокси-сервер на базе Linux на Microsoft ISA Server 2004.</blockquote>
<blockquote>Все изменения, вносимые в ИТ-среду, первоначально апробировались на тестовом стенде. Информационную систему Российского банка развития нельзя было останавливать на длительное <a href="http://blog.sjinks.pro/tag/time/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  время">время</a>, таким образом, основные работы по установке программного обеспечения и настройке системы проводились после окончания рабочего дня и в выходные дни.</blockquote>
<p>Из этих цитат создаётся впечатление, что ОАО «РосБР» закупило-таки новое оборудование (особенно, если учесть, что MS Exchange работал параллельно с qmail). Было бы очень интересно сравнить ТТХ обоих серверов и от этого уже отталкиваться.</p>
<blockquote>Были настроены общие календари и адресные книги, групповая совместная работа, резервируемая корпоративная электронная почта и многое другое.</blockquote>
<p>Так бы и ставили задачу разу, что нужен сервер групповой работы (а не почтовый сервер). В Linux таких тоже хватает <img src='http://static.sjinks.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<blockquote>Защита доступа к корпоративной сети и почтовым службам была реализована при помощи универсального межсетевого экрана Microsoft ISA Server 2004.</blockquote>
<p>И всё равно iptables лучше <img src='http://static.sjinks.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>И всё-таки маркетологи некрософта молодцы. Сочинить такое… мне бы фантазии не хватило. В любом случае, я категорически против чёрного пиара в любых его проявлениях.</p>
<p>Выскажусь в стиле маркетологов из некрософт: "я глубоко убеждён, что в самом ближайшем будущем у нас будут лидировать открытые системы вместо всякого проприетарного дырявого барахла" <img src='http://static.sjinks.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/administering/320-why-i-dislike-microsoft/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/administering/320-why-i-dislike-microsoft/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Пять слов длиной в 56 мегабайт</title>
		<link>http://blog.sjinks.pro/windows/281-five-words-56-mb-length/</link>
		<comments>http://blog.sjinks.pro/windows/281-five-words-56-mb-length/#comments</comments>
		<pubDate>Wed, 30 Jul 2008 06:16:01 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[Windows]]></category>
		<category><![CDATA[Microsoft]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=281</guid>
		<description><![CDATA[За что я люблю Microsoft Всё-таки у Miscrosoft'овцев забавное чувство юмора&#8230; Дней двадцать назад вышло одно очень забавное обновление (KB955020) для системы проверки орфографии. Всё, что оно делает, это добавляет в словари английского и немецкого языка пять слов: название социальной сети Friendster, фамилии модели Heidi Klum, баскетболиста NBA Mohammed Nazr, политиков Barack Obama и Marc [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/windows/281-five-words-56-mb-length/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>За что я люблю <a href="http://blog.sjinks.pro/tag/microsoft/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Microsoft">Microsoft</a></em></h2>
<p>Всё-таки у Miscrosoft'овцев забавное чувство юмора&hellip; Дней двадцать назад вышло одно очень забавное обновление (<a href="http://support.microsoft.com/kb/955020" rel="nofollow">KB955020</a>) для системы проверки орфографии. Всё, что оно делает, это добавляет в словари английского и немецкого языка пять слов: название социальной сети Friendster, фамилии модели Heidi Klum, баскетболиста NBA Mohammed Nazr, политиков Barack Obama и Marc Racicot.</p>
<p>Всё бы ничего, только размер этого <a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=0962DCC7-BCCD-42DF-A52F-B23CB34376BC&amp;displaylang=en" rel="nofollow">обновления</a> составляет 56.4&nbsp;МБ. Да и к тому же требует проверку подлинности <a href="http://blog.sjinks.pro/tag/windows/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Windows">Windows</a>.</p>
<p><a href="http://static.sjinks.info/wp-content/uploads/2008/07/kb955020.png" rel="lightbox"><img src="http://static.sjinks.info/wp-content/uploads/2008/07/kb955020-293x300.png" alt="KB955020" title="KB955020" class="alignnone size-medium wp-image-283" /></a><script type="text/javascript">odl.register(initLightbox)</script></p>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/windows/281-five-words-56-mb-length/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/windows/281-five-words-56-mb-length/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Доказана критичность уязвимости в Safari для Windows</title>
		<link>http://blog.sjinks.pro/security/196-vulnerability-in-safari-for-windows-proves-critical/</link>
		<comments>http://blog.sjinks.pro/security/196-vulnerability-in-safari-for-windows-proves-critical/#comments</comments>
		<pubDate>Sat, 14 Jun 2008 21:12:43 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[Windows]]></category>
		<category><![CDATA[Безопасность]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[Safari]]></category>
		<category><![CDATA[безопасность]]></category>
		<category><![CDATA[уязвимость]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=196</guid>
		<description><![CDATA[Insecure By Design, или, Не там уязвимости ищите, товарищи! Всё-таки как можно переставить всё с ног на голову&#8230; Прочитал сегодня статью на CNews.com; она небольшая, привожу полностью: Исследователь безопасности разработал сайт, наглядно демонстрирующий риск, с которым сталкиваются пользователи Windows при использовании браузера Safari от Apple. ИБ-команда Microsoft уже предупредила, что «смешанная угроза» настолько серьезна, что [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/security/196-vulnerability-in-safari-for-windows-proves-critical/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Insecure By Design, или, Не там уязвимости ищите, товарищи!</em></h2>
<p>Всё-таки как можно переставить всё с ног на голову&hellip; Прочитал сегодня <a href="http://www.cnews.ru/news/line/index.shtml?2008/06/10/304593" rel="nofollow">статью</a> на CNews.com; она небольшая, привожу полностью:</p>
<blockquote cite="http://www.cnews.ru/news/line/index.shtml?2008/06/10/304593">
Исследователь безопасности разработал сайт, наглядно демонстрирующий риск, с которым сталкиваются пользователи <a href="http://blog.sjinks.pro/tag/windows/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Windows">Windows</a> при использовании браузера <a href="http://blog.sjinks.pro/tag/safari/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Safari">Safari</a> от Apple.
<p>ИБ-команда <a href="http://blog.sjinks.pro/tag/microsoft/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Microsoft">Microsoft</a> уже предупредила, что <strong>«смешанная угроза» настолько серьезна, что пользователям Windows следует ограничить использование Safari до тех пор, пока не выйдет <a href="http://blog.sjinks.pro/tag/patch/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  патч">патч</a></strong>. В своем блоге исследователь <cite>Лю Ди Ю</cite> (<cite>Liu Die Yu</cite>) показал, что это предупреждение не было преувеличением.</p>
<p>При клике по указанной исследователем ссылке в Safari с настройками по умолчанию на рабочий стол пользователя Windows загружается файл-ловушка. В следующий раз, когда пользователь открывает <strong>Internet Explorer</strong>, файл автоматически запускает <code>notepad.exe</code> и открывает несуществующий файл. <q>Разумеется, злоумышленники могут найти менее безобидное применение данной уязвимости</q>, пишет <cite>The Register</cite>.</p>
<p>По словам Apple, <a href="http://blog.sjinks.pro/tag/vulnerability/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  уязвимость">уязвимость</a> не является критической. Эта демонстрация свидетельствует об обратном.
</p></blockquote>
<p><span id="more-196"></span></p>
<p>Вопросы, возникающие при прочтении:</p>
<ol>
<li><strong>Если уязвим Safari, почему нужно запускать Internet Explorer?</strong> На мой взгляд, найденная "смешанная уязвимость" свидетельствует о том, что ограничить нужно как раз-таки использование Ишака, пока Micro$oft не выпустит патч.</li>
<li>Фраза "следует ограничить использование Safari до тех пор, пока не выйдет патч"&nbsp;&mdash;&nbsp;это свидетельство <em>нечестной</em> борьбы&nbsp;&mdash;&nbsp;более честным было бы выложить описание как изменить настройки Safari, чтобы не подвергать риску уязвимости Windows.</li>
</ol>
<p>Озвучив для себя эти вопросы, я решил найти <a href="http://liudieyu0.blog124.fc2.com/blog-entry-1.html">оригинал статьи</a>, благо это было нетрудно.</p>
<p>Две фразы, которые мне очень понравились:</p>
<ol>
<li><q>Microsoft used some vague wording in the <a href="http://www.microsoft.com/technet/security/advisory/953818.mspx" rel="nofollow">advisory</a>: "Suggested Actions" are "Restrict use of Safari as a web browser&hellip;", <em>as if it's a flaw rooted in Safari</em>.</q></li>
<li>
<blockquote>In sub-folder of "Suggested Actions" Microsoft admits "Workarounds" as <q>Change the download location of content in Safari to a newly created directory</q>. The <em>full statement</em> should be <em>"Change the download location of content in Safari to a newly created directory(to save the integrity of Windows Internet Explorer)"</em>.<br />
</blockquote>
</li>
</ol>
<p>Причем, судя по всему, фраза "Change the download location of content in Safari" появилась только 6 июня (то есть почти через неделю после того, как статья была опубликована на сайте Microsoft).</p>
<p>Теперь несколько слов об уязвимости. Права ли Microsoft, обвиняя Safari в уязвимости? Я согласен, загрузка файла без разрешения пользователя&nbsp;&mdash;&nbsp;это не хорошо. Но что заставляет Internet Explorer открывать этот файл? Ответ прост: Windows. То есть уязвимость здесь в <em>ядре Windows</em>, даже не в Internet Explorer. Объясню почему. В своём тестовом примере Liu Die Yu показывает, что в том, что Internet Explorer запускает Блокнот, "виновато" имя файла, который Safari сохраняет&nbsp;&mdash;&nbsp;<code>schannel.dll</code> (также сработают <code>sqmapi.dll</code> и <code>imageres.dll</code>).</p>
<p>Причина уязвимости здесь заключается в <em>порядке поиска динамических библиотек</em> (кому интересны все технические подробности&nbsp;&mdash;&nbsp;читайте MSDN про функции <code>LoadLibrary</code> и <code>LoadLibraryEx</code>). Идея состоит в том, что <code>LoadLibrary</code> ищет загружаемую библиотеку в <em>рабочем каталоге</em> (перед тем, как искать ее в системном каталоге). При запуске Ишака с Рабочего стола рабочим каталогом является Рабочий стол (вполне логично). Далее IE загружает библиотеки, дело доходит до <code>schannel.dll</code>. Благодаря стараниям Safari, на Рабочем столе файл с таким именем имеется; в результате Windows загружает именно его. А он выполняет своё "черное дело".</p>
<p>В итоге получаем, что в ядро Windows эта уязвимость была встроена изначально&nbsp;&mdash;&nbsp;что называется, "уязвимость по дизайну". Я бы на месте Некрософт не баги бы в Safari искал (хотя молодцы, ничего не скажешь: обставили уязвимость в ядре так, что виноват оказался другой продукт), а свои собственные ошибки исправлял <img src='http://static.sjinks.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>По сути дела, "уязвимой" может оказаться любая программа, которая положит что-нибудь на Рабочий стол. Кстати, и FireFox можно обвинить в "уязвимости", даже если он спросит пользователя о сохранении файла: многие пользователи очень доверчивы (к сожалению), и сохранят файл, если их попросят. А так как, по словам Microsoft, большинство пользователей оставляют настройки по умолчанию, то файл попадет на Рабочий стол.</p>
<p>Так что, господа Microsoft'овцы, исправляйте вы лучше свои ошибки, а не обвиняйте в них сторонние программы <img src='http://static.sjinks.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /></p>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/security/196-vulnerability-in-safari-for-windows-proves-critical/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/security/196-vulnerability-in-safari-for-windows-proves-critical/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Мультизагрузочные системы и конфликты со временем</title>
		<link>http://blog.sjinks.pro/administering/112-multiple-boot-systems-time-conflicts/</link>
		<comments>http://blog.sjinks.pro/administering/112-multiple-boot-systems-time-conflicts/#comments</comments>
		<pubDate>Wed, 23 Apr 2008 14:56:07 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[Администрирование]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[время]]></category>
		<category><![CDATA[мультизагрузочная система]]></category>
		<category><![CDATA[патч]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=112</guid>
		<description><![CDATA[Как заставить Windows и Linux понимать время одинаково Конфликты даты/времени случаются довольно часто у пользователей мультизагрузочных систем. Дело в том, что одни операционные системы (Mac/Linux/Unix) хранят время как UTC (универсальное координированное время), другие операционные системы (например, Windows) сохраняют местное время. И всё бы ничего, но только время сохраняется в аппаратных часах. И, как следствие, операционные [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/administering/112-multiple-boot-systems-time-conflicts/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Как заставить <a href="http://blog.sjinks.pro/tag/windows/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Windows">Windows</a> и <a href="http://blog.sjinks.pro/tag/linux/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Linux">Linux</a> понимать <a href="http://blog.sjinks.pro/tag/time/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  время">время</a> одинаково</em></h2>
<p>Конфликты даты/времени случаются довольно часто у пользователей мультизагрузочных систем. Дело в том, что одни операционные системы (Mac/Linux/Unix) хранят время как <abbr title="Universal Coordinated Time">UTC</abbr> (<em>универсальное координированное время</em>), другие операционные системы (например, Windows) сохраняют местное время. И всё бы ничего, но только время сохраняется в аппаратных часах. И, как следствие, операционные системы, установленные на компьютере, видят время по-разному.<span id="more-112"></span></p>
<p>Считается, что хранение времени в UTC предпочтительнее (так как в UTC отсутствует понятие "летнее время", вследствие чего часы переводить не требуется).</p>
<h2>Как заставить Windows использовать UTC</h2>
<p>Используем небольшой <a href="http://blog.sjinks.pro/tag/patch/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  патч">патч</a>:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p1126">
        <div class="code reg" id="p112code6">
<span class="geshi_registry_header">Windows Registry Editor Version 5.00</span><br />
<br />
<span class="br0">&#91;</span><span class="kw3">HKEY_LOCAL_MACHINE</span>\SYSTEM\CurrentControlSet\Control\TimeZoneInformation<span class="br0">&#93;</span><br />
<span class="geshi_variable">&quot;RealTimeIsUniversal&quot;</span><span class="sy0">=</span><span class="re3">dword:00000001</span>
        </div>
    </div>
</div>

<h2>Как заставить Linux использовать местное время</h2>
<p>Чтобы Linux считал, что системные часы установлены в местное время, нужно подправить файл <code>/etc/default/rcS</code>:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p1127">
        <div class="code bash" id="p112code7">
<span class="kw2">sudo</span> <span class="kw2">nano</span> <span class="sy0">/</span>etc<span class="sy0">/</span>default<span class="sy0">/</span>rcS
        </div>
    </div>
</div>

<p>Затем добавить (или изменить) следующую строку:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p1128">
        <div class="code bash" id="p112code8">
<span class="re2">UTC</span>=no<br />
<span class="co0"># Значение yes означает, что системные часы установлены в UTC, </span><br />
<span class="co0"># no - в местное время</span>
        </div>
    </div>
</div>

<p>Оригинал статьи: <a href="https://help.ubuntu.com/community/UbuntuTime?action=show&#038;redirect=ChangeTimezoneHowto#head-31a2e864837bce9761bc0520026f78970d18afde">UbuntuTime - Community Ubuntu Documentation</a>.</p>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/administering/112-multiple-boot-systems-time-conflicts/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/administering/112-multiple-boot-systems-time-conflicts/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Кто живёт у нас в системе, или, как просмотреть полный список сервисных процессов в Windows</title>
		<link>http://blog.sjinks.pro/c-cpp/69-who-lives-in-my-system-how-to-display-full-list-of-service-processes/</link>
		<comments>http://blog.sjinks.pro/c-cpp/69-who-lives-in-my-system-how-to-display-full-list-of-service-processes/#comments</comments>
		<pubDate>Sat, 05 Apr 2008 09:42:46 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[сервис]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/?p=69</guid>
		<description><![CDATA[Маленькая программа для отображения полного списка установленных сервисных процессов Не секрет, что список сервисных процессов (служб), отображаемый Windows (например, при помощи консоли services.msc), является далеко не полным. Когда-то давно меня заинтересовало, как же можно посмотреть, какие службы/драйвера/системные процессы живут в системе. Самое простое решение&#160;&#8212;&#160;открыть Редактор реестра (regedit) и посмотреть. Список сервисов и не только находится [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/c-cpp/69-who-lives-in-my-system-how-to-display-full-list-of-service-processes/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Маленькая программа для отображения полного списка установленных сервисных процессов</em></h2>
<p>Не секрет, что список сервисных процессов (служб), отображаемый <a href="http://blog.sjinks.pro/tag/windows/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Windows">Windows</a> (например, при помощи консоли <code>services.msc</code>), является <em>далеко</em> не полным. Когда-то давно меня заинтересовало, как же можно посмотреть, какие службы/драйвера/системные процессы живут в системе.<span id="more-69"></span></p>
<p>Самое простое решение&nbsp;&mdash;&nbsp;открыть Редактор реестра (<code>regedit</code>) и посмотреть. Список сервисов и не только находится в <code>HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services</code>. Однако по тем данным, которые представлены в реестре, трудно определить, какая из служб работает в данный момент времени, чем она является (напрмер, драйвером ядра или драйвером файловой системы) и&nbsp;т.п.</p>
<p>В <a href="http://blog.sjinks.pro/tag/microsoft/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Microsoft">Microsoft</a> Windows Recovery Console есть команда, <code>listsvc</code>, позволяющая получить полный список сервисных процессов. Мне стало интересно написать что-то подобное, и вот результат:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p6910">
        <div class="code c" id="p69code10">
<ol class="c" style="font-family:monospace;"><li class="li1"><div class="de1"><span class="coMULTI">/*-------------------------------------------------------------------------*/</span></div></li>
<li class="li1"><div class="de1"><span class="co2">#include &lt;windows.h&gt;</span></div></li>
<li class="li1"><div class="de1"><span class="co2">#include &lt;stdlib.h&gt;</span></div></li>
<li class="li1"><div class="de1"><span class="co2">#include &lt;stdio.h&gt;</span></div></li>
<li class="li1"><div class="de1"><span class="co2">#include &lt;string.h&gt;</span></div></li>
<li class="li1"><div class="de1"><span class="coMULTI">/*-------------------------------------------------------------------------*/</span></div></li>
<li class="li1"><div class="de1"><span class="kw4">const</span> <span class="kw4">char</span><span class="sy0">*</span> unknown_error <span class="sy0">=</span> <span class="st0">&quot;&lt;Unknown error!&gt;&quot;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1"><span class="kw4">const</span> <span class="kw4">char</span><span class="sy0">*</span> get_error_code<span class="br0">&#40;</span>DWORD dwCode<span class="br0">&#41;</span></div></li>
<li class="li1"><div class="de1"><span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw4">const</span> <span class="kw4">char</span><span class="sy0">*</span> msgbuf<span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">return</span> <span class="br0">&#40;</span><span class="sy0">!</span>FormatMessage<span class="br0">&#40;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; FORMAT_MESSAGE_ALLOCATE_BUFFER <span class="sy0">|</span> FORMAT_MESSAGE_FROM_SYSTEM <span class="sy0">|</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; FORMAT_MESSAGE_IGNORE_INSERTS<span class="sy0">,</span> NULL<span class="sy0">,</span> dwCode<span class="sy0">,</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; MAKELANGID<span class="br0">&#40;</span>LANG_NEUTRAL<span class="sy0">,</span> SUBLANG_DEFAULT<span class="br0">&#41;</span><span class="sy0">,</span> <span class="br0">&#40;</span>LPTSTR<span class="br0">&#41;</span><span class="sy0">&amp;</span>msgbuf<span class="sy0">,</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 0<span class="sy0">,</span> NULL</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#41;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#41;</span> <span class="sy0">?</span> unknown_error <span class="sy0">:</span> msgbuf<span class="sy0">;</span></div></li>
<li class="li1"><div class="de1"><span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1"><span class="coMULTI">/*-------------------------------------------------------------------------*/</span></div></li>
<li class="li1"><div class="de1"><span class="kw4">const</span> <span class="kw4">char</span><span class="sy0">*</span> servicetypes<span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="st0">&quot;File System Driver&quot;</span><span class="sy0">,</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="st0">&quot;Kernel Driver&quot;</span><span class="sy0">,</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="st0">&quot;Own Process&quot;</span><span class="sy0">,</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="st0">&quot;Share Process&quot;</span><span class="sy0">,</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="st0">&quot;Unknown&quot;</span></div></li>
<li class="li1"><div class="de1"><span class="br0">&#125;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1"><span class="coMULTI">/*-------------------------------------------------------------------------*/</span></div></li>
<li class="li1"><div class="de1"><span class="kw4">const</span> <span class="kw4">char</span><span class="sy0">*</span> get_service_type<span class="br0">&#40;</span>DWORD dwType<span class="br0">&#41;</span></div></li>
<li class="li1"><div class="de1"><span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; size_t i <span class="sy0">=</span> <span class="nu0">4</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>SERVICE_FILE_SYSTEM_DRIVER <span class="sy0">==</span> <span class="br0">&#40;</span>dwType <span class="sy0">&amp;</span> SERVICE_FILE_SYSTEM_DRIVER<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; i <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">else</span> <span class="kw1">if</span> <span class="br0">&#40;</span>SERVICE_KERNEL_DRIVER <span class="sy0">==</span> <span class="br0">&#40;</span>dwType <span class="sy0">&amp;</span> SERVICE_KERNEL_DRIVER<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; i <span class="sy0">=</span> <span class="nu0">1</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">else</span> <span class="kw1">if</span> <span class="br0">&#40;</span>SERVICE_WIN32_OWN_PROCESS <span class="sy0">==</span> <span class="br0">&#40;</span>dwType <span class="sy0">&amp;</span> SERVICE_WIN32_OWN_PROCESS<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; i <span class="sy0">=</span> <span class="nu0">2</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">else</span> <span class="kw1">if</span> <span class="br0">&#40;</span>SERVICE_WIN32_SHARE_PROCESS <span class="sy0">==</span> <span class="br0">&#40;</span>dwType <span class="sy0">&amp;</span> SERVICE_WIN32_SHARE_PROCESS<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; i <span class="sy0">=</span> <span class="nu0">3</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">return</span> servicetypes<span class="br0">&#91;</span>i<span class="br0">&#93;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1"><span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1"><span class="coMULTI">/*-------------------------------------------------------------------------*/</span></div></li>
<li class="li1"><div class="de1"><span class="kw4">const</span> <span class="kw4">char</span><span class="sy0">*</span> states<span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="st0">&quot;stopped&quot;</span><span class="sy0">,</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="st0">&quot;start pending&quot;</span><span class="sy0">,</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="st0">&quot;stop pending&quot;</span><span class="sy0">,</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="st0">&quot;running&quot;</span><span class="sy0">,</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="st0">&quot;continue pending&quot;</span><span class="sy0">,</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="st0">&quot;pause pending&quot;</span><span class="sy0">,</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="st0">&quot;paused&quot;</span><span class="sy0">,</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="st0">&quot;unknown&quot;</span></div></li>
<li class="li1"><div class="de1"><span class="br0">&#125;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1"><span class="coMULTI">/*-------------------------------------------------------------------------*/</span></div></li>
<li class="li1"><div class="de1"><span class="kw4">const</span> <span class="kw4">char</span><span class="sy0">*</span> get_state<span class="br0">&#40;</span>DWORD dwState<span class="br0">&#41;</span></div></li>
<li class="li1"><div class="de1"><span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="sy0">--</span>dwState<span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="br0">&#40;</span><span class="kw4">unsigned</span> <span class="kw4">int</span><span class="br0">&#41;</span>dwState <span class="sy0">&gt;</span> 6<span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; dwState <span class="sy0">=</span> <span class="nu0">7</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">return</span> states<span class="br0">&#91;</span>dwState<span class="br0">&#93;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1"><span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1"><span class="coMULTI">/*-------------------------------------------------------------------------*/</span></div></li>
<li class="li1"><div class="de1"><span class="kw4">int</span> main<span class="br0">&#40;</span><span class="kw4">int</span> argc<span class="sy0">,</span> <span class="kw4">char</span><span class="sy0">*</span> argv<span class="br0">&#91;</span><span class="br0">&#93;</span><span class="br0">&#41;</span></div></li>
<li class="li1"><div class="de1"><span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; SC_HANDLE Handle<span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; BOOL Status<span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; LPENUM_SERVICE_STATUS Buffer <span class="sy0">=</span> NULL<span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; DWORD BytesNeeded<span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; DWORD ServicesReturned<span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; DWORD ResumeHandle<span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; DWORD Error<span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; DWORD i<span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw4">const</span> <span class="kw4">char</span><span class="sy0">*</span> ErrCode<span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; Handle <span class="sy0">=</span> OpenSCManager<span class="br0">&#40;</span>NULL<span class="sy0">,</span> NULL<span class="sy0">,</span> SC_MANAGER_CONNECT <span class="sy0">|</span> SC_MANAGER_ENUMERATE_SERVICE<span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>NULL <span class="sy0">==</span> Handle<span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; ErrCode <span class="sy0">=</span> get_error_code<span class="br0">&#40;</span>GetLastError<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">printf</span><span class="br0">&#40;</span><span class="st0">&quot;Call to OpenSCManager failed: %s<span class="es1">\n</span>&quot;</span><span class="sy0">,</span> ErrCode<span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; LocalFree<span class="br0">&#40;</span><span class="br0">&#40;</span>HLOCAL<span class="br0">&#41;</span>ErrCode<span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> EXIT_FAILURE<span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; ResumeHandle <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; Status <span class="sy0">=</span> EnumServicesStatus<span class="br0">&#40;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; Handle<span class="sy0">,</span> SERVICE_DRIVER <span class="sy0">|</span> SERVICE_WIN32<span class="sy0">,</span> SERVICE_STATE_ALL<span class="sy0">,</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; Buffer<span class="sy0">,</span> 0<span class="sy0">,</span> <span class="sy0">&amp;</span>BytesNeeded<span class="sy0">,</span> <span class="sy0">&amp;</span>ServicesReturned<span class="sy0">,</span> <span class="sy0">&amp;</span>ResumeHandle</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; Error <span class="sy0">=</span> GetLastError<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>FALSE <span class="sy0">==</span> Status <span class="sy0">&amp;&amp;</span> ERROR_MORE_DATA <span class="sy0">==</span> Error<span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; Buffer <span class="sy0">=</span> <span class="br0">&#40;</span>LPENUM_SERVICE_STATUS<span class="br0">&#41;</span>calloc<span class="br0">&#40;</span>BytesNeeded<span class="sy0">,</span> 1<span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>NULL <span class="sy0">==</span> Buffer<span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">printf</span><span class="br0">&#40;</span><span class="st0">&quot;Failed to allocate %ld bytes of memory!<span class="es1">\n</span>&quot;</span><span class="sy0">,</span> BytesNeeded<span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CloseServiceHandle<span class="br0">&#40;</span>Handle<span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> EXIT_FAILURE<span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; Status <span class="sy0">=</span> EnumServicesStatus<span class="br0">&#40;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Handle<span class="sy0">,</span> SERVICE_DRIVER <span class="sy0">|</span> SERVICE_WIN32<span class="sy0">,</span> SERVICE_STATE_ALL<span class="sy0">,</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Buffer<span class="sy0">,</span> BytesNeeded<span class="sy0">,</span> <span class="sy0">&amp;</span>BytesNeeded<span class="sy0">,</span> <span class="sy0">&amp;</span>ServicesReturned<span class="sy0">,</span> <span class="sy0">&amp;</span>ResumeHandle</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>FALSE <span class="sy0">==</span> Status<span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ErrCode <span class="sy0">=</span> get_error_code<span class="br0">&#40;</span>GetLastError<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">printf</span><span class="br0">&#40;</span><span class="st0">&quot;Call to EnumServicesStatus failed: %s<span class="es1">\n</span>&quot;</span><span class="sy0">,</span> ErrCode<span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; LocalFree<span class="br0">&#40;</span><span class="br0">&#40;</span>HLOCAL<span class="br0">&#41;</span>ErrCode<span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; free<span class="br0">&#40;</span>Buffer<span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CloseServiceHandle <span class="br0">&#40;</span>Handle<span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> EXIT_FAILURE<span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">else</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; ErrCode <span class="sy0">=</span> get_error_code<span class="br0">&#40;</span>GetLastError<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">printf</span><span class="br0">&#40;</span><span class="st0">&quot;Call to EnumServicesStatus failed: %s<span class="es1">\n</span>&quot;</span><span class="sy0">,</span> ErrCode<span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; LocalFree<span class="br0">&#40;</span><span class="br0">&#40;</span>HLOCAL<span class="br0">&#41;</span>ErrCode<span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; CloseServiceHandle<span class="br0">&#40;</span>Handle<span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> EXIT_FAILURE<span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw3">printf</span> <span class="br0">&#40;</span><span class="st0">&quot;Service<span class="es1">\t</span>Display Name<span class="es1">\t</span>Type<span class="es1">\t</span>State<span class="es1">\n</span>&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span>i<span class="sy0">=</span><span class="nu0">0</span><span class="sy0">;</span> i<span class="sy0">&lt;</span>ServicesReturned<span class="sy0">;</span> <span class="sy0">++</span>i<span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">printf</span> <span class="br0">&#40;</span><span class="st0">&quot;%s<span class="es1">\t</span>%s<span class="es1">\t</span>%s<span class="es1">\t</span>%s<span class="es1">\n</span>&quot;</span><span class="sy0">,</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Buffer<span class="br0">&#91;</span>i<span class="br0">&#93;</span>.<span class="me1">lpServiceName</span><span class="sy0">,</span> Buffer<span class="br0">&#91;</span>i<span class="br0">&#93;</span>.<span class="me1">lpDisplayName</span><span class="sy0">,</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; get_service_type<span class="br0">&#40;</span>Buffer<span class="br0">&#91;</span>i<span class="br0">&#93;</span>.<span class="me1">ServiceStatus</span>.<span class="me1">dwServiceType</span><span class="br0">&#41;</span><span class="sy0">,</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; get_state<span class="br0">&#40;</span>Buffer<span class="br0">&#91;</span>i<span class="br0">&#93;</span>.<span class="me1">ServiceStatus</span>.<span class="me1">dwCurrentState</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; free<span class="br0">&#40;</span>Buffer<span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; CloseServiceHandle<span class="br0">&#40;</span>Handle<span class="br0">&#41;</span><span class="sy0">;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">return</span> EXIT_SUCCESS<span class="sy0">;</span></div></li>
<li class="li1"><div class="de1"><span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1"><span class="coMULTI">/*-------------------------------------------------------------------------*/</span></div></li>
</ol>
        </div>
    </div>
</div>

<p>Хотя это код трёхгодичной давности, работает до сих пор <img src='http://static.sjinks.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p><a href="http://d.sjinks.pro/listsvc.c">Скачать исходный код listsvc</a>.<br />
<a href="http://d.sjinks.pro/listsvc.exe">Скачать EXE-файл (7168&nbsp;байт)</a>.</p>
<p>Сумма <abbr title="Message Digest 5">MD5</abbr> listsvc.exe: <code>a04735a4ea104d96af78d234ae4e35b6</code><br />
Сумма <abbr title="Secure Hash Algorithm-1">SHA1</abbr> listsvc.exe: <code>6d24bf22e48fc8f8e2b8a49f9fce51e973ff0a00</code></p>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/c-cpp/69-who-lives-in-my-system-how-to-display-full-list-of-service-processes/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/c-cpp/69-who-lives-in-my-system-how-to-display-full-list-of-service-processes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Настройка nginx и PHP/FastCGI в Windows</title>
		<link>http://blog.sjinks.pro/windows/58-nginx-php-fastcgi-in-windows/</link>
		<comments>http://blog.sjinks.pro/windows/58-nginx-php-fastcgi-in-windows/#comments</comments>
		<pubDate>Fri, 28 Mar 2008 06:14:02 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[nginx]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[Администрирование]]></category>
		<category><![CDATA[Cygwin]]></category>
		<category><![CDATA[FastCGI]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/windows/58-nginx-php-fastcgi-in-windows/</guid>
		<description><![CDATA[Как настроить связку nginx+PHP в Windows и не иметь головной боли. Принято считать, что замечательный Web-сервер nginx работает только под Unix-подобными операционными системами. Верно, но лишь отчасти. nginx превосходно собирается и в Cygwin. Возникает вопрос: а зачем это надо, собирать nginx под Windows? Ответ: я знаю достаточно много web-разработчиков, работающих в силу тех или иных [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/windows/58-nginx-php-fastcgi-in-windows/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Как настроить связку <a href="http://blog.sjinks.pro/tag/nginx/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  nginx">nginx</a>+<a href="http://blog.sjinks.pro/tag/php/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  PHP">PHP</a> в <a href="http://blog.sjinks.pro/tag/windows/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Windows">Windows</a> и не иметь головной боли.</em></h2>
<p>Принято считать, что замечательный Web-сервер <a href="http://nginx.net/"><strong>nginx</strong></a> работает только под Unix-подобными операционными системами. Верно, но лишь отчасти. nginx превосходно собирается и в <a href="http://blog.sjinks.pro/tag/cygwin/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Cygwin">Cygwin</a>. Возникает вопрос: а зачем это надо, собирать nginx под Windows? Ответ: я знаю достаточно много web-разработчиков, работающих в силу тех или иных причин под Windows. И в работе встречаются ситуации, когда на рабочей машине нужно создать конфигурацию, максимально похожую на конфигурацию сервера (production или development в данном случае не важно).<span id="more-58"></span></p>
<p>Начну с примера: есть сайт, который позволяет зарегистрированным пользователям скачивать что-либо (музыку, программы, фильмы &mdash; не суть важно). Одним из самых распространённых решений в этом случае является использование нескольких серверов. Во многих конфигурациях, которые я видел, "web-мордой" занимается Apache, а на обслуживании закачек стоит nginx+PHP+<a href="http://blog.sjinks.pro/tag/fastcgi/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  FastCGI">FastCGI</a> (PHP занимается вопросами авторизации, ведения статистики и т.п.). Сразу оговорюсь, что есть альтернативное решение, когда nginx используется в качестве reverse proxy перед Apache &mdash; nginx проксирует запросы к PHP-скриптам Apache, а PHP-скрипт, если ему надо отдать что-то статическое, делает X-Accel-Redirect. Подробнее описано в статьях «<a href="http://blog.kovyrin.net/2006/11/01/nginx-x-accel-redirect-php-rails/">Использование X-Accel-Redirect с Nginx для реализации контролируемых скачиваний</a>» и «<a href="http://blog.kovyrin.net/2006/05/18/nginx-as-reverse-proxy/">Использование Nginx Как Reverse-Proxy Сервера На Загруженных Сайтах</a>».</p>
<p>Отвлекусь от темы и скажу пару слов про альтернативную конфигурацию: она работает на «ура», если сайт отдаёт в основном статический контент. Если же б<em>о</em>льшая часть запросов идёт к PHP, то логичнее поставить nginx <em>за</em> Apache (в противном случае будет тратиться <a href="http://blog.sjinks.pro/tag/time/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  время">время</a> на проксирование запроса). Еще один минус у такой конфигурации — использование менеджеров закачек (всякие там ReGet, FlashGet) "ложит" Apache. Можно, конечно, ввести ограничения на одновременное количество закачек, а можно настроить PHP работать в паре с nginx.</p>
<p>Возвращаясь к теме разговора: а теперь предположим, что это всё нужно реализовать локально (для тестирования). Вот в таких ситуациях nginx для Windows очень хорошо помогает <img src='http://static.sjinks.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>В Cygwin сборка nginx проходит практически без проблем (хотя более старые версии приходилось немного патчить руками), на выходе получаем nginx.exe <img src='http://static.sjinks.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /><br />
Я не буду вдаваться в детали конфигурирования nginx, потому что есть замечательная статья «<a href="http://blog.kovyrin.net/2006/05/30/nginx-php-fastcgi-howto/">Настройка Nginx для поддержки PHP при помощи FastCGI</a>», просто отмечу некоторые детали, упрощающие жизнь.</p>
<p>Итак, у нас есть PHP, Cygwin и nginx. К сожалению, nginx не поддерживает PHP как модуль (подобно Apache), поэтому nginx и PHP могут работать только по протоколу FastCGI (возможно, и по обычному <abbr title="Common Gateway Interface">CGI</abbr>, я не пробовал — в любом случае, производительность при работе через CGI будет значительно ниже).</p>
<p>Для определённости будем полагать, что nginx у нас сконфигурирован следующим образом (я привожу только часть, относящуюся к FastCGI):</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p5816">
        <div class="code nginx" id="p58code16">
<span class="kw1">location</span> ~ \.php$ {<br />
&nbsp; &nbsp; <span class="kw1">fastcgi_pass</span> &nbsp; 127.0.0.1:<span class="nu0">9000</span>;<br />
&nbsp; &nbsp; <span class="kw1">fastcgi_index</span> &nbsp;<span class="kw1">index</span>.php;<br />
&nbsp; &nbsp; <span class="kw1">fastcgi_param</span> &nbsp;SCRIPT_FILENAME &nbsp;disk:/path/to$fastcgi_script_name;<br />
&nbsp; &nbsp; <span class="kw1">include</span> &nbsp; &nbsp; &nbsp; &nbsp;conf/fastcgi_params;<br />
}
        </div>
    </div>
</div>

<p><strong>Ключевой момент:</strong> в <code>fastcgi_param</code> должен быть путь, который поймёт интерпретатор PHP. Если интерпретатор собран в Windows, то путь тоже должен быть в формате Windows (например, c:/web/mysite.com/scripts). Хвостового слэша быть не должно, потому что <code>$fastcgi_script_name</code> именно с него и начинается. То есть если пользователь запросил http://mysite.com/test.php, то <code>$fastcgi_script_name</code> будет равен <code>/test.php</code>.</p>
<p>Файл conf/fastcgi_params:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p5817">
        <div class="code nginx" id="p58code17">
<span class="kw1">fastcgi_param</span> &nbsp;QUERY_STRING &nbsp; &nbsp; &nbsp; $query_string;<br />
<span class="kw1">fastcgi_param</span> &nbsp;REQUEST_METHOD &nbsp; &nbsp; $request_method;<br />
<span class="kw1">fastcgi_param</span> &nbsp;CONTENT_TYPE &nbsp; &nbsp; &nbsp; $content_type;<br />
<span class="kw1">fastcgi_param</span> &nbsp;CONTENT_LENGTH &nbsp; &nbsp; $content_length;<br />
<br />
<span class="kw1">fastcgi_param</span> &nbsp;SCRIPT_NAME &nbsp; &nbsp; &nbsp; &nbsp;$fastcgi_script_name;<br />
<span class="kw1">fastcgi_param</span> &nbsp;REQUEST_URI &nbsp; &nbsp; &nbsp; &nbsp;$request_uri;<br />
<span class="kw1">fastcgi_param</span> &nbsp;DOCUMENT_URI &nbsp; &nbsp; &nbsp; $document_uri;<br />
<span class="kw1">fastcgi_param</span> &nbsp;DOCUMENT_ROOT &nbsp; &nbsp; &nbsp;$document_root;<br />
<span class="kw1">fastcgi_param</span> &nbsp;SERVER_PROTOCOL &nbsp; &nbsp;$server_protocol;<br />
<br />
<span class="kw1">fastcgi_param</span> &nbsp;GATEWAY_INTERFACE &nbsp;CGI/<span class="nu0">1.1</span>;<br />
<span class="kw1">fastcgi_param</span> &nbsp;SERVER_SOFTWARE &nbsp; &nbsp;nginx;<br />
<br />
<span class="kw1">fastcgi_param</span> &nbsp;REMOTE_ADDR &nbsp; &nbsp; &nbsp; &nbsp;$remote_addr;<br />
<span class="kw1">fastcgi_param</span> &nbsp;REMOTE_PORT &nbsp; &nbsp; &nbsp; &nbsp;$remote_port;<br />
<span class="kw1">fastcgi_param</span> &nbsp;SERVER_ADDR &nbsp; &nbsp; &nbsp; &nbsp;$server_addr;<br />
<span class="kw1">fastcgi_param</span> &nbsp;SERVER_PORT &nbsp; &nbsp; &nbsp; &nbsp;$server_port;<br />
<span class="kw1">fastcgi_param</span> &nbsp;SERVER_NAME &nbsp; &nbsp; &nbsp; &nbsp;$server_name;<br />
<br />
<span class="co1"># PHP only, required if PHP was built with --enable-force-cgi-redirect</span><br />
<span class="kw1">fastcgi_param</span> &nbsp;REDIRECT_STATUS &nbsp; &nbsp;<span class="nu0">200</span>;
        </div>
    </div>
</div>

<p>Для удобства, установим nginx как <a href="http://blog.sjinks.pro/tag/service/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  сервис">сервис</a> Windows. Для этого можно использовать, например, cygrunsrv:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p5818">
        <div class="code bash" id="p58code18">
cygrunsrv <span class="re5">--install</span> nginx <span class="re5">--path</span> <span class="sy0">/</span>path<span class="sy0">/</span>to<span class="sy0">/</span>nginx.exe <span class="re5">--disp</span> nginx <span class="re5">--neverexits</span>
        </div>
    </div>
</div>

<p>Ключевым здесь является параметр <code>--neverexits</code> — без него Windows будет жаловаться, что процесс был остановлен (из-за того, что nginx <code>fork()</code>'ается). Хотя это неправильное использование <code>--neverexits</code>.</p>
<p>Переходим к настройке PHP. По счастью, в Windows-версии PHP уже есть модуль с поддержкой FastCGI (он называется php-cgi.exe), так что пересобирать PHP не придётся (сборка PHP под Cygwin — неблагодарное занятие из-за парочки глюков в libtool; если у меня будет желание, как-нибудь напишу). В <a href="http://blog.kovyrin.net/2006/05/30/nginx-php-fastcgi-howto/">статье</a> приводится скрипт для запуска PHP/FastCGI, но мы поступим проще.</p>
<p>Сначала об одной не очень документированной особенности PHP/FastCGI: он имеет тенденцию «незаметно умирать» после некоторого числа запросов. Это связано со значением переменной окружения <code>PHP_FCGI_MAX_REQUESTS</code>, определяющей, какое максимальное количество запросов может «пережить» PHP. Можно, кончено, поставить «космическое» значение, но 2 миллиарда запросов — так ли это много? <img src='http://static.sjinks.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  На отрицательные значения переменной PHP громко ругается. Экспериментально было выяснено, что 0 — это то, что нужно (в документации я это не нашел).</p>
<p>Запускаем PHP:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p5819">
        <div class="code bash" id="p58code19">
<span class="kw1">set</span> <span class="re2">PHP_FCGI_MAX_REQUESTS</span>=0<br />
php-cgi <span class="re5">-b</span> 127.0.0.1:9000 <span class="re5">-c</span> path<span class="sy0">/</span>to<span class="sy0">/</span>php.ini
        </div>
    </div>
</div>

<p>А теперь как установить PHP/FastCGI сервисом Windows:</p>
          
<div class="codebox">
    <div class="the_code" style="" id="p5820">
        <div class="code bash" id="p58code20">
cygrunsrv <span class="re5">--install</span> php-cgi <span class="re5">--path</span> <span class="sy0">/</span>cygdrive<span class="sy0">/</span>f<span class="sy0">/</span>web<span class="sy0">/</span>php<span class="sy0">/</span>php-cgi.exe <span class="re5">--disp</span> <span class="st0">&quot;PHP/FastCGI&quot;</span> <span class="re5">--env</span> <span class="st0">&quot;PHP_FCGI_MAX_REQUESTS=0&quot;</span> <span class="re5">--args</span> <span class="st0">&quot;-b 127.0.0.1:9000 -c path/to/php.ini&quot;</span>
        </div>
    </div>
</div>

<p>Строка <code>-b 127.0.0.1:9000 -c path/to/php.ini</code> будет передана интерпретатору в качестве командной строки, поэтому путь <code>path/to/php.ini</code> должен быть путем Windows, если интепретатор собран под Windows.</p>
<p>Собственно, всё <img src='http://static.sjinks.info/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/windows/58-nginx-php-fastcgi-in-windows/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/windows/58-nginx-php-fastcgi-in-windows/feed/</wfw:commentRss>
		<slash:comments>44</slash:comments>
		</item>
		<item>
		<title>WassUp for WordPress и Windows</title>
		<link>http://blog.sjinks.pro/wordpress/45-wordpress-wassup-and-windows/</link>
		<comments>http://blog.sjinks.pro/wordpress/45-wordpress-wassup-and-windows/#comments</comments>
		<pubDate>Fri, 21 Mar 2008 00:25:16 +0000</pubDate>
		<dc:creator>Vladimir</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[Wassup]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[XHTML]]></category>
		<category><![CDATA[ошибка]]></category>
		<category><![CDATA[патч]]></category>

		<guid isPermaLink="false">http://blog.sjinks.pro/php/45-wordpress-wassup-and-windows-2/</guid>
		<description><![CDATA[Как заставить Wassup работать под Windows Для WordPress есть замечательный плагин &#8212; Wassup. Хороший плагин, но вот беда: не дружит с Windows. Не дружит из-за того, что переменные хардкодить нельзя. Это в Unix/Linux каталоги разделяются &#8216;/&#8217;, а в Windows используется &#8216;\&#8217;. И вот из-за невнимательности автора плагин не работает в Windows. К счастью, всё лечится [...]<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/wordpress/45-wordpress-wassup-and-windows/">источник</a> обязательно.</p>]]></description>
			<content:encoded><![CDATA[<h2><em>Как заставить <a href="http://blog.sjinks.pro/tag/wassup/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Wassup">Wassup</a> работать под <a href="http://blog.sjinks.pro/tag/windows/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Windows">Windows</a></em></h2>
<p>Для <a href="http://blog.sjinks.pro/tag/wordpress/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  WordPress">WordPress</a> есть замечательный плагин &mdash; <a href="http://wordpress.org/extend/plugins/wassup/">Wassup</a>. Хороший плагин, но вот беда: не дружит с Windows. Не дружит из-за того, что переменные хардкодить нельзя. Это в Unix/<a href="http://blog.sjinks.pro/tag/linux/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Linux">Linux</a> каталоги разделяются &#8216;/&#8217;, а в Windows используется &#8216;\&#8217;. И вот из-за невнимательности автора плагин не работает в Windows. К счастью, всё лечится очень просто.</p>
<p><a href="http://blog.sjinks.pro/tag/patch/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  патч">Патч</a> лежит <a href='http://static.sjinks.info/wp-content/uploads/2008/03/actionphp.diff' title='Патч для Wassup'>здесь</a>. Патч нужно применить к файлу <code>/wp-content/plugins/wassup/lib/action.<a href="http://blog.sjinks.pro/tag/php/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  PHP">php</a></code>.</p>
<p>Помимо исправления ошибки с разделителями каталогов, патч исправляет небольшую ошибку, связанную с невалидностью (инвалидностью?) генерируемого (X)<a href="http://blog.sjinks.pro/tag/html/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  HTML">HTML</a>-кода.</p>
<p>© 2012 <a href="http://blog.sjinks.pro">Ars Longa, Vita Brevis</a>. Все права защищены. Перепубликация материалов без разрешения автора запрещена.</p>
<p>При использовании материалов блога наличие активной не закрытой от индексирования ссылки на <a href="http://blog.sjinks.pro/wordpress/45-wordpress-wassup-and-windows/">источник</a> обязательно.</p>]]></content:encoded>
			<wfw:commentRss>http://blog.sjinks.pro/wordpress/45-wordpress-wassup-and-windows/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>

