まーはまったので、残しとく。ApacheでDjango動かすまでのまとめ。Python3.6とDjango入れるのはこっちがメイン

まず、Python3.6入れる。

#RPM持ってくる
sudo yum -y install https://centos7.iuscommunity.org/ius-release.rpm
#インスト
sudo yum -y install python36u
sudo yum -y install python36u-pip
sudo yum -y install python36u-devel

Apache入れる

sudo yum install -y httpd
sudo yum install -y httpd httpd-devel

で、ここから人によると思うんだけど、自分はユーザのホームに「public_html」を作ってそこにDjangoのプロジェクト入れる感じでやる。

#ユーザのホームで
mkdir public_html
#ホームディレクトリのパーミッションを変える
chmod 701 /home/hogeusr

で、ホームディレクト内のディレクトリ使う場合は、ホームディレクトリそのものの、パーミッションで他ユーザの実行権限つけないと動かない。これのやり方はなんか他にないか今度調べよ。

そしたら、とりあえずDjangoのプロジェクト作って確認しておく。

cd ~/public_html/
#仮想環境作る
python3.6 -m venv pyenv
#仮想環境に切り替え
cd pyenv
source bin/activate
#pipの更新
pip install --upgrade pip
#Djangoのインスト
pip install django
#プロジェクト作る
django-admin startproject mysite
#とりあえず実行
cd mysite
python manage.py runserver
#↓にブラウザでアクセス
http://127.0.0.1:8000/

そしたら、mod_wsgiをインストしておく。

#pipで入れないとダメらしい。あと、仮想環境上でやらないとダメ。
pip install mod_wsgi
#入ったモジュールのパスを表示→メモっとく(後で使う)
find /home/hogeusr/public_html/ -name 'mod_*.so'
#仮想環境抜ける
deactivate

設定ファイルを作る

#mod_wsgiの読み込み設定(上でfindしたやつ)
sudo vi /etc/httpd/conf.modules.d/mod_wsgi.conf
LoadModule wsgi_module /home/hogeusr/public_html/pyenv/lib/python3.6/site-packages/mod_wsgi/server/mod_wsgi-py36.cpython-36m-x86_64-linux-gnu.so

#wsgiに読ませるDjangoの設定
sudo vi /etc/httpd/conf.d/django.conf
#ファイルの中身は↓(パスは適宜変更)
WSGIPythonHome /home/hogeusr/public_html/pyenv
WSGIScriptAlias / /home/hogeusr/public_html/pyenv/mysite/mysite/wsgi.py
WSGIPythonPath /home/hogeusr/public_html/pyenv/mysite:/home/hogeusr/public_html/pyenv/lib/python3.6/site-packages

<Directory /home/hogeusr/public_html/pyenv/mysite>
<Files wsgi.py>
Require all granted
</Files>
</Directory>

で、ここまでやった状態で「sudo systemctl restart httpd」を実行するとSELinuxに拒否られる。なので、この辺の設定を次にする。

sudo setsebool -P httpd_enable_homedirs 1
sudo setsebool -P httpd_unified 1
sudo systemctl restart httpd
#↓にブラウザでアクセス
http://localhost

これでDjangoの初画面がでるはず。

WSGIPythonHomeは仮想環境のディレクトリを指定。WSGIScriptAliasはここで指定したURLに来た時にどのWsgiスクリプト動かすか。WSGIPythonPathはWSGIで動かした時に読ませるPythonPath。色んなモジュール読み込みで必要らしい。PythonPathについてはココのブログが分かりやすい。公式はこっち

Apacheで動かすときのDjangoの公式はコッチ

やっててエラーが出たら「/etc/httpd/logs/error_log」にヒントが出るので見ながらアレコレやるしかあるまい。見たエラー的には↓

Fatal Python error: Py_Initialize: Unable to get the locale encoding.
→ WSGIPythonPath のパスが違う。homeティレクトリのパーミッション。

Target WSGI script not found or unable to stat: /home/hogeusr/public_html/pyenv/mysite/wsgi.py
→ パスが違う

自分は他のセキュリティ系の設定はやらなくてもlocalhostで動いたけど、ほんとはやらないとダメなのかな?下の内容。

#↓のファイルでALLOWED_HOSTS=['*']にしておく。
#全OKの設定なのでホントは色々考えないとダメだろね。
vi ~/public_html/pyenv/mysite/mysite/settings.py

あとはファイヤーウォール。面倒なので、一回切ればいいじゃないだろか。。。

systemctl stop firewalld