ta-dadadadaのブログ

忘備録とポエム

mod_wsgi がインストールできない

新しく環境構築してたらよくわからないところでハマったのでメモ。

ハマっていたこと

環境は amazon linux (と言いつつその後 ubuntu でも試して同じ症状で苦しんだのでものによらない)。

pyenv で python3.7 を入れて、その仮想環境上で mod_wsgi を入れようとしていた。

とりあえず apache は不可欠なのでいれる。

sudo yum install httpd httpd-devel

それで、

pyenv global 3.7.1

とかして

pip install mod_wsgi

すると、

 /usr/bin/ld: final link failed: Bad value
    collect2: error: ld returned 1 exit status
    error: command 'gcc' failed with exit status 1

とかいって落ちるわけです。

やったこと

どうも依存パッケージが足りないとかそういうわけでは無いらしく、

qiita.com

こういうことだった。 どうも共有ライブラリというのが pyenv 経由の python のインストールでは(デフォルトでは)できないらしく、 一方 mod_wsgi 側からは共有ライブラリを必要としているのでエラーになっていたようだ。

なので実行したこととしては、一旦 python 消してから、

env PYTHON_CONFIGURE_OPTS="--enable-shared" pyenv install 3.7.1

で入れ直した感じ。

改めて pip install mod_wsgi したら無事通った。

注意書き たぶん良い子は真似してはいけない

共有ライブラリ云々というのを知らなかったのでちょっと調べた。

qiita.com

要するに

  • 複数の python version 使う場合、共有ライブラリ作っちゃうと意図しないバージョンの python が誤作動することがあって危ない
  • ライブラリを参照したい側の設定を変えたほうが無難。今回なら mod_wsgi のビルド時に指定するとか

ということらしい。

よくよく考えると一つの環境内部に複数の mod_wsgi がいる、というのも変な話だしな・・・

いろいろ眺めてると、 mod_wsgi にリンクさせる python も 3 のほうが安定するらしい ただ、ビルドする方法だと mod_wsgi-express みたいな便利そうなツールを別途いれないといけない( pip だと同時に入る)とか、 システム自体に python いれないとなので centos で python3.7系を入れる方法とは?とかいう懸念もあって、ベストプラクティスはよくわからない。

とりあえず「1つの環境に求められる python version は 1 つだけ」と割り切ってエイヤと好きな方法で入れてしまっていい気がするけど、どうだろう? 実際サーバ立てるとしたらあんまり混沌なのは想像したくないし・・・