概要

前回(設定ファイルを複数つくる)のつづき。

今回は Vagrant でサクッと仮想マシンを用意して、 Apache で Django を開く。 Vagrant で linux 仮想マシンをいじれるようになったのが正直メッチャ嬉しくてその興奮を記述したい想いはあるんだけど、 Django とは関係ないからここはサラッと流そう。いやー、ちょっとプログラミングかじると、 linux マシンに憧れをもっちゃうものだよ。

 

今回必要なライブラリを用意しとく

mod-wsgi が増える。

$ cat << __EOF__ > requirements.txt
Django==2.1.8
mod-wsgi==4.6.5
pytz==2019.1
__EOF__

 

Vagrant, Virtualbox

インストール。

# 確認。
$ which vagrant
/usr/local/bin/vagrant
$ which virtualbox
/usr/local/bin/virtualbox

 

Apache で開くための Vagrant 設定

# ファイルをふたつ追加。
$ touch Vagrantfile
$ touch provision.sh

とにかく以下のように設定ファイルを書くのだ。意味がわからなくてもとにかく書くのだ。とにかく書けば linux をゲットできるのが Vagrant のいいとこなのだ。

Vagrantfile 編集

# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|

  # CentOS7 を指定。
  config.vm.box     = "CentOS7.2"
  config.vm.box_url = "https://github.com/CommanderK5/packer-centos-template/releases/download/0.7.2/vagrant-centos-7.2.box"

  # CentOS は 192.168.33.10 に設置。
  config.vm.network "private_network", ip: "192.168.33.10"

  # Mac の 9000 ポートを CentOS の 80 につなげる。
  config.vm.network "forwarded_port", guest: 80, host: 9000

  # なんだっけこれ。無いとなんかでつまらんエラーが起こった気がする。
  config.vm.hostname = "django.local"

  # このディレクトリと CentOS の /vagrant ディレクトリを同期させる。
  config.vm.synced_folder ".", "/vagrant"

  # この sh を CentOS 内で実行できる。
  config.vm.provision :shell, :path => "provision.sh"
end

provision.sh 編集

#!/bin/sh

# よくわかってないけど yum 先輩のアップみたいなもんを行う。
yum makecache fast
yum update -y

# 
# MySQL の設定を書く予定。
# 

# Python3.6 インストール。これで python3.6 コマンドが使えるようになる。
yum install -y https://centos7.iuscommunity.org/ius-release.rpm
yum install -y python36u python36u-libs python36u-devel

# Python3.6 の仮想環境を CentOS のルートに作る。
python3.6 -m venv /env3.6

# 仮想環境をアクティベート。これで python コマンドで 3.6 が使えるようになる。
source /env3.6/bin/activate

# pip 用意。
curl https://bootstrap.pypa.io/get-pip.py -o /get-pip.py
python /get-pip.py
rm /get-pip.py -f
pip install --upgrade pip setuptools

# requirements からライブラリを取得。
pip install -r /vagrant/requirements.txt

# migrate を行う。
# manage.py だとテスト環境の DB 設定を使ってしまうので、あとで本番用設定を使うようオプションをつける予定。
# まだ MySQL がないからあとでね。
python /vagrant/manage.py migrate

# Apache インストール。
yum install -y httpd httpd-devel

# Apache 先輩が Python の wsgi モジュールを使うための設定ファイル。
# モジュールの位置は find /env3.6 -name 'mod_wsgi*.so' でわかる。
touch     /etc/httpd/conf.modules.d/mod_wsgi.conf
chmod 777 /etc/httpd/conf.modules.d/mod_wsgi.conf
cat << __EOF__ > /etc/httpd/conf.modules.d/mod_wsgi.conf
LoadModule wsgi_module /env3.6/lib/python3.6/site-packages/mod_wsgi/server/mod_wsgi-py36.cpython-36m-x86_64-linux-gnu.so
__EOF__
# 
# あとでベーシック認証用の設定を追加予定。
# 

# Apache 先輩が Django を使うための設定ファイル。
touch     /etc/httpd/conf.d/django.conf
chmod 777 /etc/httpd/conf.d/django.conf
cat << __EOF__ > /etc/httpd/conf.d/django.conf
WSGIPythonHome     /env3.6
WSGIPythonPath     /vagrant:/env3.6/lib/python3.6/site-packages
WSGIScriptAlias    / /vagrant/config/wsgi.py
<Directory /vagrant/config>
    <Files wsgi.py>
        Require all granted
    </Files>
</Directory>
__EOF__
# 
# あとで静的ファイルの配信設定を追加予定。
# 

# 
# 静的ファイルを Apache 先輩の支配領域へコピーするコマンドを書く予定。
# 

# 
# DB の初期データをロードするコマンドを書く予定。
# 

# 
# ファイアウォールの設定を書く予定。
# 

# Apache を起動。
apachectl restart

# CentOS の起動ごとに Apache も起動させる。
systemctl enable httpd.service

 

仮想マシン起動

$ vagrant up

これでもう開けるはず。 localhost:9000 にアクセス。

アクセスすると 404 になる

Apache 環境 Django 初期状態

けれど、それは「アクセスしたときのページ」を Django を設定してないからだから当然だ。心配ならば localhost:9000/admin/ にアクセスして、動いていることを確認しよう。

静的ファイルは読み込まれない

ほんで admin ページではデザインが死んでて(CSS が読み込まれていない状態で)また心配になってしまうことだろう。

Apache 環境 Django admin 初期状態

けれど、それは Apache 環境における静的ファイル配信設定をまだ書いていないので当然だ。静的ファイルの配信についてはまた次回以降書くから大丈夫。

Internal Server Error が出た場合

問題はこんなんが出たときだな。

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Django の設定ファイルの中に不備があると出る。こういう表示が出たときのエラーログは Apache のエラーログのほうに出ているから、 CentOS7 の中に入り、ログを見よう。

# 仮想マシンの中に入る。
$ vagrant ssh

# エラーログ表示。今回は試しに、 pymysql ライブラリがないのに設定ファイル内で import pymysql をしてみた。
$ sudo tail -f /var/log/httpd/error_log
(略)
略 [wsgi:error] 略   File "/vagrant/config/settings/for_production.py", line 1, in <module>, referer: http://localhost:9000/
略 [wsgi:error] 略     import pymysql, referer: http://localhost:9000/
略 [wsgi:error] 略 ModuleNotFoundError: No module named 'pymysql', referer: http://localhost:9000/

Server Error (500) が出た場合

本当に厄介なのがこれで、幾多の Django プレーヤーがこの画面に拳を叩きつけてきた。

Error 500

というのもエラーログが出ないんだよな。多分なんだけどこっちは、上の Internal Server Error と違って、設定には問題がないんだけどアプリケーション側……ページ表示のプログラムとかに不備があると出る。

この画面のエラーが握り潰しているのは DEBUG = False の設定だ。なので True にすれば何がおかしいのが出てくるぜ。

Displays 500 error

例えばこんなんがな。この画面は見やすくて嬉しいからずっと DEBUG = True にしておきたくなる。だけどなるべく本番環境と同じ環境で開発をしたいよねってことで False のまま進めようってのがこのシリーズの意図ね。

 

現在の状態

Django 配信状態

こんな感じだ。まだ静的ファイルとエラーについては何もしていない。

 

次回予告

次回は Apache 環境での静的ファイル配信を設定する。

# おつかれやんした git commit.

# 今回 .vagrant が増えたんで gitignore に追加しよう。
$ cat << __EOF__ >> .gitignore
.vagrant
__EOF__

$ git add --all
$ git commit -m "Vagrant と Apache で最低限動くとこまで"

 

現在のフォルダのようす

現在のフォルダのようす