Это старая ветка вопросов и ответов, которая помогла мне решить проблему :DoNotReverseLookup
на локальной виртуальной машине разработки и хотела добавить дополнительную информацию. Эта веб-страница объясняет ошибку регрессии в ядре Ruby, которая приводит к появлению этой проблемы для некоторых; акцент мой; Если коротко, то всего этого есть запрос на GitHub для исправления ядра Ruby, и, надеюсь, он будет одобрен и объединен в скором выпуске Ruby:
После нескольких часов поиска неисправностей выяснилось, что это так!
По-видимому, где-то вдоль эволюции стандартной библиотеки Ruby от
С 1.8.6 по 2.0.0 WEBrick приобрел новую опцию конфигурации :DoNotReverseLookup
, которая по умолчанию установлена на nil
. Затем глубоко в
кишки кода обработки запросов WEBrick, он устанавливает
do_not_reverse_lookup
флаг на экземпляре сокета входящего соединения
до значения config[:DoNotReverseLookup]
. Так как это значение равно nil
,
что ложно, эффект такой же, как установка его на false
,
переопределение глобального флага Socket.do_not_reverse_lookup
. Так что, если
у вас есть: DoNotReverseLookup => true
в вашей конфигурации WEBrick, наоборот
DNS-поиск всегда будет происходить для каждого нового соединения, потенциально
вызывает серьезные задержки.
С этим обнаружением связан запрос от GitHub от автора , в котором предлагается исправление проблемы в исходном коде Ruby WEBrick: Исправление ошибки регрессии в реализации опции конфигурации WEBrick's: DoNotReverseLookup # 731
Решение, как указано в запросе, состоит в том, чтобы изменить строку 181 в lib/webrick/server.rb
из этого:
sock.do_not_reverse_lookup = config[:DoNotReverseLookup]
На это:
unless config[:DoNotReverseLookup].nil?
Поделитесь здесь, если кто-то наткнется на эту хорошо продуманную ветку вопросов / ответов и заинтересован в прогрессе в решении этой проблемы в ядре Ruby. Надеемся, что это извлечение будет объединено или основная проблема будет решена каким-либо образом в следующем выпуске Ruby; может быть 2.1.6?