sithmein
(Thorsten Meinl)
7월 22, 2022, 1:39오후
1
Docker 컨테이너에서 Discourse를 사용하고 있습니다. 허용 목록에 추가된 IP로 속도 제한(rate limit)을 설정해 두었음에도, 해당 IP에서 요청을 보낼 때 여전히 속도 제한 오류가 발생합니다. nginx 설정이 정확하다고 확신하는데, 설정은 다음과 같습니다:
geo $limit {
default 1;
1.1.1.1 0; # 실제 IP는 아닙니다
}
map $limit $limit_key {
0 "";
1 $binary_remote_addr;
}
limit_req_zone $limit_key zone=flood:10m rate=12r/s;
limit_req_zone $limit_key zone=bot:10m rate=200r/m;
limit_req_status 429;
limit_conn_zone $limit_key zone=connperip:10m;
limit_conn_status 429;
...
location @discourse {
limit_conn connperip 20;
limit_req zone=flood burst=12 nodelay;
limit_req zone=bot burst=100 nodelay;
...
}
nginx는 속도 제한에 도달한 경우 오류를 로그로 기록하도록 설정되어 있으며, 실제로 일부 로그 메시지는 확인됩니다. 하지만 허용 목록에 포함된 IP에서는 그런 로그가 나오지 않습니다. 그럼에도 허용 목록에 포함된 IP에서 요청을 보낼 때 429 응답이 대량으로 반환됩니다. 요청된 URL은 사용자 프로필(예: /users/foo.json)입니다. Discourse 자체에 어떤 종류의 속도 제한이 있는 건가요?
MrBuBBLs
(Philippe Boblet)
9월 12, 2022, 9:28오전
2
안녕하세요, 말씀하신 대로 Nginx가 실제로 속도 제한을 관리하고 있지만, Discourse도 애플리케이션 레벨에서 속도 제한을 관리하는 자체적인 방식을 갖추고 있습니다. Sam이 이 주제에 대해 흥미로운 글을 하나 썼습니다:
Discourse ships with 3 different global rate limits that can be configured by site admins.
Global per-ip rate limits
These limits apply to every unique IP address that hits the Discourse application. (files that are served directly from the filesystem or the CDN are excluded)
By default this rate limit is enabled, you may disable it or set it to a reporting mode.
DISCOURSE_MAX_REQS_PER_IP_MODE : default block, this rate limit applies out of the box. (other options are warn, warn+block, and n…
제가 궁금한 것은 실제로 예외를 설정하여 속도 제한을 적용할 수 있는지 여부입니다(즉, 해당 규칙을 통해 IP를 화이트리스트에 추가하는 것). 이 방법을 아직 찾고 있는 중입니다…
MrBuBBLs
(Philippe Boblet)
9월 12, 2022, 9:35오전
3
음, 뭔가 알아낸 것 같아
아마 DISCOURSE_MAX_REQS_PER_IP_EXCEPTIONS가 우리가 필요로 하던 바로 그 것일지도 몰라
저도 분당 60회라는 API 호출 속도 제한에 부딪히고 있는데, 어떻게 해결해야 할지 모르겠습니다. 다음 설정들을 모두 적용해 두었습니다:
- DISCOURSE_MAX_REQS_PER_IP_MODE=none
- DISCOURSE_MAX_USER_API_REQS_PER_MINUTE=20000
- DISCOURSE_MAX_USER_API_REQS_PER_DAY=30000
- DISCOURSE_MAX_ADMIN_API_REQS_PER_MINUTE=20000
- DISCOURSE_MAX_REQS_PER_IP_PER_MINUTE=20000
- DISCOURSE_MAX_REQS_PER_IP_PER_10_SECONDS=2000
- DISCOURSE_MAX_ASSET_REQS_PER_IP_PER_10_SECONDS=2000
- DISCOURSE_SKIP_PER_IP_RATE_LIMIT_TRUST_LEVEL=0
- DISCOURSE_MAX_ADMIN_API_REQS_PER_KEY_PER_MINUTE=20000
- DISCOURSE_MESSAGE_BUS_MAX_BACKLOG_SIZE=1000
- DISCOURSE_MAX_REQS_PER_IP_EXCEPTIONS=....
nginx 때문은 아니라는 것을 알고 있습니다. "너무 많은 횟수로 이 작업을 수행했습니다"라는 메시지가 표시되기 때문인데, 이는 Discourse RateLimiter가 이를 처리하고 있음을 의미합니다.
해결책을 찾으신 분 있으신가요?