Django開発環境構築
目次
概要
これまでウェブでは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で答えればよいです。
続いてデータベースやユーザを作成します。
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>
エラーが出た場合はこちらの記事などを参考に解決してください。
これでApacheでDjangoプロジェクトを公開できるようになりました。
注意点として、Apacheで公開しているときは開発サーバで動かしている時と違い、ソースに加えた変更が即時反映されません。
変更した後はApacheを再起動するか、mod_wsgiのデーモンモードを利用しましょう。
もっとも頻繁に変更が加えられる開発中は開発モードを使用していると思うのでそれほど需要はないかもしれません。