Vagrant + CentOS8でLAMP環境を構築 – Part1 –

Vagrant + CentOS8でLAMP環境を構築 – Part1 –

今回は備忘録として、Web サービスの開発を行う上で必要になってくる開発環境の構築手順を書いていきます。

今までは XAMPP を使って開発を行っていたのですが、PC が故障して初期化された後に一からインストールして設定して~…という作業がかなり面倒だったので、これを機に仮想環境に LAMP 環境を構築しようと考えました。

また、一度開発環境を作っておけばそれを元に他の PC にも簡単にコピーできるようなので、そういった便利機能も試していこうと思います。

環境

  • 使用 OS:Windows10 64bit
  • Vagrant:2.2.10
  • VirtualBOX:6.1.14

準備するもの

Vagrant をダウンロード

公式サイトから 64bit 版の Vagrant をダウンロードしてきます。

ソフトを実行するとインストールが始まります。インストーラーの指示に従えば問題なく導入できるので詳しい手順は割愛します。

VirtualBOX をダウンロード

こちらも公式サイトから Windows 版の VirtualBOX をダウンロードします。

https://www.virtualbox.org/

同様にインストーラーを起動してインストールを進めていきます。

※バージョンは 6.1.14 となっています。

TeraTerm をダウンロード

PowerShell でも良いのですが、ターミナルは TeraTerm のほうが扱いやすいのでこちらもダウンロードして導入しておきます。

作業フォルダを作成

デスクトップに新しいフォルダを作成して、その中に開発環境を構築していきます。

今回は「vm」という名前のフォルダを作成しました。

導入から初期設定まで

PowerShell を起動して作成したフォルダへ移動します

cd Desktop\vm

インターネット上に公開されている bento/centos-8 を使用して Vagrant の雛形を作成します。

https://vagrantcloud.com/search

# フォルダ直下にVagrantfileが作成されます
vagrant init bento/centos-8

Vagrantfile を編集

作成された Vagrantfile を VS Code などで編集してきます。VS Code には Vagrant 用の拡張機能もあるので、導入しておくとファイルの編集がしやすいと思います。

https://marketplace.visualstudio.com/items?itemName=bbenoist.vagrant

Vagrantfile で以下の箇所を編集していきます。

# ネットワークアダプタの設定のコメントアウトを外す
# ここで指定したIPアドレスが、仮想マシンのネットワークインターフェースに設定される
# 仮想マシンにターミナルからログインする際は、このIPアドレスを指定する
config.vm.network "private_network", ip: "192.168.33.10"

# ~~~ 中略 ~~~~
# Windows側と後にインストールするCentOS側のディレクトリを共有する設定
# ここではまだコメントアウトしておく
# config.vm.synced_folder "/Users/[ユーザー名]/vm/project", "/var/www/html/app"

# ~~~ 中略 ~~~~
# CentOS側に割り当てるメモリなどを設定する
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 = "2048"
end

編集後、下記のコマンドを実行すると Vagrant の起動と CentOS のインストールが開始されます。 しばらく時間がかかるので気長に待ちます。

vagrant up

TeraTerm で SSH 接続

インストール後に TeraTerm でログインします。

Vagrantfile で設定した IP アドレスを指定します。ポート番号は 22 番のままで大丈夫です。

teraterm

ユーザー名とパスワードはどちらも Vagrant でログインできます。

Apache の導入

ここからは Apache のインストール、編集を行っていきます。

パッケージを更新する

CentOS8 から、パッケージ管理が yum の後継として dnf に変更されています。yum コマンドも使えるようですが、今回は dnf コマンドを使用していきます。オプションやサブコマンドは yum コマンドと同じもが使用できます。

まずはシステム全体のパッケージを更新しておきます。root 権限が必要になるので、root ユーザーに切り替えておきます。

# rootユーザーに切り替え
sudo -i

# パッケージを更新
dnf -y upgrade

各種ツールをインストール

# エディタをインストール
dnf -y install vim

# gitをインストール
dnf -y install git

# wegetコマンドをインストール
dnf -y install weget

# unzipコマンドをインストール
dnf -y install unzip

Apache のインストール

dnf コマンドで下記のパッケージをインストールします

  • httpd:Web サーバの本体
  • httpd-tools:httpd に関連するツール
  • httpd-devel:開発ツールやモジュールなど
  • httpd-manual:httpd のマニュアル
# 関連ソフトをインストール
dnf install -y httpd httpd-tools httpd-devel httpd-manual

# インストールされているか確認
dnf list --installed | grep httpd
~~~~
httpd.x86_64 2.4.37-21.module_el8.2.0+494+1df74eae @AppStream
httpd-devel.x86_64 2.4.37-21.module_el8.2.0+494+1df74eae @AppStream
httpd-filesystem.noarch 2.4.37-21.module_el8.2.0+494+1df74eae @AppStream
httpd-manual.noarch 2.4.37-21.module_el8.2.0+494+1df74eae @AppStream
httpd-tools.x86_64 2.4.37-21.module_el8.2.0+494+1df74eae @AppStream

# Apacheを起動する
systemctl start httpd

# 起動できたかステータスを確認
systemctl status httpd

ステータス確認のコマンドより、正常に起動できているか確認します。

● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
Active: active (running) since Fri 2020-10-02 23:34:01 UTC; 1min 43s ago
Docs: man:httpd.service(8)
Main PID: 8009 (httpd)
Status: "Running, listening on: port 80"
Tasks: 213 (limit: 5045)
Memory: 24.8M
CGroup: /system.slice/httpd.service
tq8009 /usr/sbin/httpd -DFOREGROUND
tq8010 /usr/sbin/httpd -DFOREGROUND
tq8011 /usr/sbin/httpd -DFOREGROUND
tq8012 /usr/sbin/httpd -DFOREGROUND
mq8013 /usr/sbin/httpd -DFOREGROUND

ここで、Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)となっていますが、サーバ起動時に Apach が自動起動しないので起動するようにコマンドを実行します。

systemctl enable httpd

httpd.conf のバックアップを作成

設定を間違えてしまった際にすぐ元の状態に戻せるように、設定ファイルのバックアップも作成しておきます。

# 設定ファイルをバックアップ
cp /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf_old

# バックアップが取れているか確認
ls /etc/httpd/conf | grep httpd
~~~~~
httpd.conf
httpd.conf_old

httpd.conf ファイルの編集

ServerName の変更

# 変更前
# ServerName www.example.com:80

# 変更後
www.shimanamisan.com:80

ここではサーバが自分自身のホスト名を示す時に使われる名前を指定します。これは、リダイレクトする URL を生成する際に使用されます。

例えば、Web サーバを動かしているマシンが web01.example.com で、DNS のエイリアスがwww.example.comである時に、Webサーバがwww.example.comとして認識されて欲しいときに設定します。

ServerName が指定されていないときは、IP アドレスに割り当てられているホスト名になります。今回は、www.shimanamisan.com:80と設定しました。

<Directory “/var/www/html”> 内にある Options の設定

Optiions の Indexes の記述を削除します。

# Further relax access to the default document root:
<Directory "/var/www/html">
#
# Possible values for the Options directive are "None", "All",
# or any combination of:
# Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
#
# Note that "MultiViews" must be named *explicitly* --- "Options All"
# doesn't give it to you.
#
# The Options directive is both complicated and important. Please see
# http://httpd.apache.org/docs/2.4/mod/core.html#options
# for more information.
#
Options Indexes FollowSymLinks <--★Indexesの記述を消す

この Options で設定されている Indexes ですが、DirectoryIndex で指定したファイルを返し、なければディレクトリを表示する設定になります。ファイルが無かった場合にディレクトリがユーザーの画面に表示されてしまうのは、セキュリティ上望ましくないので設定を削除しておきます。

PHP のインストール

Apache の導入が完了したので、ここからは PHP をインストールしていきます。

EPEL リポジトリの追加

EPEL は、Extra Packages for Enterprise Linux の略で、 Red Hat Enterprise Linux(RHEL)向けの追加パッケージを提供するリポジトリです。Fedora プロジェクトによって提供されているようです。

リポジトリとは貯蔵庫という意味で、システムを構成するためのデータやプログラムの情報が集約されたデータベースのことを指します。

dnf -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm

Remi リポジトリの追加

Remi リポジトリとは、Linux リポジトリで提供していないパッケージを提供している、拡張パッケージのことです。Remi リポジトリを導入するには、EPEL リポジトリが必須です。

http://rpms.remirepo.net/

dnf -y install https://rpms.remirepo.net/enterprise/remi-release-8.rpm

最新の PHP7.4 をインストールする

# デフォルト以外のphpバージョンをインストールしたかったのでdisableにする
dnf module disable php

# 最新のPHP7.4をインストール
dnf module install -y php:remi-7.4

# 上記のphpパッケージにないものをまとめてインストール
dnf install -y php-mysqlnd php-xmlrpc php-pear php-gd php-pdo php-intl php-mysql php-mbstring

インストールされたパッケージと、PHP のバージョンを確認

# パッケージが正しくインストールされているか確認
dnf list installed | grep php

# PHPのバージョンの確認
php -v
PHP 7.4.11 (cli) (built: Sep 29 2020 10:17:06) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies

php.ini の編集

コメントアウトされている行を解除していくのも面倒ですので、以下の内容をファイルに追記する形にします。

以下のコマンドを実行することで、php.ini ファイルの末尾に追記されます。

cat >> /etc/php.ini << "EOF"
date.timezone = Asia/Tokyo
mbstring.language = Japanese
mbstring.internal_encoding = UTF-8
mbstring.http_input = UTF-8
mbstring.http_output = pass
mbstring.encoding_translation = On
mbstring.detect_order = auto
mbstring.substitute_character = none
upload_max_filesize = 128M
post_max_size = 128M
EOF

php-fpm の編集

この fpm(FastCGI Process Manager)とは、PHP の FastCGI 実装のひとつで、主に高負荷のサイトで有用な追加機能を用意されています。

https://www.php.net/manual/ja/install.fpm.php

設定内容は下記の記事を参考に設定しました。主にパフォーマンスに関する設定になるので、開発環境ではどの程度恩恵があるのかわかりませんが念の為設定しておきます。

vim /etc/php-fpm.d/www.conf

# コメントアウトしているのがデフォルトの設定値で、下が変更後の設定値
# pm.max_children = 50
pm.max_children = 25

# pm.start_servers = 5
pm.start_servers = 10

# pm.min_spare_servers = 5
pm.min_spare_servers = 10

# pm.max_spare_servers = 35
pm.max_spare_servers = 20

# listen.acl_users = apache,nginx
;listen.acl_users = apache,nginx <--★ここの箇所はコメントアウトします(セミコロンなので注意!)

php.iniの時と同様に、下記の内容をファイルの末尾に追記します。

cat >> /etc/php-fpm.d/www.conf << "EOF"
listen.owner = apache
listen.group = apache
listen.mode = 0660
pm.max_requests = 500
EOF

設定ファイルを編集後、httpd と php-fpm を再起動しておきます。

systemctl restart httpd
# warningなど出力されていないか確認
systemctl status httpd

# php-fpmの起動
systemctl start php-fpm
systemctl enable php-fpm

# warningなど出力されていないか確認
systemctl status php-fpm

index.php ファイルを作成し、正しく動作しているか確認する

vim コマンドで、/var/www/html ディレクトリ配下に、index.php ファイルを作成します。

vim /var/www/html/index.php

<?php

phpinfo();

?>

ブラウザのアドレスバーに自分の IP アドレスを打ち込み、正常に表示されるか確認します。IP アドレスは Vagrant ファイルの編集時に設定した値です。

このような画面が表示されれば設定は完了です。

phpinfo

今回は以上です。お疲れさまでした!