Це стара тема запитань та відповідей, яка допомогла мені вирішити :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: Виправлена помилка регресії в реалізації параметра конфігурації DoNotReverseLookup # 731
Рішенням, як зазначено в запиті, є зміна рядка 181 на lib/webrick/server.rbз цього:
sock.do_not_reverse_lookup = config[:DoNotReverseLookup]
До цього:
unless config[:DoNotReverseLookup].nil?
Поділіться тут, якщо хтось наткнеться на цю розглянуту нитку запитань / відповідей і зацікавлений у прогресі у вирішенні цієї проблеми в Ruby core. Будемо сподіватися, що цей витяг буде об’єднаний або основна проблема буде якось вирішена в наступному випуску Ruby; можливо 2.1.6?