Это старая ветка вопросов и ответов, которая помогла мне решить :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?