djangoでアプリケーションを作ったのはいいんだけどそれをapacheで連携させようとしたところかなりハマってしまったのでハマったところとその解決方法をメモしていきます。
環境
- Mac(mojave)
- pyenv(とvirtualenv)使用
- すでにpyenvで環境を作成済み
とりあえず連携させるためにやった手順をそのまま書いていく。
mod_wsgi周りのインストール
pip install mod-wsgi-httpd
pip install mod_wsgi
これは問題なくいけた。
嘘だった。
xcodeをインストールしていなくてエラーでコケたんだった。
app storeからxcodeをインストールして解決した。
(コマンドラインツールだとかを入れてても無駄なので諦めてインストールしましょう。30分位かかった)
mod_wsgiのインストールが終わったらapacheのほういく
apache設定
macにはデフォルトでapacheが入っているので、
/private/etc/apache2/httpd.conf
の最下行に、
LoadModule /Users/username/.pyenv/versions/anaconda3-4.3.0/lib/python3.6/site-packages/mod_wsgi/server/mod_wsgi-py36.cpython-36m-darwin.so
WSGIScriptAlias / /Users/username/anaconda3/mySite/mySite/wsgi.py
WSGIPythonPath /Users/username/anaconda3/mySite
WSGIPythonPath /Users/username/.pyenv/versions/anaconda3-4.3.0/lib/python3.6/site-packages
<Directory /Users/username/anaconda3/mySite/mySite>
<Files wsgi.py>
Order deny,allow
Allow from all
</Files>
</Directory>
こんな感じでかけばいいと言われた。
このサイトにだ。
俺はこのサイトを許さない。
1行目だ。
LoadModule は2つの引数を受け取るはずなのだが、1個しかない。
qiitaとかならまだいい気がするけどこういうサイトでこのレベルのミスがあるといらっとしてしまう。(2019/2/22時点)
愚痴はここまで。
正解は以下のような形になると思う。
LoadModule wsgi_module /Users/username/.pyenv/versions/anaconda3-4.3.0/lib/python3.6/site-packages/mod_wsgi/server/mod_wsgi-py36.cpython-36m-darwin.so
WSGIScriptAlias / /Users/username/anaconda3/mySite/mySite/wsgi.py
WSGIPythonPath /Users/username/anaconda3/mySite
WSGIPythonPath /Users/username/.pyenv/versions/anaconda3-4.3.0/lib/python3.6/site-packages
<Directory /Users/username/anaconda3/mySite/mySite>
<Files wsgi.py>
Order deny,allow
Allow from all
</Files>
</Directory>
LoadModuleの
/Users/username/.pyenv/versions/anaconda3-4.3.0/lib/python3.6/site-packages/mod_wsgi/server/mod_wsgi-py36.cpython-36m-darwin.so
の部分は、環境によって変わるので適宜読み替えてください。
これでいけるかな。と思ってやってみたら、
エラーメッセージは忘れたけど
LoadModule wsgi_module /Users/username/.pyenv/versions/anaconda3-4.3.0/lib/python3.6/site-packages/mod_wsgi/server/mod_wsgi-py36.cpython-36m-darwin.so
の部分で、
署名がどうのこうのって言われて躓いた。
Macにデフォルトで入ってるapacheだとだめっぽい。
というわけで別途brewでインストール。
でいけるかなって思ったんだけどやっぱりだめ。
Cannot load lib/httpd/modules/mod_wsgi.so into server: dlopen(/usr/local/opt/httpd
/lib/httpd/modules/mod_wsgi.so, 10): Symbol not found: _apr_file_info_get$INODE64\n Referenced from: /usr/
local/opt/httpd/lib/httpd/modules/mod_wsgi.so\n Expected in: flat namespace\n in /usr/local/opt/httpd/lib/
httpd/modules/mod_wsgi.so
※↑で書いたhttpd.confの内容と一致しないかもですが気にしないでください。
全くわからなかったけど、ぐぐってみたら、
mod_wsgi.soがpythonを参照しようとするんだけど、そのpythonが共有される前提で作られていなくて、参照できないということらしい。
結局意味がわからないんだけど要は、
/Users/username/.pyenv/versions/3.6.1/lib/libpython3.6m.dylib
このファイルがないのが問題らしい。
じゃあそのファイルはどうやったら作られるのかというと、
pip install 3.6.1
という感じでpythonをインストールするときに、
CONFIGURE_OPTS="--enable-shared" pyenv install 3.6.1
こういうoptionをつけて上げる必要があるらしい。
これはあとから作ることはできないらしいので3.6.1の環境ごと
pip uninstall 3.6.1
で消す必要があります。
virtualenv で環境を作ってる場合、その環境も消すことになりますが仕方ないです。
pip freeze > requirements.txt
とかで吐き出しておいてあとで
pip install -r requirements.txt
ってやるのがベターですかね。
その後、
CONFIGURE_OPTS="--enable-shared" pyenv install 3.6.1
で再インストール。
がここでもハマった。
zlibがどうのこうって起こられる。
原因は↑に書いたとおりでmojaveが良くないらしい。
ここまで書いた通り、環境の作り直しをして再度、
sudo apachectl -k restart
を叩いたら無事いけました。