Защищаем wordpress-хостинг от перегрузки POST запросами

Прежде всего создадим две зоны для подсчета запросов. Одну — с учетом запросов по IP, а вторую — общую:

 

limit_conn_zone $binary_remote_addr zone=perip:10m;

limit_conn_zone $server_name zone=perserver:10m;
Теперь нужно научить nginx устанавливать лимиты на POST запросы. Напрямую в блоке if {} этого сделать нельзя, по этому применяем трюк с внуренней локацией:

error_page 418 = @postlimit;



if ($request_method = POST)

    {

    return 418;

}



                location @postlimit {

limit_conn perip 1;

limit_conn perserver 8;

                        proxy_pass http://backend;

                        proxy_redirect http://backend/ /;

                        proxy_set_header Host $host;

                        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

                        proxy_set_header X-Real-IP $remote_addr;

                }
Ограничение по максимальному числу одновременных запросов на сервер нужно выставлять равным числу ядер CPU, посмотреть можно командой:

 

 

grep processor /proc/cpuinfo |wc
Первая цифра — это то самое заветное число.