Windows + Vagrant + Django で環境構築

Python で Webアプリを作ってみたかったので、
とりあえず Python の Webフレームワークである Django を使えるようにしました。
開発などにしか使わないであろう MySQL とかをホストマシンに置いておくのもあれなので
Vagrant と VirtualBox で仮想マシンを用意してそこに環境を作ります。

環境構築自体がおもしろい作業でもない上に、
いろいろなところでつまずいてしまったのでかなりだらだらと時間をかけてしまい記憶も若干あいまいになっているので
一度整理する意味でもまとめておきます。

基本的には、
Python3.4 + Djangoで作るWebアプリケーション(Part.1 環境構築編)
を参考にしました。
大体こちらで紹介されている方法と同じことをしているのですが、
自分がやっていてつまずいたり、別の方法を用いたところもあるので。

環境

ホストマシン Windows 10 Home
仮想マシン管理 VirtualBox 5.1 + Vagrant 1.9.7
仮想マシンOS CentOS 7.4.1708
Python 3.6.3
フレームワーク Django 2.0
データベース MariaDB 10.2.12 + MySQL 15.1
Webサーバー nginx 1.13.8

ホストマシンが Windows なだけでほとんど参考と同じです。
基本的に何も考えずにその時の最新バージョンをインストールしているはずです。

仮想マシン構築

今回は VirtualBox と Vagrant はすでにインストール済みだったので仮想マシンを作成するところか始めます。

まず環境構築用のディレクトリに vagrantfile を作ります。

% vagrant init

次に CentOS の Box をダウンロードしてきます。

% vagrant box add centos70 https://github.com/holms/vagrant-centos7-box/releases/download/7.1.1503.001/CentOS-7.1.1503-x86_64-netboot.box

作成される vagrantfile を編集します

	~~
   config.vm.box = "centos70"
	~~
   config.vm.network "private_network", ip: "192.168.33.15"

それぞれ 15 行目あたりと 35 行目あたりです。
もともとどう書いてあったか忘れてしまったのですが、
コメントアウトしているのを解除するか、ちょっと値を変更するかだったと思います。

変更箇所の 2 つ目はネットワークの設定で
private_network とは、仮想マシンはホストマシンとの間のみで有効なネットワーク設定です。

vagrant up で仮想マシンを起動します。

% vagrant up

Python3 をインストール

今回の CentOS7 にはデフォルトで Python2.7 がインストールされていますが、
折角なので最新版をインストールします。

Vagrant で作成した仮想マシンに Python などのプログラムをインストールするには
vagrant ssh コマンドで仮想マシンの内部を操作します。

% vagrant ssh

SSH モードだとコマンドラインのディレクトリの個所が [vagrant@localhost /] になります。

最新の Python をインストールしたいので、Python のホームページで最新版をチェックします。
今回は 3.6.3 でした。
参考通り src ディレクトリに最新版をダウンロードして解凍、インストールします。

[vagrant@localhost ~]$ cd /usr/local/src
[vagrant@localhost src]$ sudo wget https://www.python.org/ftp/python/3.6.3/Python-3.6.3.tgz
[vagrant@localhost src]$ sudo tar xzvf Python-3.6.3.tgz

[vagrant@localhost src]$ cd Python-3.6.3
[vagrant@localhost Python-3.6.3]$ sudo ./configure
[vagrant@localhost Python-3.6.3]$ sudo make
[vagrant@localhost Python-3.6.3]$ sudo make altinstall

ただ、このままだとコマンドで実行することができないので PATH を通します。
本当は python コマンドで PATH を通したいのですが、
python はすでにデフォルトの Python2.7 で使用済みになっているので python3 で PATH を通します。

[vagrant@localhost Python-3.6.3]$ sudo ln -s /usr/local/bin/python3.6 /usr/bin/python3

一度、どうしても python コマンドで最新版を PATH を通したく、
Python2.7 のほうを python2 にして、最新版に python コマンドを割り当てたのですが、
後々出てくる yum コマンドで python コマンドで 2.7 の方を呼び出さないといけない箇所があるらしく先に進めませんでした。

そのままだと Python のパッケージマネージャーの pip にも PATH が通っていないので、
pip コマンドで Python3 の pip を実行できるようにします。

[vagrant@localhost Python-3.6.3]$ sudo ln -s /usr/local/bin/pip3.6  /usr/bin/pip

virtualenv で仮想実行環境を構築

参考だと pyvenv で仮想実行環境を構築していますが、
今回、どうしても pyvenv の作成の段階でエラーが出てしまったいました。

いろいろと調べてみたところ、
どうやらローカルマシンと仮想マシンで共有している vagrant ディレクトリ内で
Linux コマンドが実行されているのが原因っぽいです。
vagrant環境でtoxしたらハマった件

Vagrant を終了して、Windows 環境から pyvenv の作成をすると成功することからもそういうことっぽいです。
( pyvenv は Windows 用や Linux 用があるようで、Windows 環境で作成した pyvenv は Vagarant からでは使ええませんでした。)

そういうわけで今回は上のリンク先でも紹介されている、virtualenv の -allways-copy オプションで行います。
pyvenv は Python3 系にデフォルトでインストールされていますが、
virtualenv はされていないので pip でインストールします。

[vagrant@localhost ~]$ sudo pip install virtualenv

vagrant ディレクトリ内に実行環境を構築します。

[vagrant@localhost ~]$ virtualenv --always-copy env

環境の開始には pyvenv と同じく bin/activvate を実行します。

[vagrant@localhost ~]$ source env/bin/activate

MariaDB のインストール

続いて MAriaDB をインストールします。
Django はデフォルトで SQLite を使うように設定されていますが、折角 web アプリを作るならサーバーに置いたりしたいので。

参考通りにインストールします。

[vagrant@localhost ~]$ sudo yum install -y mariadb-server mariadb-devel

インストール後バージョンを確認してみると、
参考通りにやったはずなのになぜか MariaDB が 5.5 でした。

[vagrant@localhost ~]$ mysql --version
mysql  Ver 15.1 Distrib 5.5.56-MariaDB, for Linux (x86_64) using readline 5.1

どこで間違えてしまったかわかりませんが、仕方ないので MariaDB をアップデートします。
yumでmysql(maria DB)を最新安定バージョンにアップデートする(Cent OS7)

repository generator でインストール情報の書かれたリポジトリ情報を作成します。
使用している OS やインストールしたバージョンを選ぶと出てくるテキストを指定のディレクトリに保存します。
今回は CentOS 7 (x86_64) の 10.2 [Stable] を選んだので、
/etc/yum.repos.d/ ディレクトリに MariaDB.repo ファイルを作成します。

[vagrant@localhost ~]$ sudo vi /etc/yum.repos.d/MariaDB.repo
# MariaDB 10.2 CentOS repository list - created 2018-01-17 15:22 UTC
# http://downloads.mariadb.org/mariadb/repositories/
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.2/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

以上の内容の

MariaDB のアップデートのためには一度接続を停止(?)させる必要があるのですが、
参考通りに systemctl status mariadb で実行させようとするとパスワードがわからなく停止できなかったが、
単純に sudo をつけてやれば OK でした。

[vagrant@localhost ~]$ sudo systemctl stop mariadb
[vagrant@localhost ~]$ systemctl status mariadb
● mariadb.service - MariaDB database server
   Loaded: loaded (/usr/lib/systemd/system/mariadb.service; enabled; vendor preset: disabled)
   Active: inactive (dead) since Wed 2018-01-17 14:43:40 UTC; 8s ago
-------------

接続を停止させたら yum コマンドからアップデートします。
MariaDB アップデートの参考ページでは MariaDB-server と MariaDB-client を指定していますが、
Django セットアップの方では mariadb-server と mariadb-devel を指定していたので、
インストールのほうでもそうしたように Django セットアップのほうを指定してアップデートしました。

sudo yum update mariadb-server mariadb-devel

アップデート終了後 MariaDB のバージョンを確認します。

[vagrant@localhost ~]$ mysql --version
mysql  Ver 15.1 Distrib 10.2.12-MariaDB, for Linux (x86_64) using readline 5.1

しっかりアップデートできています。

接続をつなぎなおして MariaDB のアップデートは完了です。

[vagrant@localhost ~]$ sudo systemctl start mariadb
[vagrant@localhost ~]$ systemctl status mariadb
● mariadb.service - MariaDB 10.2.12 database server
   Loaded: loaded (/usr/lib/systemd/system/mariadb.service; disabled; vendor preset: disabled)
  Drop-In: /etc/systemd/system/mariadb.service.d
           └─migrated-from-my.cnf-settings.conf
   Active: active (running) since Wed 2018-01-17 15:03:03 UTC; 7s ago
-------------

nginxをインストール

続いて web サーバーとして nginx をンストールします。
以降は大体参考の方法と同じになります。

まずインストール用にリポジトリを作成します。
MariaDB のアップデートの時もリポジトリを作成しましたが、
どうやらリポジトリを用意しておくとインストールの際にそこに書かれたようにやってくれるようです?
/etc/yum.repos.d/ ディレクトリに nginx.repo というファイル名で作成します。

[vagrant@localhost ~]$ sudo vi /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=0
enabled=1

リポジトリを作成したら yum コマンドでインストールします。

[vagrant@localhost ~]$ sudo yum install -y nginx

インストールが完了したら nginx を起動させます。

[vagrant@localhost ~]$ sudo systemctl start nginx.service
[vagrant@localhost ~]$ sudo systemctl enable nginx.service

接続するには firewalld を停止させなくてはいけないようなので停止させます。
(正直よくわからないのですが、フィルタ機能が全停止するので注意が必要なようです。)

[vagrant@localhost ~]$ sudo systemctl stop firewalld
[vagrant@localhost ~]$ sudo systemctl disable fireawalld

戻すときは systemctl start/enable firewalld で OK です。

vagrantfile で設定した IPアドレスで nginx に接続できます。
http://192.168.33.15/

uWSGIをインストール

Pyhon(Django?) と nginx を連動させるために uWSGI をインストールします。
これまでは Python とは関係なく Vagrant の仮想マシンにインストールしていたのですが、
ここからは Python のアプリケーションになるので virtualenv を起動した状態でインストールを行います。
Python のアプリケーションなのでインストールには pip を使います。

(env) [vagrant@localhost ~]$ pip install uwsgi

Django をインストール

最後に Django をインストールします。
Django も pip でインストールします。

(env) [vagrant@localhost ~]$ pip install django

これで環境構築は以上です。
ただ、今回そろえた環境を使用するために Django の設定が必要になってくるので、
そちらはまた別に書きます。