Тема: Nginx как фильтр перед Apache без переконфигурирования Apache
Задача - сбросить DDoS типа "Slow Loris" http://en.wikipedia.org/wiki/Slowloris не и другие приятный мелочи можно использовать.
1. Инсталлируем и конфигурируем Nginx
# cat /etc/nginx/nginx.conf
user nginx;
worker_processes 2;
# устанавливаем ulimit в большое значение, актуально большим проектам
worker_rlimit_nofile 20480;
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;
events {
#
worker_connections 10240;
}
http {
include /etc/nginx/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"';
log_format upstream '$remote_addr - - [$time_local] "$request" $status '
'upstream $upstream_response_time request $request_time '
'[for $host ($scheme) via $upstream_addr] [mime: $sent_http_content_type] "$http_x_forwarded_for"';
# Надо включать по потребностям
#access_log /var/log/nginx/access.log upstream;
# буффер нам ненужен
proxy_buffering off;
# передаем информацию о headre'ах apache
proxy_set_header Host $http_host;
# устанавливаем для apache с mod_extract_forwarded возможность узнать настоящий REMOTE_ADDR и т.д.
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# таймаут, apache около 300 сек
proxy_read_timeout 600;
# по возможности используемым память
proxy_temp_path /dev/shm;
# для закачивания файлов до 100 мб
client_max_body_size 100m;
client_body_buffer_size 128k;
# по возможности используемым память
client_body_temp_path /dev/shm;
proxy_buffers 8 16k;
proxy_buffer_size 32k;
sendfile on;
keepalive_timeout 65;
server {
listen 111.111.111.111:81;
server_name _;
location / { proxy_pass http://111.111.111.111:80; }
# Это дает возможность показывать нормальное сообщение когда apache недоступен или что-то блокируется
error_page 502 /apache_down.html;
location = /apache_down.html { root /usr/share/nginx/html; }
error_page 403 /forbidden.html;
location = /forbidden.html { root /usr/share/nginx/html; }
}
}
2. В apache устанавливаем mod_extract_forwarded и настраиваем его, по сути меняем тольео одну строчку
- MEFaccept 1.2.3.4 1.2.3.5
+ MEFaccept 127.0.0.1 111.111.111.111
3. Проверяем, путем захода на http://mydomain.tls:81/blablabla если все работает то перекидываем запросы идущие на 80 порт на 81
iptables -t nat -A PREROUTING -d 111.111.111.111 -i eth0 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 81