くりーむわーかー

プログラムとか。作ってて ・試しててハマった事など。誰かのお役に立てば幸いかと。 その他、いろいろエトセトラ。。。

Apache

CentOS7でApacheでDjango動かすまで

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

DjangoとApacheとWSGIとWindows

Windows上でDjangoで作ったアプリをApacheからWSGIで呼べるようにする。

まーWindowsはいばらの道じゃ。

とりあえず必要な資源をダウンロードしておく。ApacheとかPythonとか。PythonはPIPとVirtualEnvも。

①Djangoで適当にアプリを作る。

仮想環境つくる
virtualenv venv

仮想環境での作業に変える
cd venv
Scripts\activate

Djangoをインスト
pip install django

Djangoのバージョン ⇒ 今回は2.0.6
python -m django --version

アプリを作る
django-admin startproject mysite

とりあえず動かして確認 ⇒ http://127.0.0.1:8000/
cd mysite
python manage.py runserver

②Apacheの準備

1.ダウンロードしたZipを適当なフォルダに展開しておく
2.confファイルの変更(Apache24\conf\httpd.conf)
 ⇒ デフォでC:\Apache24みたいになってるところを格納したフォルダのパスに全部変える。
3.動作確認 : コマンドプロンプト上でbin/httpd.exeで動かしたら「http://localhost」にアクセス
 ⇒ IT WORKS!!って出ればOK。ポート変えてる時はURLは適宜変える。

そしたら、胆のmod_wsgiのインスト。仮想環境上でやってもいいかもだけど、自分は本体(って言い方であってんのかな)の方にインストした。windowsでインストールするやり方は昔はアレコレ大変だったようですが、今は割と楽。調べてて、昔のやり方ではまりそうになったんだけど、mod_wsgiのGitのReadmeにちゃんと書いてあった。やっぱ一次情報をちゃんと読まないとダメですね。これには大部分が昔のやり方で載ってるんだけど、一番上にここに載ってる事はもうやんなって書いてありましたね。

で、今のやり方は↓。

pip install mod_wsgi

これだけ。随分楽になったようで。・・・が、ApacheをC:の直下に展開してないとエラーが出ると言う罠。「No Apache installation can be found. Set the MOD_WSGI_APACHE_ROOTDIR environment to its location.」っていうエラーが出る。C:直下以外にある場合は、この環境変数setしてからじゃないとダメっぽいですね。stackoverflowに質問もあった。 という事で、C:直下以外にある場合は↓の感じ。

set "MOD_WSGI_APACHE_ROOTDIR=F:\Apache32\Apache24"
pip install mod_wsgi

で、Apacheには32bit版と64bit版があるんですが、64bit版だとこれでもまだ変なエラーがでる。あきらめて32bit版にしましたとさ。。。

あと、自分のPCにはVisualStudio2017も入ってるんですが、上記のStackOverflow見てると、VisualStudio入ってないとダメそう?mod_wsgiのインストールの中で、コンパイルしてるっぽい?

インストール出来たら↓。

mod_wsgi-express module-config

上記のコマンド実行すると↓感じの設定文字列が出てくるので、これをApacheのhttpd.confにコピペする。

LoadFile "f:/python36/python36.dll"
LoadModule wsgi_module "f:/python36/lib/site-packages/mod_wsgi/server/mod_wsgi.cp36-win32.pyd"
WSGIPythonHome "f:/python36"

そしたら、あとはDjangoの公式に載ってる設定をhttopd.confに追加しておしまい。最終的にhttpd.confに追記するのは↓。

LoadFile "f:/python36/python36.dll"
LoadModule wsgi_module "f:/python36/lib/site-packages/mod_wsgi/server/mod_wsgi.cp36-win32.pyd"

WSGIPythonHome "f:/py/venv"
WSGIScriptAlias /mysite "f:/py/venv/mysite/mysite/wsgi.py"
WSGIPythonPath "f:/py/venv/mysite"

<Directory f:/py/venv/mysite/mysite>
<Files wsgi.py>
Require all granted
</Files>
</Directory>

WSGIPythonHomeはDjangoを使ってる仮想環境のルートを指定するっぽいですよ。これで、WSGIScriptAliasで指定してるURLにアクセスすればDjangoが動くという寸法です。ただ、なんだかデフォのままだとトップページが出ないぽいので、「/mysite/admin/」みたいに中のURLまで行かないとダメな感じ?あんま調べてない。まー動いたから良しとしよう。

あーあと、MariaDB使ってるんですが、開発環境上だと「pip install PyMySQL」だけで動くんだけど、Apache通すと動かない。エラーログに「Did you install mysqlclient?」って出てくるから「pip install mysqlclient」でインストールしたら動くようになった。なんだろね。。。

問合せ