Category Archives: Uncategorized

Защищаемся от спама по добавлению ip в чёрный список

Иногда боты достают конкретно, можно банить их по ip.

Для этого имеем в виду то, что ip в таблице со счётчиком num==0 нормален, а всё что выше – нет, и мы его откидываем.

Итак, строим такую таблицу:

CREATE TABLE `ips_blocked` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `dtm` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `ip` varchar(44) NOT NULL COMMENT 'ip адрес',
  `ua` tinytext NOT NULL COMMENT 'User agent',
  `num` int(11) NOT NULL DEFAULT '0' COMMENT 'кол-во попаданий',
  `rem` tinytext NOT NULL COMMENT 'примечание',
  PRIMARY KEY (`id`),
  UNIQUE KEY `ip` (`ip`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

ip туда добавляем вручную, т.к. этот процесс редкий, если нет – пишите скрипт для добавления туда ip.

По умолчанию num равен 0.

Итак, перед записью заявки проверяем ip по этой таблице, и если он есть и его номер num больше 0, откидываем заявку:

$ip = empty($_SERVER['REMOTE_ADDR']) ? '' : htmlspecialchars($_SERVER['REMOTE_ADDR']);
 
if(DB::columnIntPrepared('SELECT 1 FROM ips_blocked WHERE ip=? AND num>0', array($ip))) {
	DB::execute("UPDATE ips_blocked SET num=num+1 WHERE ip=?", array($ip));
	report('Ваш ip находится в чёрном списке. Пришлите вашу заявку нам на email.');
}

Таким образом мы можем пропустить первое случайное попадание в чёрный список по ip, а если оно повторится – всё, заявки с данного ip больше не принимаем совсем.

Таким образом, если мы опять обнаружили спамерский ip, ставим его номер 1 в таблице ips_blocked.

На этом всё, до свидания!

P.S. Для ip версии 4 (IPv4) наиболее эффективно наверное использовать тип INT(11),
и при этом каждый раз при добавлении/выборке его в/из таблицы надо использовать соотв. функции, например так:

Добавление: INSERT INTO ips_blocked VALUES (…, INET_ATON(?), …)
Выборка: SELECT INET_NTOA(ip) AS ip

Здесь вместо знака вопроса при добавлении вставляем ip в подготовленное SQL-выражение.

Но я не стал этого делать, а сделал тип поля VARCHAR и длину поля вообще 44, чтобы при случае иметь возможность добавлять IPv6, не знаю уже, когда этот момент настанет. ))))

Лечим раскладку клавиатуры

В одном из последних (весенних ещё) обширных обновлений винда как обычно испортило мне5 раскладку.

У меня такая раскладка:
ENG English (United States)/ US keyboard – основная
РУС Russian Russian keyboard.

Английская основная, т.к. я в основном занимаюсь программированием, а все языки программирования, кроме Рапиры, требуют латинской раскладки.

Переклчюаюсь я по Ctrl+Shift.

Итак, как я уже сказал, испортили мне опять раскладку, поставили en-GB вместе с en-US, удалили раскладку РУС.

Так вот, раньше в Language Preferences я мог быстро удалить ненужные раскладки, добавить нужные и выбрать раскладку по умолчанию.
Теперь же, после последнего обнолвения – нет. Не могу удалить EN-GB, хотя она не назначена как дефолтная.
Кнопка “Remove” у неё почему-то не активна во всех случаях.

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

Помог только один вариант, которые я нашёл в конце постов на каком-то форуме, и этот вариант предлагал использование Windows Power Shell.
Выглядит дико, признаю, но это факт. Как обычным пользователям, не знакомым с оболочками и программированием исправить себе раскладку клавиатуры, я не знаю!

Итак, сценарий исправления таков:

1. Открываем Power Shell с администраторскими правами.
2. Смотрим текущие раскладки:
PS C:\WINDOWS\system32> Get-WinUserLanguageList

LanguageTag : en-US
Autonym : English (United States)
EnglishName : English
LocalizedName : English (United States)
ScriptName : Latin script
InputMethodTips : {0409:00000409}
Spellchecking : True
Handwriting : False

LanguageTag : en-AU
Autonym : English (Australia)
EnglishName : English
LocalizedName : English (Australia)
ScriptName : Latin script
InputMethodTips : {0C09:00001809}
Spellchecking : True
Handwriting : False

LanguageTag : ru
Autonym : русский
EnglishName : Russian
LocalizedName : Russian
ScriptName : Cyrillic
InputMethodTips : {0419:00000419}
Spellchecking : True
Handwriting : False

LanguageTag : en-GB
Autonym : English (United Kingdom)
EnglishName : English
LocalizedName : English (United Kingdom)
ScriptName : Latin script
InputMethodTips : {0809:00000809}
Spellchecking : True
Handwriting : False

Тут видны 4 раскладки, это я экспериментировал, пытаясь добавлять/удалять и переназначать дефолтные раскладки.

Итак, чтобы устновить одну только раскладку, удалив все осталдьные, выполняем такую команду:
PS C:\WINDOWS\system32> Set-WinUserLanguageList -LanguageList en-US -Force
и смотрим, что получилось:
PS C:\WINDOWS\system32> Get-WinUserLanguageList

LanguageTag : en-US
Autonym : English (United States)
EnglishName : English
LocalizedName : English (United States)
ScriptName : Latin script
InputMethodTips : {0409:00000409}
Spellchecking : True
Handwriting : False

ОК, но как нам теперь доавить русскую раскладку? Не существует метода типа Add-WinUserLanguage, естьт только команды Set-/Get-WinUserLanguageList.

Для формирования нужной раскладки нам надо создать оъект с нужными раскладками и передать его в качестве парметра Set-WinUserLanguageList.

Так как я не особо шарю в PowerShell, больше в линуксовых оболчках работаю, то делаю все моим любимым методом проб и ошибок, пытаясь нарыть нужную инфо через Гугл.

Вот мои действия, которые в итоге привели к успеху, я сейчас имю 2 нужные мне раскладки, описанные в начале поста, и они нормально функционируют, большего мне не нужно!
Итак, удаляем все раскладки, что можно, помня, что EN-GB не удаляется совсем, неважно, дефолтная она или нет, т.к. кнопка “Remove” по загадочным причинам не активна совсем.
Доабвляем EN-US, делаем её дефолтной и переставляем на первое место, потом добавляем раскладку РУС.

Теперь запускам Power Shell с административными привилегиями и делаем так:

PS C:\Users\Andrey> $list = Get-WinUserLanguageList
PS C:\Users\Andrey> $list
 
 
LanguageTag     : en-US
Autonym         : English (United States)
EnglishName     : English
LocalizedName   : English (United States)
ScriptName      : Latin script
InputMethodTips : {0409:00000409}
Spellchecking   : True
Handwriting     : False
 
LanguageTag     : en-GB
Autonym         : English (United Kingdom)
EnglishName     : English
LocalizedName   : English (United Kingdom)
ScriptName      : Latin script
InputMethodTips : {0809:00000809}
Spellchecking   : True
Handwriting     : False
 
LanguageTag     : ru
Autonym         : русский
EnglishName     : Russian
LocalizedName   : Russian
ScriptName      : Cyrillic
InputMethodTips : {0419:00000419}
Spellchecking   : True
Handwriting     : False
 
 
PS C:\Users\Andrey> $x = ($list[0], $list[2])
PS C:\Users\Andrey> $x
 
 
LanguageTag     : en-US
Autonym         : English (United States)
EnglishName     : English
LocalizedName   : English (United States)
ScriptName      : Latin script
InputMethodTips : {0409:00000409}
Spellchecking   : True
Handwriting     : False
 
LanguageTag     : ru
Autonym         : русский
EnglishName     : Russian
LocalizedName   : Russian
ScriptName      : Cyrillic
InputMethodTips : {0419:00000419}
Spellchecking   : True
Handwriting     : False
 
 
PS C:\Users\Andrey> Set-WinUserLanguageList $x
 
Confirm
Continue with this operation?
[Y] Yes  [N] No  [S] Suspend  [?] Help (default is "Y"): y

Всё, теперь у нас только 2 раскладки, EN-US и РУС:

PS C:\Users\Andrey> $list = Get-WinUserLanguageList
PS C:\Users\Andrey> $list
 
 
LanguageTag     : en-US
Autonym         : English (United States)
EnglishName     : English
LocalizedName   : English (United States)
ScriptName      : Latin script
InputMethodTips : {0409:00000409}
Spellchecking   : True
Handwriting     : False
 
LanguageTag     : ru
Autonym         : русский
EnglishName     : Russian
LocalizedName   : Russian
ScriptName      : Cyrillic
InputMethodTips : {0419:00000419}
Spellchecking   : True
Handwriting     : False

В этом можно также убедиться, щёлкнув на раскладку в трее справа.

Информация, которую я использовал для поиска нужного варианта:
************************************************************************************************

Удалять/добавлять нужные раскладки:
$list = Get-WinUserLanguageList

Возвращает массив с 2 объектами – пример для Английской и Литовской раскладок:

$list[0]:
LanguageTag : en-US
Autonym : English (United States)
EnglishName : English
LocalizedName : English (United States)
ScriptName : Latin script
InputMethodTips : {0409:00000409}
Spellchecking : True
Handwriting : False

$list[1]:
LanguageTag : lt
Autonym : lietuvių
EnglishName : Lithuanian
LocalizedName : Lithuanian
ScriptName : Latin script
InputMethodTips : {0427:00010427}
Spellchecking : True
Handwriting : False

Теперь мы можем установить одну расклдаку из массива так:
Set-WinUserLanguageList $($list[0])

Если же English и Lithuanian раскладки под индексом 0 и 1 в массиве, мы можем сделать так, чтобы добавить только две эти раскладки в системе:
$x = ($list[0], $list[1])
Set-WinUserLanguageList $x

********************************
Работаем с массивами в Power Shell

$x.RemoveAt(1) – не работает?
$x.remove(($x|where-object languagetag -eq ‘ru’)) – тоже не рбаотает?

Оба этих метода выдют одну ошибку:
************************************************************************************************
Exception calling “RemoveAt” with “1” argument(s): “Collection was of a fixed size.”
At line:1 char:1
+ $x.RemoveAt(0)
+ ~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : NotSupportedException
************************************************************************************************
Ага попробуем с такого примера: https://stackoverflow.com/questions/40274422/remove-a-row-from-a-powershell-array-collection-hashtable

Оказывается, массивы неизменянемы в PowerShell, и мы не можем удалять/добавлять к ним элементы. Но мы можем выбрать изтаких варинатов:

a) Создать новый массив, отфильтровав не нужные нам элементы (например применяя -ne)
$data = $data | ? {$_.Server -ne “Total”}

b) Выбрать всё до последнего элемента по индексу:
$data = $data[0..($data.Count-2)]

c) Преобразовать массив к [System.Collections.ArrayList], который изменяем, и удалить элементы из него:
$data = [System.Collections.ArrayList]$data
$data.RemoveAt($data.Count-1)

в нашем случае:
$x = [System.Collections.ArrayList]$x
$x.RemoveAt(1)
$x.GetType()
$x

LanguageTag : en-US
Autonym : English (United States)
EnglishName : English
LocalizedName : English (United States)
ScriptName : Latin script
InputMethodTips : {0409:00000409}
Spellchecking : True
Handwriting : False

************************************************************************************************
************************************************************************************************

You can easily change current input language via .NET class, like this:

Add-Type -AssemblyName ‘System.Windows.Forms’
[System.Windows.Forms.InputLanguage]::CurrentInputLanguage = [System.Windows.Forms.InputLanguage]::InstalledInputLanguages | ? { $_.Culture -eq ‘ru-RU’ }

************************************************************************************************

Инсталлируем и конфижим DKIM с Postfix на Debian/Ubuntu

Перевод с https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-dkim-with-postfix-on-debian-wheezy

Введение

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

  • Сервер явлется открытым почтовым релеем (open mail relay), позволяющим любому пересылть через него тонны писем
  • IP адрес сервера находится в черном списке (blacklisted)
  • Сервер не имеет Fully Qualified Domain Name (FQDN) и соотв. записи PTR
  • the Sender Policy Framework (SPF) DNS record отсуттствует или неверно сконфижен
  • the DomainKeys Identified Mail (DKIM) отсутствует ил опять же неверно настроен

Это основные требования, проверяемые многими спам-фильтрами (включая SpamAssasin).

Это руководство (tutorial) описывает инсталляцию и конфигурирование OpenDKIM: открытую имплементацию DKIM.

Важно: замените `example.com` на имя своего домена во всех примерах ниже. Команды выполняются от имени суперпользователя (su). При необохдимости используйте sudo, если предпочитаете не быть суперзверем на своём сервере. Также на системах Ubuntu вместо apt-get можно использовать apt с подобным синтаксисом. (Это была вставка от меня, Андрея Царя, простите за вольности).

Postfix и Dovecot должны быть уже установлены и сконфижены как следует (руководства (tutorial)), имя хоста и the FQDN заданы (tutorial, tutorial) и запись SPF на своём месте (tutorial).

О DKIM

DKIM – это интернет-стандарт, который позволяет частному лицу либо организации связать имя домена с email-сообщением.. То есть в какой-то мере это метод, подтверждающий достоверность и легальность отправляемого письма. В своей сути, DKIM основан на асимметричной криптографии. Mail Transfer Agent (MTA) отправителя подписывает каждое исходящее сообщение приватным ключом. Принимающая сторона получает публичный ключ из поля DNS и удостоверяется в том, что тело сообщения и некоторые заголовки не были изменены после подписывания письма.

Инсталлируем OpenDKIM

Перед началом инсталляции рекомендуется полный апгрейд системы:

apt-get update
apt-get upgrade

Инсталлируем OpenDKIM и его зависимости:

apt-get install opendkim opendkim-tools

Конфижим OpenDKIM

Теперь надо создать несколько файлов для конфигурироания OpenDKIM.

Итак, начнём с основного файла конфигурации:

vim /etc/opendkim.conf

Добавьте строки в конец conf-файла (каждый параметр будет объяснен позже). Также вы можете выбрать другой номер порта для опции Socket. Убедитесь, что порт не используется другим приложением. Также замечу, что ключевое слово milter обозначает mail filter, т.е. почтовый фильтр.

AutoRestart             Yes
AutoRestartRate         10/1h
UMask                   002
Syslog                  yes
SyslogSuccess           Yes
LogWhy                  Yes

Canonicalization        relaxed/simple

ExternalIgnoreList      refile:/etc/opendkim/TrustedHosts
InternalHosts           refile:/etc/opendkim/TrustedHosts
KeyTable                refile:/etc/opendkim/KeyTable
SigningTable            refile:/etc/opendkim/SigningTable

Mode                    sv
PidFile                 /var/run/opendkim/opendkim.pid
SignatureAlgorithm      rsa-sha256

UserID                  opendkim:opendkim

Socket                  inet:12301@localhost
  • AutoRestart: перезапуск фильтра при ошибке
  • AutoRestartRate: макс.рестарт рэйт, если будет превышен, фильтр остановится; 10/1h – 10 рестартов в час позволено
  • UMask: полный доступ группе с ID = UserID и позволяет другим читать и запускать файлы, в данном случае позволна модификация файла Pid.
  • Syslog, SyslogSuccess, *LogWhy: включают детальный логинг для syslog
  • Canonicalization: определяют методы канонизации, используемые при подписи писем simple метод практически не позволяет модификации, тогда как relaxed допускает минимальные изменения, такие как замена whitespace; relaxed/simple – заголовок письма будет обрабатываться алгоритмом relaxed, а тело письма – simple алгоритмом
  • ExternalIgnoreList: определяет внешние хосты, которые могут слать почту ч/з сервер как один из подписанный оменов без проверки
  • InternalHosts: определяет список внутренних хостов, чью почту не проверяем, но подписываем
  • KeyTable: карта имен ключей для ключей подписи
  • SigningTable: списки применяемых к письмам подписей основанных на адресе, найденном в поле From: заголовка
  • Mode: описывает режимы; в нашем случае milter действует как подписчик (signer) (s) и контроллер (verifier) (v)
  • PidFile: путь к Pid-файлу который содержит ид процесса
  • SignatureAlgorithm: выбирает алгоритм подписывания писем
  • UserID: opendkim процесс выполнятеся от имени данного юзера и группы
  • Socket: milter будет слушать на сокете, определённом здесь, Posfix будет слать письма на проверку и подпись к opendkim ч/з этот сокет; 12301@localhost определяет TCP сокет, слушающий на localhost, порт 12301. Если порт 12301 занят, можно использовать любой другой свободный порт

Эта простая конфигурация позволяет подписывать сообщения для одного или более доменов, для ознакомления с другими опциями посмотрите здесь.

Соединяем milter с Postfix:

vim /etc/default/opendkim

Добавляем следующую строку, номер порта используем из опции Socket выше:

SOCKET="inet:12301@localhost"

Просим Postfix использовать наш milter:

vim /etc/postfix/main.cf

Убедимся что следующие две строчки присутствуют в файле и не закомментированы:

milter_protocol = 2
milter_default_action = accept

Вполне возможно что фильтры (SpamAssasin, Clamav etc.) уже используются Postfix; если да, до добаляем наш milter через запятую, вот так (не забываем про номер порта как в opendkim.conf):

smtpd_milters = unix:/spamass/spamass.sock, inet:localhost:12301
non_smtpd_milters = unix:/spamass/spamass.sock, inet:localhost:12301

Если же данных параметров нет, просто добавляем следующие две строчки в файл:

smtpd_milters = inet:localhost:12301
non_smtpd_milters = inet:localhost:12301

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

mkdir -p /etc/opendkim/keys

Определяем доверенные хосты:

vim /etc/opendkim/TrustedHosts

Будем использовать этот файл для определения ExternalIgnoreList и InternalHosts, сообщения с этих хостов, доменов и IP-адресов являются доверенными и будут подписаны.

Т.к. наша основная конфигурация объявила TrustedHosts как файл регулярных выражений (refile), мы можем использовать wildcard’ы, т.е. *.example.com означает, что сообщения с поддоменов example.com войдут также в число доверенных, как и сообщения с самого домена example.com.

Добавьте следующие строки в новый файл. Множество доменов может быть добавлено здесь:

127.0.0.1
localhost
192.168.0.1/24

*.example.com

#*.example.net
#*.example.org

Создаём таблицу ключей:

vim /etc/opendkim/KeyTable

Таблица ключей содержит каждую пару селектор/домен и путь к их приватным ключам. Любая строка из латинских буквa и цифр может быть селектором, в нашем примере мы используем mail.

mail._domainkey.example.com example.com:mail:/etc/opendkim/keys/example.com/mail.private

#mail._domainkey.example.net example.net:mail:/etc/opendkim/keys/example.net/mail.private
#mail._domainkey.example.org example.org:mail:/etc/opendkim/keys/example.org/mail.private

Создём таблицу подписи:

vim /etc/opendkim/SigningTable

Этот файл используется для объявления адресов домен/email и их селекторов.

*@example.com mail._domainkey.example.com

#*@example.net mail._domainkey.example.net
#*@example.org mail._domainkey.example.org

Генерируем public и private ключи

Перейдём в каталог с ключами:

cd /etc/opendkim/keys

Создаём отдельную папку для каждого домена, где будут храниться ключи:

mkdir example.com
cd example.com

Генерируем ключи:

opendkim-genkey -s mail -d example.com

-s определяет селектор, а -d определяет домен, эта команда создаст два файла:mail.private это наш private ключ, а mail.txt содержит public ключ.

Поменяем владельца private ключа на opendkim:

chown opendkim:opendkim mail.private

Добавим public ключ к DNS записям домена

Откроем mail.txt:

vim mail.txt

public ключ определён под параметром p. Пример:

mail._domainkey IN      TXT     ( "v=DKIM1; k=rsa; "
          "p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC5N3lnvvrYgPCRSoqn+awTpE+iGYcKBPpo8HHbcFfCIIV10Hwo4PhCoGZSaKVHOjDm4yefKXhQjM7iKzEPuBatE7O47hAx1CJpNuIdLxhILSbEmbMxJrJAG0HZVn8z6EAoOHZNaPHmK2h4UUrjOG8zA5BHfzJf7tGwI+K619fFUwIDAQAB" )  ; ----- DKIM key mail for example.com

Скопируйте этот ключ и добавьте запись TXT для своего домена в DNS:

Имя: mail._domainkey.example.com.

Text: "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC5N3lnvvrYgPCRSoqn+awTpE+iGYcKBPpo8HHbcFfCIIV10Hwo4PhCoGZSaKVHOjDm4yefKXhQjM7iKzEPuBatE7O47hAx1CJpNuIdLxhILSbEmbMxJrJAG0HZVn8z6EAoOHZNaPHmK2h4UUrjOG8zA5BHfzJf7tGwI+K619fFUwIDAQAB"

Измения в DNS могут занять какое-то время до вступления в силу.

Перезапуск Postfix и OpenDKIM:

service postfix restart
service opendkim restart

Мои поздравления! Мы успешно настроили DKIM для нашего почтового сервера!

Конфигурация может быть протестирована отправкой пустого email’а на check-auth@verifier.port25.com. Если всё работает как должно, мы должны будем получить письмо, где среди прочего должна присутствовать строка DKIM check: pass под заголовком Summary of Results.

==========================================================
Summary of Results
==========================================================
SPF check:          pass
DomainKeys check:   neutral
DKIM check:         pass
Sender-ID check:    pass
SpamAssassin check: ham

Также можно послать письмо на наш адрес в Gmail и посмотреть исходники полученного письма, там должна присутствовать строка dkim=pass под заголовком Authentication-Results.

Authentication-Results: mx.google.com;
       spf=pass (google.com: domain of contact@example.com designates --- as permitted sender) smtp.mail=contact@example.com;
       dkim=pass header.i=@example.com;
Создано: П. Себастьян (P. Sebastian)
Перевод: А. Царь (beotiger)

nginx+php-fpm под Windows

Здравствуйте!

nginx

Apache – король веб-серверов, если можно так сказать. Но на пятки ему наступает даже не IIS от Microsoft, не lighttpd, а nginx (произносится как Энджин-Икс, engine с английского мотор, двигатель) нашего соотечественника Сысоева.

Чем он хорош? Говорят, что статика отдаётся гораздо быстрее, чем у Апача, да и динамика я думаю тоже. Он жрёт меньше ресурсов, что может быть критически важно для нагруженных серверов. Раньше мнгоие применял связку nginx+Apache – nginx для отдачи статики (рисунков, js/css etc.), а Апач – для отдачи динамики (PHP/Perl/Python/Ruby etc.). Но теперь nginx можно применять без Апача, так как для него появилось куча плагинов и дополнений, поэтому вместо связки nginx+Apache+PHP (мы тут говорим о PHP-среде) легко настроить просто nginx+php-fpm. Ладно, об нём написано куча литературы, не буду повторяться, опишу лишь процесс установки nginx+php-fpm под Виндовс (Windows).

Хотя, конечно, nginx органичней всего чувствует себя в FreeBSD и Linux (любой Unix-среде, наверное), под Винду он тоже неплохо работает, по крайней мере я его у себя на домашнем компе установил, чтобы тестировать некоторые штуки.

Итак, процесс установки/первичной настройки. Этот процесс расписан здесь: http://nginx.org/ru/docs/windows.html
я приведу лишь выжимку.

Смотрим доступные версии nginx под windows здесь: http://nginx.org/en/download.html
Сейчас есть версия 1.8.0, несколько месяцев назад я устанавливал 1.6.2, которая и сейчас у меня работает.
Итак, скачиваем текущую версию под windows: http://nginx.org/download/nginx-1.8.0.zip

Для удобства примем то, что я пользую сейчас:
Создаём папку C:\usr. Заходим в неё и распаковываем nginx-1.8.0.zip здесь (это можно проделать через GUI-интерфэйс).
Затем запускам териминал и заходим:

> C:
> cd C:\usr\nginx-1.8.0
> start nginx

Тут Виньда может выкинуть окошко с предупреждением (см. скриншот), что nginx пытается получить доступ в сеть. Мы конечно же разрешаем.

allow nginx to network

Проверяем, запущен ли nginx и видим результат:

>tasklist /fi "imagename eq nginx.exe"
 
Image Name                     PID Session Name        Session#    Mem Usage
========================= ======== ================ =========== ============
nginx.exe                     1336 Console                    1      6,440 K
nginx.exe                     3136 Console                    1      6,268 K
nginx.exe                     4864 Console                    1      6,496 K
nginx.exe                     6544 Console                    1      5,872 K

Остановим nginx нормально: nginx -s quit. Есть ещё несколько полезных команд для nginx:
nginx -s stop – останов nginx в любом случае (применяется, если nginx -s quit не сработает).
nginx -s reload – перезагрузка .conf файлов (конфигурации)
nginx -s reopen – переоткрытие .log файлов (полезна, если мы удалили или переместили логи при работающем nginx).

Итак, мы остановили nginx сейчас, так как прежде чем его запускать, надо правильно настроить .conf файлы. Они расположены в папке conf. Стандартный файл настройки – nginx.conf, из него директивой include могут подсоединяться другие файлы из этой (впрочем, и из любой другой) папки.
Например, директива include mime.types; в секции http присоединит файл mime.types, в котором находится определения всех стандартных MIME-типов. Впрочем, сам конфиг я обсуждать здесь не буду, о нем много написано в инете, приведу лишь пример своего конфига с краткими пояснениями.

Предупреждение: это конфиг для моей домашней тестовой среды. Для рабочего сервера требуется более тонкая настройка.

worker_processes  1;

error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;
    
    #
    # Формат лога делаем как у Апача
    #
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  logs/access.log  main;

    # sendfile        on;
    #tcp_nopush     on;
  
    keepalive_timeout  65;

    # Сжатие gzip на лету
    gzip  on;

    server {
        # listen       801;
        server_name  localhost;
				autoindex on; # allow dir listing
				root E:/sites;
				
        #charset koi8-r;
        #access_log  logs/host.access.log  main;

	#
        # запретим доступ ко всем файлам, начинающимся с точки 
	#
        location ~ /\. {
            deny  all;
        }

        location / {
            root   E:/sites;
            index  index.html index.htm index.php;
        }

        #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;
        }

	#
        # передаем все PHP скрипты серверу FastCGI, слушающему на 127.0.0.1:9123
        #
        location ~ \.php$ {
            root           E:/sites;
            fastcgi_pass   127.0.0.1:9123;
            fastcgi_index  index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }
    }
}

Итак, в этом конфиге большинство настроек оставлено по умолчанию, а корень сайтов у нас в E:\sites, что в первую очередь делает команда root E:/sites. Обратите внимание на прямые слэши в стиле Unix в пути к папкам и файлам – это требование nginx, даже для Windows-версии.

Теперь можно запускать nginx (start nginx), если мы его останавливали перед этим, либо применить команду nginx -s reload, чтобы сервер перечитал конфиги без остановки своей работы, что полезно при работающем внешнем сайте.

Итак, теперь надо настроить PHP-FPM для Windows. Учтите, что мы уже в нашем конфиге сделали его поддержку на порту 9123 (под-секция location ~ \.php$)

PHP-FPM для Windows

1. Скачиваем свежий (или версию по выбору) .zip-архивчик с http://windows.php.net/download/. Архивчик должен быть VC11/VC9, что содержит в себе FastCGI-файл (phpcgi.exe).
2. Создаем папку в C:\usr, например с именем php-5.6.9 и распаковываем в неё содержимое архива.
3. Редактируем файл php.ini в соотв. со своими предпочтениями, единственное, убедиться, что у нас есть такая строка:

# nginx security setting
cgi.fix_pathinfo=0

Она закрывает одну из старых уязвимостей nginx. Далее можно подключить PHP-модули по вкусу, расскоментировав их в соотв. секции и произвести другие настройки.

4. Теперь создадим .bat-файл, например php-fpm-start.bat с таким содержимым:

@echo off
echo Starting PHP FastCGI...
set path=c:\usr\php-5.6.9;%PATH%
C:\usr\php-5.6.9\php-cgi.exe -b 127.0.0.1:9123 -c C:\usr\php-5.6.9\php.ini

и запустим его. Если мы его запускаем из GUI, то появится окно консоли и останется открытым, придётся с этим смириться.

Всё, наш сервер мы уже давно настроили на соединение с этим PHP процессом.

Для проверки создаём файл index.php в папке E:\sites с таким содержимым:

<?php
phpinfo();

Теперь направляем наш любимый браузер на http://localhost и видим такую примерно картину:

phpinfo() начало

phpinfo

phpinfo() с версией nginx

phpinfo nginx

Здесь же можно посмортеь переменные среды и подключаемые модули. Для совместимости nginx создет переменные среды, совместимые с апачевскими, например _SERVER[“SERVER_NAME”], _SERVER[“DOCUMENT_ROOT”], _SERVER[“REQUEST_URI”], _SERVER[“SCRIPT_NAME”] и т.д., и мы можем использовать их в своих PHP-сценариях, как делали это в случае с Апачем.

До свидания!