NGINX ограничения и лимиты

Thank you for reading this post, don't forget to subscribe!

Доступ с определенных IP-адресов

Дан­ная воз­мож­ность обес­пе­чи­ва­ет­ся моду­лем ngx_http_access_module. Как пра­ви­ло, он вхо­дит в стан­дарт­ную установку.

В общем кон­фи­гу­ра­ци­он­ном фай­ле nginx или настрой­ке вир­ту­аль­но­го домена:

location / {
deny  192.168.0.15;
allow 192.168.0.0/24;
allow 2001:0ab3::/32;
deny all;
}

* в дан­ном при­ме­ре мы раз­ре­ша­ем доступ для всех ком­пью­те­ров сети 192.168.0.0/24 (за исклю­че­ни­ем 192.168.0.15) и ком­пью­те­ру с адре­сом ipv6 2001:0ab3::. Осталь­ным доступ запрещен. 

После пере­за­пус­ка­ем NGINX одной из команд:

systemctl reload nginx

service nginx reload

Ограничение доступа к определенной папке

Сто­ит отме­тить, что бло­ки­ро­вать доступ по IP-адре­су мож­но не толь­ко ко все­му сай­ту, но и к опре­де­лен­ным дирек­то­ри­ям, например:

location /install {
allow 192.168.0.15;
deny all;
}

* в дан­ном при­ме­ре мы запре­ща­ем доступ к пап­ке install, но раз­ре­ша­ем устрой­ству 192.168.0.15.

Разрешить только локальные запросы

Самый пра­виль­ный спо­соб, настро­ить, что­бы NGINX слу­шал толь­ко на локаль­ном адре­са, напри­мер, listen 127.0.0.1:80;

Но если такой метод, по каким-либо при­чи­нам нам не под­хо­дит, дела­ем так:

location / {
allow 127.0.0.1;
deny all;
}

Действие с IP по условию

В зави­си­мо­сти от опре­де­лен­но­го IP-адре­са NGINX может выпол­нять раз­лич­ные дей­ствия, а не толь­ко запрет досту­па. Напри­мер, перенаправление:

location / {

if ($remote_addr != 127.0.0.1) {
return 301 https://$host$request_uri;
}

}

* в дан­ном при­ме­ре мы пере­на­прав­ля­ем всех посе­ти­те­лей по пути https://$host$request_uri, кро­ме запро­сов с IP-адре­са 127.0.0.1.

Доступ по паролю

В кон­фи­гу­ра­ци­он­ном файле:

server {
.…
auth_basic "HTTP Basic Authentication";
auth_basic_user_file htpasswd;
.…
}

* где auth_basic ука­зы­ва­ет веб-сер­ве­ру исполь­зо­вать обыч­ную аутен­ти­фи­ка­цию по логи­ну и паро­лю; auth_basic_user_file зада­ет путь хра­не­ния фай­ла с паро­ля­ми отно­си­тель­но пап­ки nginx.

 

Гене­ри­ру­ем хеш для пароля:

openssl passwd

* после вво­да Enter необ­хо­ди­мо два­жды вве­сти жела­е­мый пароль — на экран будет выве­ден хэш, кото­рый необ­хо­ди­мо ско­пи­ро­вать в буфер обмена.

 

Созда­ем файл с поль­зо­ва­те­ля­ми и паролями:

vi /etc/nginx/htpasswd

test:dzeEYeVIDk38.

* где test — логин; dzeEYeVIDk38. — резуль­тат коман­ды openssl passwd.
* Для созда­ния связ­ки логи­на паро­ля так­же мож­но вос­поль­зо­вать­ся online гене­ра­то­ра­ми, напри­мер, на htaccesstools.com.

После пере­за­пус­ка­ем NGINX одной из команд:

systemctl reload nginx || service nginx reload

Лимит скорости

location / {
limit_rate 1000k;
}

* в дан­ном при­ме­ре мы огр­ра­ни­чи­ли про­пуск­ную спо­соб­ность кана­ла до, при­мер­но, 10 мбит.

location / {
limit_rate_after 10m;
limit_rate 1000k;
}

* так­же огра­ни­чи­ва­ем ско­рость до 10 мбит, но после пер­вых 10 Мб загрузки.

Ограничение количества запросов с одного ip

http {
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn_zone $server_name zone=perserver:10m;
limit_req_zone $binary_remote_addr zone=dynamic:10m rate=5r/s;

server {

location / {
limit_conn perip 10;
limit_conn perserver 100;
}
}
}

* в дан­ном при­ме­ре мы созда­ем 3 зоны, раз­мер каж­дой зоны — 10Мб; на один IP раз­ре­ше­но 10 под­клю­че­ний, но не боль­ше 5 в секун­ду (rate=5r/s); общее чис­ло раз­ре­шен­ных соеди­не­ний с сер­ве­ром — 100.