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

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>
```

こんな感じでかけばいいと言われた。

https://www.sejuku.net/blog/27637

このサイトにだ。
俺はこのサイトを許さない。

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でインストール。

https://qiita.com/chatrate/items/ea498e55eaaa30a39b30



でいけるかなって思ったんだけどやっぱりだめ。

```

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がどうのこうって起こられる。

https://qiita.com/chatrate/items/af6f1cee37f811237a5a

原因は↑に書いたとおりでmojaveが良くないらしい。



ここまで書いた通り、環境の作り直しをして再度、

```
sudo apachectl -k restart
```

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