LokkaでArgumentError: invalid byte sequence in US-ASCII
さくらVPSに入れてるDebianでLokkaが動かないみたいなことに遭遇した。
https://github.com/lokka/lokka
エラー内容
nginxには次のログを吐いてた。
2014/01/13 11:36:26 [error] 17289#0: *2698 upstream prematurely closed connection while reading response header from upstream, client: 126.253.35.139, server: docs.jiikko.com, request: "GET / HTTP/1.1", upstream: "passenger:/tmp/passenger.1.0.17261/generation-0/request:", host: "docs.jiikko.com"
アプリのほうのエラー内容はタイトルにもあるように
ArgumentError at / invalid byte sequence in US-ASCII file: blank.rb location: =~ line: 96
だった。
バックトレースを見ると、lokka/lib/lokka/helpers/render_helper.rbの36行目で落ちてる。
29 def render_any(name, options = {}) 30 ret = '' 31 templates = settings.supported_templates + settings.supported_stylesheet_templates + 32 settings.supported_javascript_templates 33 templates.each do |ext| 34 out = rendering(ext, name, options) 35 out.force_encoding(Encoding.default_external) unless out.nil? 36 unless out.blank? 37 ret = out 38 break 39 end 40 end 41 ret 42 end
35行目でEncoding.default_externalに入っているエンコードに変換してるんだけど、
自分の環境では、Encoding.default_externalは、
[3] pry(#<Lokka::App>)> Encoding.default_external => #<Encoding:US-ASCII>
となっていて、文字コードが違うもの同士で正規表現しようとして落ちてる感じ。
ちなみに、Encoding.default_externalの中身はどこでセットされるかちょっと調べたらコマンドライン引数からとってくるらしい。
http://qiita.com/ongaeshi/items/12a0266ed89835674be8
(このDebinaでLokka実行中のEncoding.default_externalがどこでセットされてるかは謎。よくわかりません><)