読者です 読者をやめる 読者になる 読者になる

シコウノキロク

思考・志向・試行・嗜好の記録

CentOS7にpython3を参照するdjango環境を構築(1/2)

自分なりに構築した際の覚書で、Ansible等で用いるためのメモでもあります。
なお、下記のコマンドは適宜sudoをつけて実行しています。よくわからない場合はrootユーザーでやればいいのですよ。

環境

今回の方針

  • 構成はなるべくシンプルにする。
  • buildするとuninstallが面倒なのでpython3はyumで入れる。
  • wsgiがpython3を参照するようにする。

yumでpython3を入れる

CentOSの標準レポジトリですとpython3が対応していないため、IUSレポジトリを追加します。
追加後、通常のyumコマンドで参照しないようにするために設定のenabledを変更しておきます。

yum install https://centos7.iuscommunity.org/ius-release.rpm  
vi /etc/yum.repos.d/ius.repo   
enabled=1 → enabled=0  

ちなみにこの設定変更はsedコマンドを使うと頭良さそう。しかし、置き換えるファイルの中身を把握する必要があるので、僕が使いこなすのはだいぶ先ですね。

sed -i -e "s/enabled=1/enabled=0/g" /etc/yum.repos.d/ius.repo

追加したIUSレポジトリを利用してpython3(今回は3.5.3)を導入します。
その後、シンボリックリンクを作成しpython3コマンドで起動できるようにしています。"python"でpython3にシンボリックリンクを貼るとyumが死ぬので非推奨です。しかし、pyvenvはpython2では使えないコマンドなので、3をつけずに"pyvenv"でシンボリックリンクを作成しています。

yum --enablerepo=ius install python35u python35u-libs python35u-devel python35u-pip
cd /bin
ln -s python3.5 python3
ln -s pyvenv-3.5 pyvenv

http://www.codeghar.com/blog/install-latest-python-on-centos-7.html
http://weblabo.oscasierra.net/python3-centos7-yum-install/
http://www.server-memo.net/centos-settings/centos7/add-repo.html
https://www.agent-grow.com/self20percent/2016/09/11/centos7にpython3をyumで入れてみます゚д゚/
http://blog.livedoor.jp/hayashikunsan/archives/1001846929.html

仮想環境を作成する

ホームディレクトリに移動して、仮想環境を作成します。

cd
python3 -m venv test_django
. test_django/bin/activate

下のようにユーザー名の左側に括弧で囲まれた文字が出てきましたか?あれば、仮想環境内です。

(test_django) [user@hogehoge hoge]

venv仮想環境内で用いられるpythonのバージョンはvenvを実行したものになります。今回はpython3実行しているので、pip==pip3、python==python3となり同じコマンド扱いです。念のため。
では、djangoをpipで導入してみます。

pip install django
pip freeze
  Django==1.10.5

deactivate
pip3 freeze
  (出力なし)

シンプルでいいですね!

https://docs.python.jp/3/library/venv.html

mod_wsgiを入れてapacheを設定する

yumで入れるとsystemのpython2と紐付くことになるため、python3と紐づけられるpipで入れます。 ただし、いきなりpipで入れようとするとapxsがないよーって言われます。

RuntimeError: The 'apxs' command appears not to be installed or is not executable. Please check the list of prerequisites in the documentation for this package and install any missing Apache httpd server packages.

そこで、先にyumhttpd-develを入れます。 ちなみにpython3導入の際に、"python"のシンボリックリンクをpython3に変える&yumの設定ファイルでpython3を参照するように変更していた場合、yumが死にます。この時"python"でpython3にシンボリックリンクを貼る弊害に気づき、systemのpython2に戻しました。

yum install http-devel
pip install mod_wsgi

mod_wsgiの場所を探してリンクをコピーして、apacheファイル(wsgi.conf)を作成します。

find / -name "*mod_wsgi*"
  /home/user/test_django/lib/python3.5/site-packages/mod_wsgi/server/mod_wsgi-py35.cpython-35m-x86_64-linux-gnu.so  
  
vi /etc/httpd/conf.d/wsgi.conf 
WSGIScriptAlias /test_wsgi /var/www/html/test_wsgi.py
LoadModule wsgi_module /home/user/django/lib/python3.5/site-packages/mod_wsgi/server/mod_wsgi-py35.cpython-35m-x86_64-linux-gnu.so

apacheが参照している位置にpythonスクリプトを作成します。内容は参照しているpythonのバージョンが表示されるようになっています。

vi /var/www/html/test_wsgi.py 
import sys

def application(environ,start_response):
    status = '200 OK'
    versions = sys.version_info
    output = str(versions).encode('utf-8')
    response_header = [('Content-type','text/plain'),
                        ('Content-Length',str(len(output)))]
    start_response(status,response_header)
    return [output]

apacheを再起動してあげて、設定したアドレスに接続します。

systemctl restart httpd

http://123.456.78.90/test_wsgi

pythonのバージョンがsystemで使用されている2系ではなく、3系が表示されていれば成功!今回の場合はpython3.5.3なので下のように表示されるはずです。

sys.version_info(major=3, minor=5, micro=3, releaselevel='final', serial=0)

http://qiita.com/nekozanmai/items/3ff3d319ff79befa8ce4 http://www.yoheim.net/blog.php?q=20170206 http://tazakazushi.net/apache_no_apxs.html

接続できない時の対処法

何かしらのエラーが出て繋がらない場合は、エラーログを見ることで原因を特定します。

less /var/log/httpd/error_log

エラーとしては、apacheが動いていない、パスの指定を間違えている、pythonモジュールのエラー、ディレクトリのパーミッション辺りを見れば良いようです。 上記で解決しない場合は、centos7特有のメジャーハマりどころ、SELinuxとFirewalld辺りをググると解決するかもしれません。 こんなことを言っておいて、僕は全く違う下記のようなエラーが出てました。結局、エラーログを見るのが大事ということですね。

TypeError: sequence of byte string values expected, value of type str found

http://akiniwa.hatenablog.jp/entry/2013/09/24/150412 http://stackoverflow.com/questions/34838443/typeerror-sequence-of-byte-string-values-expected-value-of-type-str-found

長くなってしまったので2分割します。次回はdjangoを導入・設定していきます。

shikouno.hatenablog.com

広告を非表示にする