chaturanga

Рейтинг
122
Регистрация
22.08.2012
master32 #:
имеется в виду, что в данном примере не имеет смысла отдавать 503, потому что return самая быстрая операция, из рам в сокет, и лимитирование не имеет смысла, поэтому и отдается всегда 200
чтоб отдать именно 503 надо переделать логику, добавить проксирование или файл

пример с return - это очень упрощённая ситуация, в реальности мы же работаем не с просто return 200 "bu", а делаем append модуля (например для прямых запросов к БД), который работает минуя http фазу, где после append() вся обработка уходит в nginx event loop, что очень дёшево. Но здесь, если мы хотим всё-же иметь возможность делать limit_req, нам придётся пожертвовать дешевизной и делать append() аж в CONTENT_PHASE, что может свести на ноль саму идею прямых запросов.

master32 #:
стоимость отдачи 503 или 200 в данном случает одинаковая

разумеется разная - 200-й ответ мы можем отдать ещё в REWRITE_PHASE, а для отдачи 503 нам придётся подняться аж до PRECONTENT_PHASE, чтобы обработать директиву error_page 404 = @named_loc, опуститься обратно ,запустить счётчик limit_req и пока он не достигнет превышения мы будем отдавать 200-ю и гонять его по этому циклу и только потом отдадим 503-и код ответа.

master32 #:
особенно когда ему явно указать на слабые места

для этого и надо изначально понимать на какой фазе "живёт" требуемый модуль.

master32 #:
а что не так?

С сёрф энд тёрф? 😊- пример того как кажущаяся внешняя эффектность подменяет кулинарную логику

С документацией nginx? - в ней есть ошибки, например, директива try_files по-прежнему описана в ngx_http_core_module 

С непониманием работы nginx? -  в высоконагруженных системах мы пытаемся отдать контент как можно раньше и самое раннее где мы можем его отдать - это ngx_http_rewrite_module, соотвественно в фазах SERVER_REWRITE_PHASE/REWRITE_PHASE, и если мы это делаем, то модули навешиваемые в следующих фазах уже не будут задействованы.
Из примера ранее - мы теряем возможность сделать limit_* , так как его модули обрабатываются в PREACCESS_PHASE, при этом (опять же из-за того, что это явно не указано в документации) так делают повсеместно.

Причём это не ляп документации, это именно её системное непонимание системно и постоянно воспроизводимое.

И на основе этой системности мы и будем обучать нашу систему

соотвественно мы всегда будем получать "Surf and turf"

Sly32 #:
Если дать задачу клауди сделать конигурацию - он предложит такую?  Никогда.

Всегда, именно такую он и предложит.

Вы просто не учитываете хронологию возникновения этой ошибки. Это не вопрос с собесов, это более чем системная ошибка.

1) Сначала у нас возникает локейшин, в котором мы делаем заглушку "return XXX"

2) туда летит DDoS

2a) мы даём задачу клуади

3) мы его глушим именно этим некорректным кодом (причём согласно документации) limit_req

Я привожу пример именно на основе nginx, ибо мне так проще, но я могу доказать и на основе глубуко C-шных примеров, хотя в рамкках этого форума это слишком скучно

ну совбственно, почему и как про Nginx  я писал лет 5 назад
https://habr.com/ru/articles/561758/
https://habr.com/ru/articles/567418/

и это я уже 10+ лет не админ...
сколько накидает vbart или dunin я даже не представляю близко

Sly32 #:
Это LLM+MCP+RAG
естественно, только руководитель темы и вторящие ему полагаются на голый LLM.
ну и RAG+MCP здесь не спасут ситуацию пока обучение LLM не опустится до анализа исходников и полного игнорирования всего кроме них, ибо:
Sly32 #:
То есть систему прежде чем использовать нужно обогатить узкоспециализированными данными. Можно еще вдобавок и дообучить модель, если финансы позволяют.

чем дообучать будем? 
я ведь не спроста вкинул хоть и элементраные запросы, но те, которые
1) не окучены в man'е

2) код которых в массе содержит данную ошибку в 90%+ случаев.

по итогу мы всегда будем обучать систему ошибочными решениями и, соответствено, получать то, что имеем

Sly32 #:
GPT
Что скажешь?

именно та ошибка, которая и ожидалась
директива return ВСЕГДА будет выполняться до limit_req, потому что return в фазе NGX_HTTP_REWRITE_PHASE исполнится раньше чем дойдёт ход до NGX_HTTP_PREACCESS_PHASE.
limit_req здесь не будет исполняться НИКОГДА

чтобы это решить нужно return вынести в именованный локейшин

Sly32 #:
Итоговый ответ клиенту

Ответ:

HTTP/1.1 200 OK

root: one

Sly32 #:
Ответ клиенту будет: root: one two three

Ч.Т.Д.
Модели "обучились" на типичных ошибках/непонимании работы nginx и уверенно их воспроизводят, хотя cloude даже "нашёл" верный путь (порядок фаз), но "не смог" по нему пройти :)
Если, что правильный ответ

$ GET -S example.com
GET http://example.com
200 OK
root: one two three auth_pre

происходит это, потому что сначала выполнятся ВСЕ set, потом апосле них выполнится директива auth_request и только потом в фазе NGX_HTTP_CONTENT_PHASE будет отдан контент

LikeAVirgin #:
чисто настройка VPS под простые задачи
server {
    listen       *:80;
    server_name  .example.com;

    add_header "Content-Type" "text/html; charset=UTF-8" always;

    location /bu {
        return 200 'bu!\n';
    }
}
Попросите его сделать ограничение количества запросов от одного IP-адреса к локейшину /bu
Куда уж проще задача...
master32 #:
а в чем вопрос?

ну и если тот десятистрочник окажется для него неподъёмным дайте совсем детскую задачку

server {
  listen       *:80;
  server_name  .example.com;
  
  location / {
    rewrite ^ /one;
    return 200 "zero\n";
  }

  location /one {
    return 200 "one\n";
  }
}
$ GET -S example.com
Всего: 356