
同じようなトラブルにあった人のためのメモ。
途中から、本番のrailsサーバーの挙動(表示)がおかしくなって(見た目はrootエラー関連)、
The page you were looking for doesn't exist.
You may have mistyped the address or the page may have moved.
If you are the application owner check the logs for more information.
(Herokuとかではよく見かけるエラー表記。Googleで調べるとHerokuとRoutesのエラー情報がたくさん見つかりますが、これが表示されたからといって、必ずしもRailsのルーティングのミスとは限りません)
サーバー(nginx)やunicornを再起動して確認してみた際に、unicornの再起動ができなくなっていたため、unicornのエラーログをのぞいたら、以下のような表記がありました。
[2020-05-01T00:10:06.424575 #3995] INFO -- : Refreshing Gem list bundler: failed to load command: unicorn_rails (/var/www/cscg_simu/shared/bundle/ruby/2.7.0/bin/unicorn_rails) NoMethodError: undefined method `namespace' for main:Object
(本番環境のunicornのstartが動作しない状態なので、当然restartやデプロイも成功しません)
調べても前例が殆ど無く、解決方法がわからなかったので、知人のハッカーにご相談。
namespaceをメソッドコールしてるのってcapistranoだけっぽい。
(current内にて「grep namespace **/*」で調査)
以下、ハッカーのアドバイス。
えーっと config/unicorn/production.rbに preload_app trueみたいな設定があるのですが
その設定があるとunicornのプロセス起動時にアプリのコードの読み込みをするのですが ロードパス上にあるrubyファイルを読み込むのでlib/capistrano/tasks/unicorn.rbも読み込んでしまっていて
そのファイル上でnamespaceという命令を読んでいるのですが、これを定義しているgem(たぶんcapistrano)がproduction環境で読み込まれてないから
「production.rb」の「preload_app true」と「lib/capistrano/tasks/unicorn.rb」の連携が悪さをしていた模様。
qiitaの環境構築の説明記事通りにやっていたのですが、まさか、こんなところに落とし穴があるとは、という感じでした。
対策:
つまり、unicornのプロセス起動時に「lib/capistrano/tasks/unicorn.rb」を読み込まないようにすれば良いわけですね。
その1。
lib/capistrano/tasks/unicorn.rb
を
lib/capistrano/tasks/unicorn.rake
に変更。
その2
Capfile:
Dir.glob("lib/capistrano/tasks/*.rb").each { |r| import r }
を
Dir.glob("lib/capistrano/tasks/*.rake").each { |r| import r }
に変更。
その3
unicornをプロセスキルして再起動。
(古いタスクが残っていると、デプロイは成功するのにunicornがエラーという現象が発生します)
この3つで問題は無事解決されました。
(´∀`)











