同じ事象いくらでもあるだろって思ってたんだけど、ググれどもググれどもDockerの話題ばかりで、自分のように昔ながらのVPSでサーバー立ててItamaeとかでプロビジョニングして使う勢はもういなくなってしまったらしいので、同じ状況下で困る人がこの記事に辿り着けることを願って書き残しておく。
やりたいことを整理すると、
- 開発環境と本番環境で同じプログラムを別の場所に配置している
- 呼び出す側のプログラムの中でいちいち開発環境と本番環境で判定して処理を分けるのが面倒だった
- なので、環境変数にパスを値としてセットしておいて、各サーバーでプログラムが動いたときにそっちを参照するようにすれば良いだろう、と考えた
…うん、やっぱり特別なことは何も無いですよね。
簡単じゃん、って思っちゃいますよね。
でもつまづいたんです。残念なことに。
Pythonやってる人は、サーバーの環境変数を使いたいときにこんな感じで書きますよね。
import os
print os.environ.get('APPPATH', None)
これで、環境変数APPPATHが設定されてれば値が受け取れる、というやつ。
これ自体は別に間違ってないし、例えばバッチファイル作ったときはこれで全然動くんですが、NginxだとOSの環境変数は使えないっぽくて、上記の書き方だとNoneが返ってきてしまう。
では、どうすれば良いのか。
答えはNginxのコンフィグの方にありました。
/etc/nginx/conf.d内の、あなたのWebアプリの設定用コンフィグで、
location / {
# 他のコンフィグは省略
uwsgi_param APPPATH /path/your/app;
}
from bottle import request
# (中略)
request.environ.get('APPPATH', None)
で、無事値を受け渡すことができました。
FlaskとかDjangoでどう書くかはわかりませんが同じことができるはず。
以上、Bottle.pyがますます気に入った瞬間でしたとさ。