Что касается backlog на стороне сокета, то видите ли, какая штука... ограничение нужно не per-socket, а per-HTTP_HOST (грубо говоря). Т.е. на одном IP висит много виртуальных хостов, и на каждый должно идти, скажем, не больше 5 одновременных коннектов (а на весь сокет - ограничения нет). Можно, конечно, каждый хост на свой внутренний IP повесить, но хочется чего-то более универсального.
Про haproxy я и не подумал... В нем точно можно вот так сделать, когда на одном и том же IP висят несколько виртуальных хостов, и ограничение установлено по каждому?
наверное проще будет настроить на backend`ах параметр backlog,
чем дублировать в nginx функциональность из TCP/IP стека ядра.
Как известно, директива limit_conn позволяет ограничивать
одновременной число соединений к той или иной зоне. Однако, когда
это число превышается, nginx выдает 503.
Есть ли в nginx какое-то средство, которое бы позволило ставить
"лишние" запросы в очередь, а не давать им отлуп? Например, я хочу,
чтобы на backend шло одновременно не более 5 соединений, а все
остальные ставились nginx-ом в очередь.
в новых версиях PHP дефолтовый backlog уже увеличили с 5 до 128.