Но погодите, limit_req это именно «лимит», т.е. число после которого серверу станет плохо, а не среднее количество запросов которое реально приходит.
Так что если вы знаете что на 800 сервер начинает троттлить, то надо поставить 750 лимита и сколько-то (допустим 50) бурста что бы несколько одновременных запросов не ломались.
Ну вот тут опять вопрос что понимается под «600 r/s»
Что я в него одномоментно зашлю 600 запросов, а потом через секунду ещё 600.
Или что я более-менее равномерно в течении секунды буду засылать 600 запросов (примерно по запросу каждые 1.6ms).
> обычно в базе хранится строка регистронезависимо
Это где такое «обычно»?
Ну и вообще, в чём задача этих коротких ссылок? Например если люди должны их перепечатывать руками с рекламы в 5 метрах или (не дай бог) озвучивать по телефону, то лучше использовать только маленькие буквы, да ещё и выкинуть слишком похожие.
Собственно тут классическая ошибка, что человек считает 1000rps как именно 1000 и именно в секунду, а на самом деле nginx оперирует интервалами и токенами. так что 1000rps нужно читать как «не чаще 1 запроса в 0.001 сек».
Что бы было понятнее разница в понимании, можно сказать что для человека «1 запрос в секунду» и «60 запросов в минуту» воспринимаются по разному, а для nginx это одно и то же. Т. к. человек (без специальных знаний) вторую запись воспринимает как «я могу послать все 60 запросов на 59 секунде минуты», а через три секунды послать ещё 60 запросов.
Насколько я помню в TCP прежде чем пойдут данные клиент и сервер должны обменяться пакетами SYN, SYN-ACK, ACK. Так что так просто подделать запрос не выйдет, потому что SYN-ACK уйдёт на поддельный адрес и соединение не установится.
Так что если вы знаете что на 800 сервер начинает троттлить, то надо поставить 750 лимита и сколько-то (допустим 50) бурста что бы несколько одновременных запросов не ломались.