DockerでのLAMP環境構築手順(Amazon Linux 2/PHP8.1(Laravel9)) ⑧Apache の設定ファイルの追加(全8回)

# はじめに

かくかくしかじかで、Docker で Amazon Linux 2 ベースの LAMP 環境を構築する機会がありましたので、手順についてアウトプットします。
![スクリーンショット 2022-11-30 23.31.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527226/930bcd24-38e9-316e-bebd-cef83aea5924.png)

手順は全 8 回です。

[① 作成する環境の確認](https://qiita.com/ryamate/items/47183e1ffd4843ef18fa)
[② Apache の導入](https://qiita.com/ryamate/items/e5ca19aece61717b6a01)
[③ PHP 8.1 系のインストール](https://qiita.com/ryamate/items/7a38eb11d64d504a7a22)
[④ Composer のインストール](https://qiita.com/ryamate/items/a8bbd003c6c2abceedc9)
[⑤ timezone, locale の設定](https://qiita.com/ryamate/items/d148bcdbdb27c5b80ad8)
[⑥ docker-compose.yml の作成 & MySQL の導入](https://qiita.com/ryamate/items/ac52b152757141f443e3)
[⑦ Laravel 9 系のインストール](https://qiita.com/ryamate/items/79875e22906cfb51af67)
**⑧ Apache の設定ファイルの追加**

最終回の今回は、 **⑧ Apache の設定ファイルの追加** についてです。

## 環境

以下の Docker 環境を構築します。

- Amazon Linux 2
- Apache 2.4
- MySQL 8.0.28
- PHP 8.1.x
- Laravel 9.x

## 目次

[1. Apache の設定ファイルの作成・編集](#1-apache-の設定ファイルの作成編集)
　[1-1. mod_rewrite モジュールの有効化](#1-1-mod_rewrite-モジュールの有効化)
　[1-2. VirtualHost の設定（DocumentRoot など）](#1-2-virtualhost-の設定documentroot-など)
[2. Apache の設定ファイルについての追記](#2-apache-の設定ファイルについての追記)
[3. Docker イメージとコンテナの再作成](#3-docker-イメージとコンテナの再作成)
[4. ブラウザの確認](#4-ブラウザの確認)

# 1. Apache の設定ファイルの作成・編集

Apache の mod_rewrite モジュールの有効化、VirtualHost の設定（DocumentRoot など）をする設定ファイルを作成・編集します。

## 1-1. mod_rewrite モジュールの有効化

Laravelのルーティングを機能させるため、 Apache の mod_rewrite モジュールを有効化する必要があります。
**infra/docker/apache/rewrite.conf** を作成・編集します。

```conf:infra/docker/apache/rewrite.conf
LoadModule rewrite_module modules/mod_rewrite.so
```

https://httpd.apache.org/docs/current/mod/mod_rewrite.html

ちなみに、 Amazon Linux 2 をベースイメージにしていることが関係していると思いますが、 `a2enmod rewrite` コマンドを Dockerfile に記述する方法では、mod_rewrite モジュールを有効化できませんでした。

> `a2enmod rewrite` はApacheの[mod_rewrite](http://httpd.apache.org/docs/current/mod/mod_rewrite.html)モジュールを有効化してます。
> 
> 
> これがないとLaravelのルーティングがうまく機能しなくなります。
> 

https://qiita.com/ucan-lab/items/38cd04cee1f3f9e024b9

`a2enmod rewrite` は、 Debian 系ディストリビューションの場合の方法であり、 Red Hat 系（RHEL7 / CentOS7）をベースとしていると言われている Amazon Linux 2）については、 `LoadModule rewrite_module modules/mod_rewrite.so` を記述する方法で設定できるようです。

## 1-2. VirtualHost の設定（DocumentRoot など）

VirtualHost の DocumentRoot などを設定します。
**infra/docker/apache** ディレクトリに、 **vhost.conf** を作成して、編集します。

```conf:infra/docker/apache/vhost.conf
<VirtualHost *:80>
    ServerName example.com
    ServerAdmin webmaster@localhost
    DocumentRoot /work/backend/public

    ErrorLog logs/error.log
    CustomLog logs/access.log combined

    <Directory /work/backend/public>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>
```

`DocumentRoot` を `/work/backend/public` にすることで、 **public** ディレクトリ以下の **index.php** にアクセスされるようにします。

以下の ****infra/docker/apache/httpd.conf**** を参考にさせていただきました。

https://github.com/ucan-lab/docker-laravel-apache

# 2. Apache の設定ファイルについての追記

**infra/docker/php** ディレクトリの **Dockerfile** を編集します。

```docker:infra/docker/php/Dockerfile
FROM amazonlinux:2

# timezone environment
ENV TZ=Asia/Tokyo \
  # locale
  LANG=ja_JP.UTF-8 \
  LANGUAGE=ja_JP:ja \
  LC_ALL=ja_JP.UTF-8

RUN yum update -y \
  && yum install -y \
  glibc-langpack-ja \
  zip \
  unzip \
  vim \
  httpd

RUN amazon-linux-extras install -y epel
RUN yum install -y https://rpms.remirepo.net/enterprise/remi-release-7.rpm

RUN yum clean metadata \
  && yum install -y \
  php81 \
  php81-php \
  php81-php-mbstring \
  php81-php-pdo \
  php81-php-xml \
  php81-php-fpm \
  php81-php-mysqlnd \
  php81-php-gd

RUN alternatives --install /usr/bin/php php /usr/bin/php81 1

# composer のインストール
COPY --from=composer:2 /usr/bin/composer /usr/bin/composer
ENV COMPOSER_ALLOW_SUPERUSER 1

# ファイルのコピー
COPY ./infra/docker/php/php.ini /etc/opt/remi/php81/php.ini
COPY ./infra/docker/apache/vhost.conf /etc/httpd/conf.d/vhost.conf
COPY ./infra/docker/apache/rewrite.conf /etc/httpd/conf.modules.d/rewrite.conf

CMD [ "apachectl", "-D", "FOREGROUND" ]

WORKDIR /work/backend
```

作成した Apache の設定ファイルについて、Docker コンテナ内の適切なディレクトリ以下にコピーします。

```docker
COPY ./infra/docker/apache/vhost.conf /etc/httpd/conf.d/vhost.conf
COPY ./infra/docker/apache/rewrite.conf /etc/httpd/conf.modules.d/rewrite.conf
```

設定ファイルの場所については、 CentOS 7 がベースと言われている Amazon Linux 2 であれば、以下のように配置すれば良いようです。
- VirtualHost の設定ファイル → **/etc/httpd/conf.d** ディレクトリ以下
- Module の設定ファイル → **/etc/httpd/conf.modules.d** ディレクトリ以下

# 3. Docker イメージとコンテナの再作成

Docker コンテナを削除し、 Docker イメージを作り直して、 Docker コンテナを作成・起動します。

```bash
docker compose down
docker compose up -d --build
```

# 4. ブラウザの確認

ブラウザで現状の表示を確認します。

http://localhost:8080/ にアクセスします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527226/2b6a639e-c25c-ec25-8be8-4f785c5f3fb8.png)

http://localhost:8080/index.php にアクセスします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527226/195a7617-0c83-c22d-3597-c85156cb8415.png)

Laravel のページが確認できました！

# おわりに

最終回の今回は、 **⑧ Apache の設定ファイルの追加** の手順をまとめました。

今回、Amazon Linux のベースイメージから、LAMP環境(Amazon Linux 2/Apache/MySQL/PHP8.1(Laravel9))を作成する過程で、わからないことが山ほど出てきましたが、調べて紐解いていくことで、色々な学びを得ました。

さらに記事に工程を書き出す上で、よくわかっていないことに気づいた点を調べながらまとめることで、理解が深まることもあり、とても良かったです。

ありがとうございました。

## 参考にしたサイト

https://httpd.apache.org/docs/current/mod/mod_rewrite.html

https://github.com/ucan-lab/docker-laravel-apache

https://qiita.com/ucan-lab/items/38cd04cee1f3f9e024b9