rack server の unicorn 起動時に -E 引数で環境を指定できるんだけど、ここで production を指定するのは間違いだったという話。rails env などが production だから混乱しがちだけど、ここは deployment か none を指定するのが正しい。知ってるわって人が大多数かもしれないけど、思い込みで production にしているアプリがいくつかあった。。

RACK ENVIRONMENT

Accepted values of RACK_ENV and the middleware they automatically load (outside of RACKUP_FILE) are exactly as those in rackup(1):

development - loads Rack::CommonLogger, Rack::ShowExceptions, and Rack::Lint middleware
deployment - loads Rack::CommonLogger middleware
none - loads no middleware at all, relying entirely on RACKUP_FILE
All unrecognized values for RACK_ENV are assumed to be "none". Production deployments are strongly encouraged to use "deployment" or "none" for maximum performance.

http://unicorn.bogomips.org/unicorn_1.html

この引数はどのRackミドルウェアをロードするかの差っぽい。 とはいえ、development か deployment を指定しなかった場合は none と同じ扱いになりそうです。

https://github.com/defunkt/unicorn/blob/735d0f82adcdf9851664136424004dacfbe2423c/lib/unicorn.rb#L79

というわけで、サーバーに設置するタイプは deployment か none を指定するとよさそう。

追記: RACK_ENV

https://github.com/rack/rack/blob/028438ffffd95ce1f6197d38c04fa5ea6a034a85/lib/rack/server.rb#L157 RACK_ENV 自体に production が存在していない。

https://github.com/isucon/isucon5-qualify/blob/ba895cbce8c5b2471dd9c0dca02f6a83c46d34c8/gcp/bench/files/env.bench.sh#L3 “RACK_ENV production” でググるとけっこう出てくる。 例えばISUCONでもproductionになってるようだった。

追記: Sinatra

https://github.com/sinatra/sinatra#configuration Sinatra の Configuration で RACK_ENV に production をセットしようという案内があった。

Introduce SINATRA_ENV and remove RACK_ENV by dmathieu · Pull Request #984 · sinatra/sinatra

ただし、そのような環境はないからちゃんと責務を分けようという Pull Request も上がっている。