1. Усиливаем TCP стек:
#cat /etc/sysctl.conf

net.ipv4.tcp_syncookies=1
net.ipv4.tcp_tw_recycle=1
net.ipv4.tcp_tw_reuse=1
net.ipv4.tcp_keepalive_time=10
net.ipv4.tcp_fin_timeout=5

Не всегда и не все параметры доступны к изменению "на лету" без перезагрузки системы.


2. Ставим свежую версию nginx для своей операционной системы:
http://wiki.nginx.org/Install
http://nginx.org/ru/download.html


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

Редактируем (создаем) файл: /etc/fail2ban/action.d/route.conf

# Fail2Ban configuration file
[Definition]
actionban = ip route add unreachable <ip>
actionunban = ip route del unreachable <ip>


Редактируем файл: /etc/fail2ban/jail.conf

Меняем параметр ban action = ... в секции [DEFAULT]

#banaction = iptables
banaction = route

Создаем файл для разбора логов nginx: /etc/fail2ban/filter.d/nginx.local

Примеры написания регекспов есть в самом пакете fail2ban. При необходимости использования нескольких разных правил надо помнить, что равила разбора лога (failregex) имеют один заголовок, 
но начинаются каждое с новой строчки, задача - выделить из лога IP адрес хоста (переменная <HOST> большими буквами!) для последующей блокировки средствами banaction, т.е. эта переменная 
обязательно должна присутствовать в строке.

# Auth filter /etc/fail2ban/filter.d/nginx.conf: 
# Blocks IPs that fail to authenticate using basic authentication 
[Definition]
failregex = no user/password was provided for basic authentication.*client: <HOST>
            user .* was not found in.*client: < HOST >
            user .* password mismatch.*client: < HOST >
ignoreregex = 

Редактируем (добавляем секцию) в файл: jail.local

[nginx]
enabled = true
filter = nginx
action = route
# sendmail[name=nginx]
logpath = /var/log/nginx/*error*.log
bantime = 3600 # 1 hour
maxretry = 7

После сохранения файлов перезапускаем fail2ban командой fail2ban-client reload, если есть
какие-то ошибки - они будут сразу видны, в отличие от способа (пере)запуска через /etc/init.d/fail2ban

Проверить, что наша секция подхватилась можно командой: fail2ban-client status

Status
|- Number of jail:	2
`- Jail list:		nginx, ssh

fail2ban-client имеет достаточно широкий диапазон команд для управления и изменения параметров
без перезапуска демона (и обнуления его счетчиков).