간혹 사이트가 죽는 경우가 있는데 확인해보면 봇 크롤링 로그가 찍히고 nginx access.log 를 확인하면 대한민국이 아닌 이탈리아, 아프리카, 홍콩 등 타지에서 봇이 접속한 경우가 발생
그래서 Nginx로 봇 접속을 차단하려고 설정을 찾음.
우선은 아래 세 가지를 서버 conf 에 추가하니 서버가 죽는 현상은 확연히 줄음.
# 1 *특정 봇 막기
map $http_user_agent $limit_bots {
default 0;
~*(bingbot|FeedDemon|GrapeshotCrawler|DuckDuckBot|MegaIndex) 1;
~*(VelenPublicWebCrawler|SimplePie|YandexBot|SCMGUARD|DotBot) 1;
~*(AhrefsBot|SemrushBot) 1;
}
# 2 *IP 하나로 서비스 연결 갯수 제한
limit_conn_zone $binary_remote_addr zone=conn_limit_per_ip:10m;
# 3 *하나의 세션으로 요청할 수 있는 갯수 제한.
limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=5r/s;
server{
# 2
limit_conn conn_limit_per_ip 15;
location /login/ {
# 2
limit_req zone=req_limit_per_ip;
}
location / {
root /사이트 경로;
# 1 봇 차단 조건
if ($limit_bots = 1) {
return 403;
}
# 3
limit_req zone=req_limit_per_ip burst=10 nodelay;
}
limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=5r/s;
limit_req zone=req_limit_per_ip burst=10 nodelay;
limit_conn_zone $binary_remote_addr zone=conn_limit_per_ip:10m;
위와 같은 설정을 한 이후로 서버가 죽는 현상은 없었다. 좀 더 지켜봐야 되지만 안전장치는 해둔 것으로 사료된다.
추가적으로 header, body에 대한 타임아웃, body maxsize , conn. timeout 등도 설정을 했다.
https://www.nginx.com/blog/rate-limiting-nginx/
https://serverfault.com/questions/660243/nginx-how-to-set-limit-conn-and-limit-req