[CentOS7]Vagrantでローカルweb開発環境構築(vagrant + CentOS7 + PHP7.2 + Apache2.4 + MySQL5.6 + phpMyAdmin4.9)

開発環境

前提と、これから構築する環境

フリーランスのウェブ屋にとって、開発環境をどう用意するかは悩みどころでしょう。
古くから人気のXXAMP系(WAMPやMAMPなど)はまだ息をしてるのかどうか知らないですけど、やはり今はDockerかVagrantか、って感じなんじゃないかと思うわけです。
というわけで、以前にVagrantでLAMP環境を構築した時のメモを記事に起こしてみました。
ぶっちゃけ自分用なので雑な説明ですが、誰かの参考になるかも知れないのでチョコチョコと追記しています。
丁寧に説明してほしい部分がありましたらコメントでお知らせください。できるだけ対応します。

ちなみに

大切なポイントとして、開発環境のhttps化は当然やらなきゃならんことです。
これに関しては別記事でやっていこうと思います。

前提

  • 基本的なLinuxコマンドは使えるって人が対象です。
  • 今回はCentOSなので、debian系(ubuntuとか)とかとは細かい点がいろいろ違うかも
  • Virtual BoxとVagrantのインストールはそれぞれのホストマシンのOSに応じて済ませておいてください。

事前準備

私の環境

  • MacOS Mojave 10.14.6
  • Virtual Box 6.0.10
  • Vagrant 2.2.5
  • Vagrantプラグイン
    • vagrant-hostsupdater (1.1.1.160)
    • vagrant-vbguest (0.19.0)

インストールする予定のアプリケーション

  • CentOS 7.2
  • PHP 7.2
  • MySQL 5.7
  • Apache 2.4
  • phpMyAdmin

ついでに

  • Git
  • OpenSSL
  • Node.js

CentOS7.2を立ち上げる

開発用のフォルダ(dev)を作り、ここで作業する

$ mkdir dev
$ cd dev

CentOS7.2のvagrant box(このあたりかな) を追加して、初期化を行う。
vagrant boxを置いているディレクトリはいくつかあるので、適当なものが見つかるまで探してみましょう。

# 下記の"centos72" は、自分で適当な名前を決めたもの。boxの名前はその後のurlを見ればわかるが"centos-7.2"です。
$ vagrant box add vagrant box add centos72 https://app.vagrantup.com/bento/boxes/centos-7.2

# vagrant初期化。
$ vagrant init centos72

カレントディレクトリにVagrantfileが生成されているはずです。


Vagrantfileを編集して仮想マシンを立ち上げる

下記二行をアンコメント

config.vm.network "forwarded_port", guest: 80, host: 8080
config.vm.network "private_network", ip: "192.168.33.10"

で、vagrantを立ち上げる

$ vagrant up

初回は結構時間がかかる。

ここでエラー!!

(前略)

    default: Guest Additions Version: 4.3.30
    default: VirtualBox Version: 6.0

(中略)

==> default: Mounting shared folders...
    default: /vagrant => /Users/yngdrsk/vagrant/dev
    Vagrant was unable to mount VirtualBox shared folders. This is usually
    because the filesystem "vboxsf" is not available. This filesystem is
    made available via the VirtualBox Guest Additions and kernel module.
    Please verify that these guest additions are properly installed in the
    guest. This is not a bug in Vagrant and is usually caused by a faulty
    Vagrant box. For context, the command attempted was:

    mount -t vboxsf -o uid=1000,gid=1000 vagrant /vagrant

    The error output from the command was:

    /sbin/mount.vboxsf: mounting failed with the error: No such device

(後略)

おそらくGuest AdditionとVirtualBoxのバージョンが合わないということか。

参照: VagrantとVirtualBoxを使っててupしたときGuest Additions Version が違うと表示されるときの対応

今回は既にvagrant-vbguestを入れていたのでvagrant reloadしたら自動的に調整してくれたみたい。

[default] GuestAdditions 6.0.10 running --- OK.

OK!!仮想マシンが立ち上がったので、ログインする。

$ vagrant ssh

CentOS上で最初にやっておくこと

# なにはともあれ yum update
$ sudo yum -y update

# ソースビルド用のパッケージをいくつか(一応ね) ※ここでついでにopensslも入れておく
$ sudo yum -y install curl-devel expat-devel gettext-devel openssl-devel perl-devel zlib-devel autoconf asciidoc xmlto docbook2X make gcc
$ sudo ln -s /usr/bin/db2x_docbook2texi /usr/bin/docbook2x-texi

# ローカル環境なのでファイアーウォールを切る
$ sudo systemctl stop firewalld
$ sudo systemctl disable firewalld

さて、これでゲストOSはOKでしょう。


LAMP環境を整備


Apache 2.4のインストール

まずは利用可能なパッケージを確認

$ sudo yum info httpd
利用可能なパッケージ
名前              : httpd
アーキテクチャー    : x86_64
バージョン         : 2.4.6
リリース           : 90.el7.centos
容量              : 2.7 M
リポジトリー       : base/7/x86_64
要約              : Apache HTTP Server
URL              : http://httpd.apache.org/
ライセンス         : ASL 2.0
説明              : The Apache HTTP Server is a powerful, efficient, and extensible
                 : web server.

これで良いのでそのままインストール

$ sudo yum -y install httpd
$ httpd -v
Server version: Apache/2.4.6 (CentOS)
Server built:   Aug  8 2019 11:41:18

vagrantを立ち上げた時に自動起動するよう設定

$ sudo systemctl enable httpd.service

開発用フォルダとホストマシンの同期設定

さて、開発するにあたり、ホストマシン(自分のパソコン、私ならMacOS)でエディターでゴリゴリ書いたコードをFTPなどでゲストマシン(今作ってるサーバー)にアップロードするなんてことはやってられないわけです。
Vim使いの方ならゲストマシンで直接開発しちゃえばいいのかもしれませんが、統合開発環境を使ってたり、私のようにMacのVisual Studio CodeとかSublime Textとかでホストマシン側でコーディングしてる人間としては自動的にホストマシン側とゲストマシン側で自動的に同期してほしいわけ。
なので、それを設定していきます。

まずは、Apacheをインストールしたことで/var/www/html が生成されていることを確認

$ ls -la /var/www
合計 4
drwxr-xr-x   4 root root   31  2月 13 09:53 .
drwxr-xr-x. 20 root root 4096  2月 13 09:53 ..
drwxr-xr-x   2 root root    6  8月  8  2019 cgi-bin
drwxr-xr-x   2 root root    6  8月  8  2019 html

一旦ゲストマシンから出る

$ exit

ホストマシンの作業フォルダ(./dev/)の中にhtmlフォルダを作る

ホストマシン側 ~/vagrant/dev/html <- このフォルダ

finderで作りゃいいんですが、ターミナル上で作るなら、/dev/にいる状態で

$ mkdir html

Vagrantfileを編集

# config.vm.synced_folder "../data", "/vagrant_data"

のところを

  config.vm.synced_folder "./html", "/var/www/html",
    owner: 'apache',
    group: 'apache',
    create: true,
    mount_options: ['dmode=777', 'fmode=755']

※ここでついでにメモリも多めに確保したりするもをかし

(下記部分をアンコメントして1024を4096に増やす)

  config.vm.provider "virtualbox" do |vb|
  #   # Display the VirtualBox GUI when booting the machine
  #   vb.gui = true
  #
  #   # Customize the amount of memory on the VM:
    vb.memory = "4096"
  end

仮想マシンを再起動。

なんかファイル作ってホストマシン側のhtmlフォルダに放り込む。

仮想マシンに入って確認

$ vagrant ssh
$ ll /var/www/html

ホストマシン側でhtmlフォルダに入れたファイルが表示されていたらOK!!

【注意】この作業をする前にゲストマシン側の/var/www/htmlフォルダの中にあるデータは全てクリアされます。
つまり、ホストマシンで今まさに作ったhtmlフォルダ(空っぽ)の内容に同期されてしまう、ということです。
なので、この作業はApacheをインストールしたらその直後に行うが吉。


MySQLのインストール

*少なくともWordpressを運用する上で、MariaDBを使っても全く問題ないです。MySQLを使うのと全く違いがありません。ただ、今回はMySQLを使います。

まずはmariaDBをフォルダごと削除

$ sudo yum -y remove mariadb*

または 

$ sudo yum -y remove mariadb-libs.x86_64

リポジトリを追加してMySQL5.7のインストール

リポジトリを追加
$ yum -y install http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm

インストール
$ sudo yum -y install mysql-community-server

確認
$ mysqld --version
mysqld  Ver 5.7.29 for Linux on x86_64 (MySQL Community Server (GPL))

自動起動設定
$ sudo systemctl enable mysqld.service

とりあえず起動
$ sudo systemctl start mysqld.service

ルートパスワード変更

※ パスワードのルール [ 8文字以上かつ英大文字・小文字・数字・記号が混在 ]

$ sudo cat /var/log/mysqld.log | grep root
2020-02-13T10:23:38.748535Z 1 [Note] A temporary password is generated for root@localhost: XXXXXXXXXX <=ここに表示

パスワードがターミナルに見えているうちに、またはテキストファイルとかにコピペしておいて

$ mysql_secure_installation

で一括設定。

エラー発生 - ソケットエラー

$ mysql_secure_installation
Securing the MySQL server deployment.

Enter password for user root: 
Error: Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)

よくあるソケットエラー。

MySQLを再起動したら/var/lib/mysql/mysql.sock が自動的に生成されるようなので再起動。

$ sudo systemctl restart mysqld.service

解決したので再度 mysql_secure_installation を実行。パスワード再設定。

※手動で作る場合

$ sudo touch /var/lib/mysql/mysql.sock
$ sudo chown mysql:mysql /var/lib/mysql/mysql.sock

新パスワードでログインして確認

$ mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 5.7.29 MySQL Community Server (GPL)

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> exit

詳しい設定は後回しにするとして、文字コードのセットだけしておく

$ sudo vi /etc/my.cnf
character_set_server=utf8
skip-character-set-client-handshake

mysqlを再起動してログイン、

mysql> show variables like 'char%'

で確認。


PHPのインストール

リポジトリの追加

$ sudo yum -y install epel-release
$ sudo rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm

パッケージの確認

$ sudo yum search --enablerepo=remi,remi-php72 php

ずらずら〜〜っと一覧が出る

インストール前確認

一応、必要なパッケージの確認

$ sudo yum info --enablerepo=remi,remi-php72 php php-mbstring php-xml php-xmlrpc php-gd php-pdo php-pecl-mcrypt php-mysqlnd php-pecl-mysql

こんな感じでリストされる

利用可能なパッケージ
名前                : php
アーキテクチャー    : x86_64
バージョン          : 7.2.27
リリース            : 1.el7.remi
容量                : 3.2 M
リポジトリー        : remi-php72
要約                : PHP scripting language for creating dynamic web sites
URL                 : http://www.php.net/
ライセンス          : PHP and Zend and BSD and MIT and ASL 1.0 and NCSA
説明                : PHP is an HTML-embedded scripting language. PHP attempts to make it
                    : easy for developers to write dynamically generated web pages. PHP also
                    : offers built-in database integration for several commercial and
                    : non-commercial database management systems, so writing a
                    : database-enabled webpage with PHP is fairly simple. The most common
                    : use of PHP coding is probably as a replacement for CGI scripts.
                    : 
                    : The php package contains the module (often referred to as mod_php)
                    : which adds support for the PHP language to Apache HTTP Server.

ここで、リポジトリー欄にremi-php72とremi-safeが混在していると後々厄介なことになるので注意。

その場合はremi-safeになっているものだけ別途remi-72リポジトリの正確な名前を入力してやり直すがよし。

では、インストール実行

$ sudo yum -y install --enablerepo=remi,remi-php72 php php-mbstring php-xml php-xmlrpc php-gd php-pdo php-pecl-mcrypt php-mysqlnd php-pecl-mysql

確認

$ php -v
PHP 7.2.27 (cli) (built: Jan 22 2020 09:31:55) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies

パッケージの確認

$ sudo yum list installed | grep php
php.x86_64                           7.2.27-1.el7.remi               @remi-php72
php-cli.x86_64                       7.2.27-1.el7.remi               @remi-php72
php-common.x86_64                    7.2.27-1.el7.remi               @remi-php72
php-gd.x86_64                        7.2.27-1.el7.remi               @remi-php72
php-json.x86_64                      7.2.27-1.el7.remi               @remi-php72
php-mbstring.x86_64                  7.2.27-1.el7.remi               @remi-php72
php-mysqlnd.x86_64                   7.2.27-1.el7.remi               @remi-php72
php-pdo.x86_64                       7.2.27-1.el7.remi               @remi-php72
php-pecl-mcrypt.x86_64               1.0.3-1.el7.remi.7.2            @remi-php72
php-pecl-mysql.x86_64                1.0.0-0.17.20160812git230a828.el7.remi.7.2
                                                                     @remi-php72
php-xml.x86_64                       7.2.27-1.el7.remi               @remi-php72
php-xmlrpc.x86_64                    7.2.27-1.el7.remi               @remi-php72

この一番右の欄がどのリポジトリがら取ってきたか。remi-safe混在に注意。

参考:CentOS7 PHP7.2でmysqli拡張を有効化できない


PHPの設定

php.iniの元ファイルをリネームして退避

$ cp -p /etc/php.ini /etc/php.ini.org

php.iniの編集

$ sudo vi /etc/php.ini

変更内容は割愛

apache再起動

ホストネームを設定する。

http://192.168.33.10 ではなく、http://vagrant.test でアクセスできるようにしてやる。

一旦仮想マシンから出てVagrantfileを編集。

ファイル最後部の end の上に以下を追記

  config.vm.hostname = "vagrant.test"
  config.hostsupdater.aliases = ["www.vagrant.test"]

仮想マシンを再起動

これらでアクセスできることを確認

phpinfoの確認

ホストマシンからでいいのでphpinfo()を見る為のファイルを作って放り込む

<?php
    phpinfo();
?>

これをホストマシンの/vagrant/html/info.php として保存。

ブラウザで http://vagrant.test/info.php にアクセスしてphpinfoが表示されたらOK!!


以上でLAMP環境の構築はひと段落。

その他諸々必要なものを入れる。


phpMyAdminのインストール

$ sudo yum -y --enablerepo=remi-php72 --enablerepo=remi install phpMyAdmin

# 設定ファイルを編集
$ sudo vi /etc/httpd/conf.d/phpMyAdmin.conf

# 以下の二行を追記

Alias /phpMyAdmin /usr/share/phpMyAdmin
Alias /phpmyadmin /usr/share/phpMyAdmin

< Directory /usr/share/phpMyAdmin/>
AddDefaultCharset UTF-8
AllowOverride all   # 追加!
Require all granted # 追加!

# 保存して終了

これで http://vagrant.test/phpMyAdminでアクセスできる。


その他ついでのアプリケーションをインストール

Gitのインストール

yumだとバージョンが古いので、面倒だけど最新版を。
ここで最新バージョンを調べ、tar.gzのリンクをコピーする。
Releases · git/git

ビルド用にフォルダを作り、その中に移動して作業する。

# tarballをダウンロード
$ wget https://github.com/git/git/archive/v2.25.0.tar.gz

# 解凍
$ tar -zxf v2.25.0.tar.gz

# git-2.25.0というフォルダができているので移動。
$ cd git-2.25.0

# ビルドしてインストール
$ make configure
$ ./configure --prefix=/usr
$ make all doc info
$ sudo make install install-doc install-html install-info

# 作ったgit作業用フォルダを削除
$ rm -rf hogehoge

$ git --version
git version 2.25.0

最新版!

yumだと 1.8だった。


時刻の同期設定

CentOS7よりntpdではなくchronydが標準となったらしい

が、馴染みのntpを入れてしまう。

$ sudo yum -y install ntp

$ sudo ntpdate ntp.nict.jp
13 Feb 13:37:35 ntpdate[13015]: adjust time server 133.243.238.243 offset 0.057489 sec

設定ファイルをいじる

$ sudo vi /etc/ntp.conf

このファイル中の
server 0.centos.pool.ntp.org
server 1.centos.pool.ntp.org
server 2.centos.pool.ntp.org

この部分をコメントアウトして以下を追記
server -4 ntp.nict.jp
server -4 ntp1.jst.mfeed.ad.jp
server -4 ntp2.jst.mfeed.ad.jp
server -4 ntp3.jst.mfeed.ad.jp

保存して再起動

$ sudo systemctl restart ntpd

状態を確認

$ ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
 ntp-b2.nict.go. .NICT.           1 u    9   64    1   17.647  -26.025   0.001
 ntp1.jst.mfeed. 133.243.236.17   2 u    8   64    1   25.960  -22.049   0.001
 ntp2.jst.mfeed. 133.243.236.18   2 u    7   64    1   17.602  -23.777   0.001
 ntp3.jst.mfeed. 133.243.236.19   2 u    6   64    1   25.214  -22.682   0.001

node.jsのインストール

いるかどうか分からんけど一応。

まず、リポジトリを追加

$ sudo su  #普通にsudoでやっても許可がありませんと出たため
# curl -sL https://rpm.nodesource.com/setup_10.x | bash -
一旦exitして
# exit
$ sudo yum install -y nodejs

確認

$ node -v
v10.19.0
$ npm -v
6.13.4

npmをアップデート

$ sudo npm update -g

$ npm -v
6.13.7

LAMP環境を構築した仮想マシンをboxファイルにする

以下を参考に、今回作った環境をboxにしておけば後々捗ります。

参考:vagrant環境のboxをバックアップする方法


ということで、今回はここまで。

あと、諸々必要なこととしましては、

  • https化。オレオレ証明書で。
  • apacheにvirtualhostを設定して、hoge.vagrant.testやfuga.vagrant.testで分けて開発できるようにする。

とここらあたりはまた記事にしようと思います。
あと、自分の勉強用として、以下もやっていこうと思ってます。

  • Virtual Box + vagrant + Docker で開発環境構築(Docker触ったことないの)
  • ubuntu 使ってみる(Debian系使ったことないの)

ではでは!