まーはまったので、残しとく。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