LoginSignup
3
3

More than 5 years have passed since last update.

Macでdjangoとapacheを連携させたい人生だった

Posted at

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

を叩いたら無事いけました。

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3