Аутлогическое сохранение, вызывающее ошибку 502 Bad Gateway, недопустимая инструкция в консоли Rails - PullRequest
0 голосов
/ 12 января 2012

Я недавно установил новый сервер приложений (Ruby 1.8.7 REE, Rails 2.3.8, Passenger 3.0.9, Nginx 1.0.6) за прокси-сервером и столкнулся с некоторым странным поведением. При публикации / входе только на этом сервере приложений я получаю ошибку 502 Bad Gateway. Это не происходит на другом сервере приложений, и оба настроены одинаково. Я сузил проблему до конкретной строки кода - сохранение сеанса Authlogic. Когда я закомментирую эти строки (в частности, вызов сохранения):

@user_session = UserSession.new(params[:user_session])
if @user_session.save
...

ошибка 502 больше не возникает. Аналогичным образом, когда я тестирую эти команды в консоли, я получаю ответ «Недопустимая инструкция», и консоль вылетает:

>> Authlogic::Session::Base.controller = Authlogic::ControllerAdapters::RailsAdapter.new(self)
>> @user_session = UserSession.new({"password"=>"password", "remember_me"=>"0", "login"=>"myuser"})
>> @user_session.save
Illegal instruction

Тестирование этого на другом сервере приложений работает просто отлично (консоль не вылетает с результатом Illegal Instruction).

Есть идеи, с чего начать устранение неполадок? Я не вижу ничего ценного ни в журналах Rails, ни в журналах Nginx.

Спасибо.

Редактировать

Недопустимая инструкция возникает во время системного вызова digest.rb. То же самое происходит независимо от того, использую ли я пакет Ubuntu Ruby Enterprise Edition или собираю его сам:

stat("/opt/ruby-enterprise-1.8.7-2011.12/lib/ruby/1.8/digest.rb", {st_mode=S_IFREG|0644, st_size=1145, ...}) = 0
open("/opt/ruby-enterprise-1.8.7-2011.12/lib/ruby/1.8/digest.rb", O_RDONLY) = 15
fstat(15, {st_mode=S_IFREG|0644, st_size=1145, ...}) = 0
close(15)                               = 0
--- SIGILL (Illegal instruction) @ 0 (0) ---

1 Ответ

1 голос
/ 12 января 2012

Звучит так, как будто это связано с Разрушением приложения Ruby 1.9 с «Недопустимым указанием» .

Йорг W Миттаг сказал:

«Недопустимая инструкция» - это обычно сообщение об ошибке от ЦП, означающее, что некоторый фрагмент двоичного кода, который вы пытались запустить, содержал инструкцию, которая не реализована на этом конкретном ЦП.

Это может иметь несколько причин:

  • Бинарный файл был скомпилирован с настройками оптимизации для неправильного процессора. Поставщики ЦП постоянно добавляют новые инструкции. Если компилятор оптимизирует ЦП, который является более новым, чем тот, который у вас есть, он мог выдать инструкцию, которую ЦП не понимает.
  • Компилятор не работает.
  • Двоичный файл поврежден.
  • Код, который вы компилируете, содержит ассемблерный код или встроенные команды, содержащие инструкции, которых нет у вашего процессора.

Автор исходного вопроса Фил Кулак ответил, что обнаружил переполнение стека, вызывающее ошибку.

...