Django開発環境構築

#Django#Python#Web

概要

これまでウェブではPHPを使ってきました。 4月から機械学習始めるにあたってPythonを触り始め、しばし2言語で開発進めていましたが、セミコロン忘れるわ、for文の書き方ごっちゃになるわで、ややこしい。 いっそウェブアプリケーションもPythonで作っちゃえばよくない?ってことで、ウェブも特に注文がない限りPython一本化することにしました。 ただ、PHPに比べて環境構築が結構ややこしくって、毎回確認することになるので備忘録としてまとめます。

環境

  • CentOS使います。
  • Pythonのバージョン管理はpyenvを用います。
  • Apache + mod WSGIでPythonを動かします。

環境構築

firewalld, SELinux停止

本番用では色々設定するべきなんでしょうが、ザクッと確認する時は停止しています。

systemctl stop firewalld
systemctl disable firewalld
setenforce 0

  設定ファイルを編集します。

vi /etc/selinux/config

  enforcingの部分をdisabledに変更します。 これで再起動後にSELinuxが起動することがなくなります。

# SELINUX=enforcing
SELINUX=disabled

Webサーバ = Apache

Apacheをインストールして起動し、自動起動を設定しておきます。

yum install httpd httpd-devel
systemctl start httpd
systemctl enable httpd

データベース = MariaDB

Djangoがデフォルトで利用するデータベースはSQLiteです。 他のものを使いたい場合は適宜インストールします。 DjangoプロジェクトでSQLite以外のデータベースの利用をする場合はsettings.pyを編集します(後述)。

yum install mariadb mariadb-server mariadb-devel

  /etc/my.cnfを編集します。 [mysqld]の下に以下を追記。

character-set-server = utf8
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

  加えて以下まるまる追記。

[client]
default-character-set = utf8

  起動と自動起動を設定しておきます。

systemctl start mariadb
systemctl enable mariadb

  初期設定を行います。

mysql_secure_installation
Enter current password for root (enter for none): # 初期設定はブランク。そのままエンターを押します。
Set root password? [Y/n] y
New password: # 任意のパスワード
Re-enter new password:: # パスワード確認
# 以降は全てyで答えればよいです。

参考: Django事始め: 4_MySQL連携   続いてデータベースやユーザを作成します。

mysql -u root -p
CREATE DATABASE "データベース名";
CREATE USER "ユーザ名" IDENTIFIED BY "パスワード";
GRANT ALL ON "データベース名".* TO "ユーザ名" IDENTIFIED BY "パスワード"; # 作成したユーザにDBの権限を与えます
FLUSH PRIVILEGES;

参考: MySQLへユーザー追加の手順 grant, revoke

gitなど後ほど必要になるパッケージ

yum install git gcc gcc-c++ make openssl-devel bzip2-devel zlib-devel readline-devel sqlite-devel bzip2 sqlitezlib-devel bzip2 bzip2-devel readline-devel sqlite sqlite-devel openssl-devel

参考: PyenvをCentOS6.3でセットアップする(超かんたんリファレンス付き)

pyenv, Python, Django

cd /usr/local/bin
git clone git://github.com/yyuu/pyenv.git ./pyenv
echo 'export PYENV_ROOT="/usr/local/bin/pyenv"' >> ~/.bashrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc
source ~/.bashrc

  pyenvのバージョンを確認します。

pyenv --version
pyenv 1.1.1-1-g734e40d

  Pythonをインストール、設定します。

pyenv install 3.6.0
pyenv rehash
pyenv global 3.6.0

  現在の設定を確認します。 これで組み込みのPythonではなくpyenvでインストールしたPythonが使われるようになりました。 エラーが出た場合は公式サイトの頻出エラーを確認してみてください。

pyenv version
3.6.0 (set by /path/to/pyenv/version)

  次に、Django及び必要なライブラリをpipでインストールします。 後々cryptographyをアップグレードするように言われるので、先に対処しておきます。

pip install django PyMySQL mysqlclient
pip install -U cryptography

  ここまででDjangoを動かすことが可能になりました。 公式サイトのチュートリアルを参考に確認してみます(省略)。 ここでは例として、/home/djangoに「mysite」という名前のプロジェクトを作成するとします。

cd /home/django/
django-admin startproject mysite

  作成したDjangoプロジェクトが起動できるか開発用サーバで動かしてみます。

cd mysite
python manage.py runserver

  デフォルトでは8000番ポートで閲覧できるので、ローカルで実行している場合はブラウザに「localhost:8000」と打ってアクセスしてみてください。 仮想環境で実行しているなど、Djangoを動かしているサーバと、ブラウザを閲覧するマシンが異なる場合は多少設定ファイルを編集します。

vi settings.py

  ALLOWED_HOSTSを全て受け入れるようにしましょう。

ALLOWED_HOSTS = ['*']

  改めて実行します。runserverの後ろに数字をつけることでポート番号を指定できます。 8000番がすでに使われているなら他の番号を使いましょう。

python manage.py runserver 0.0.0.0:8000

mod_WSGI

開発サーバ(python manage.py runserver)で動かすだけなら必要ありませんが、 Apachを利用することを考えている場合は、mod_WSGIを利用します。 mod_WSGIに関して詳しい説明は以下のサイトを参考にしてください。 参考: [Python] mod_wsgiを使ってPython3.6をApacheで動かす(CentOS6系) ちなみに読みは「WSGI」=「ウィズギィ」です。   ソースをダウンロードし展開します。

wget https://github.com/GrahamDumpleton/mod_wsgi/archive/4.5.14.tar.gz
tar -zxvf 4.5.14.tar.gz
cd mod_wsgi-4.5.14/

  デフォルトだと組み込みのPythonを使用してしまいます。 先ほどpyenvで設定したPythonを利用するように設定を変更します。

./configure --with-python=/usr/local/bin/pyenv/versions/"使いたいバージョン"/bin/python
make
make install

  mod_WSGIの依存関係を満たします。 lddコマンドで利用するのに必要とする共有ライブラリを検索します。

ldd /etc/httpd/modules/mod_wsgi.so
linux-vdso.so.1 => (0x00007fff8c9fe000)
libpython3.6m.so.1.0 => not found
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f4c9e548000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007f4c9e344000)
libutil.so.1 => /lib64/libutil.so.1 (0x00007f4c9e141000)
librt.so.1 => /lib64/librt.so.1 (0x00007f4c9df38000)
libm.so.6 => /lib64/libm.so.6 (0x00007f4c9dc36000)
libc.so.6 => /lib64/libc.so.6 (0x00007f4c9d875000)
/lib64/ld-linux-x86-64.so.2 (0x00007f4c9e9a8000)

  おそらく2つ目のlibpython…という部分がnot foundになっています。 まずは目当てのライブラリをpyenvのディレクトリから探します。 そしてmod_wsgi.soが参照できる場所にlibpython3.6m.so.1.0のシンボリックリンクを貼ります。

ls /usr/local/bin/pyenv/versions/"使いたいバージョン"/lib/ | grep python
libpython3.6m.so
libpython3.6m.so.1.0
libpython3.so
python3.6
ln -s /usr/local/bin/pyenv/versions/anaconda3-4.3.0/lib/libpython3.6m.so.1.0 /lib64/

Apache設定

設定ファイルを開き、追記します。

/etc/httpd/conf/httpd.conf

  前述の/home/django/mysiteというプロジェクトを動かす場合の設定です。 もし複数のプロジェクトや他のPHPアプリケーションなどをApacheで扱いたい場合は、vhosts.confにもう少し込み入った設定をする必要があります。

LoadModule wsgi_module modules/mod_wsgi.so
WSGIScriptAlias / /home/django/xxx/xxx/wsgi.py
WSGIPythonHome /usr/local/bin/pyenv/versions/anaconda3-4.3.0/
WSGIPythonPath /home/django/xxx
<Directory /home/django/xxx/xxx>
<Files wsgi.py>
Require all granted
</Files>
</Directory>
Alias /static/ /home/django/xxx/static/
<Directory /home/django/xxx/static>
Require all granted
</Directory>

エラーが出た場合はこちらの記事などを参考に解決してください。 参考: Django事始め: 3_Apache連携   これでApacheでDjangoプロジェクトを公開できるようになりました。 注意点として、Apacheで公開しているときは開発サーバで動かしている時と違い、ソースに加えた変更が即時反映されません。 変更した後はApacheを再起動するか、mod_wsgiのデーモンモードを利用しましょう。 参考: mod_wsgi のデーモンモードを使う もっとも頻繁に変更が加えられる開発中は開発モードを使用していると思うのでそれほど需要はないかもしれません。