Available settings for global rate limits and throttling

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 none)

DISCOURSE_MAX_REQS_PER_IP_PER_MINUTE: number of requests per IP per minute (default is 200)

DISCOURSE_MAX_REQS_PER_IP_PER_10_SECONDS: number of requests per IP per 10 seconds (default is 50)

DISCOURSE_MAX_ASSET_REQS_PER_IP_PER_10_SECONDS: number of asset (avatars/css) requests per IP per 10 seconds (default is 200)

DISCOURSE_MAX_REQS_RATE_LIMIT_ON_PRIVATE: should the rate limit apply to private IPs accessing Discourse? default is false.

DISCOURSE_SKIP_PER_IP_RATE_LIMIT_TRUST_LEVEL: use per user rate limits vs IP rate limits for users with this trust level or more (default 1)

User API rate limits

The mobile applications acquire a user API key per device to access Discourse on behalf of a user (using an open protocol). These API keys are very tightly limited.

DISCOURSE_MAX_USER_API_REQS_PER_MINUTE: default 20
DISCOURSE_MAX_USER_API_REQS_PER_DAY: default 2880

Admin API rate limits

The administrative API keys can be generated via the yoursite.com/admin/api/keys page. These keys can operate on behalf of users, but require administrative privileges to generate. There is a limit of 60 requests per minute, shared between all keys.

Self-hosted users can change this in their app.yml file. Hosted customers will need to contact their hosting provider.

DISCOURSE_MAX_ADMIN_API_REQS_PER_MINUTE : 60

Data Explorer Plugin API rate limits

DISCOURSE_MAX_DATA_EXPLORER_API_REQ_MODE: default warn , this rate limit applies out of the box. (other options are block , warn+block , and none )

DISCOURSE_MAX_DATA_EXPLORER_API_REQS_PER_10_SECONDS: 2

Note: The requests made via the Data Explorer UI do not count towards the rate limit.

What should I do if I hit a rate limit and get throttled?

If you are consuming the API programmatically and receive back a 429 status code throttle reply you should respect it and slow down.

As an end user you should not really experience rate limits if you do, slow down. You could trigger it by opening 50 tabs real quick or doing something like that.

Firewall and proxy warning! :warning:

If you are running a reverse proxy which is mis-configured Discourse may think all the requests are coming from a single IP address, it is very likely you will hit rate limits early. Be sure to configure your reverse proxy to forward the IP correctly.

How do I amend these limits?

To amend the limits add the desired change into your app.yml file in the env section.

:discourse: If you are hosted by Discourse, and on an Enterprise plan, contact team@discourse.org it you need to adjust any of these limits.

Global Rate Limits are not adjustable on starter, pro, or business plans.

Last edited by @MarkDoerr 2025-07-21T23:14:15Z

Last checked by @MarkDoerr 2025-07-21T23:14:23Z

Check documentPerform check on document:
60 curtidas

Parece-me que, se você tiver o web.ratelimited.template.yml instalado, então estes não importam, pois as coisas são limitadas por taxa pelo NGINX antes de chegarem ao Discourse, certo?

É assim que parece nos meus logs do nginx.

Minha solução de curto prazo é adicionar meu endereço IP à lista de IPs locais, para que ele passe pelo NGINX. Acho que o que deve ser feito é remover o template de limite de taxa para que estes tenham algum significado?

2 curtidas

Aviso de firewall e proxy! :warning:

Se você estiver executando um proxy reverso mal configurado, o Discourse pode pensar que todas as solicitações estão vindo de um único endereço IP, é muito provável que você atinja os limites de taxa mais cedo. Certifique-se de configurar seu proxy reverso para encaminhar o IP corretamente.

Em nossa configuração, nós tunelamos todas as chamadas de API através de um proxy. Este proxy lida com autenticação e muitas outras coisas antes de, às vezes, consultar o Discourse.

Qual é a maneira recomendada (cabeçalho específico?) de encaminhar o endereço IP do solicitante original?

Relacionado

1 curtida

Alguém poderia me ajudar a entender essa configuração, por favor?

Estou pensando corretamente que isso já está definido como 1 e que os limites de taxa já estão definidos por usuário em vez de por endereço IP (se o usuário for TL1 ou superior)?

1 curtida

na verdade, ele não existia para me fazer especificar uma ou mais dessas configurações.

meu script sempre respeitou o cabeçalho Retry-After, como podemos ver na linha original 101;

retry_after = r.headers.get("Retry-After")

no entanto, este cabeçalho estava se tornando desnecessariamente grande, pois agendo várias unidades de serviço para este mesmo script rodar em horários diferentes durante o dia.

Portanto, múltiplos de algumas dessas configurações da entrega de e-mail aprimorada padrão via mail-receiver, que continua importante.