DockerでAmazon Linux 2をベースにしたApache HTTP ServerとPHP 7.4を簡単にインストールする方法

スポンサーリンク
Dockerで Amazon Linux 2をベースにした Apache HTTP Serverと PHP 7.4 を簡単にインストールする方法 ノウハウ
Dockerで Amazon Linux 2をベースにした Apache HTTP Serverと PHP 7.4 を簡単にインストールする方法
この記事は約11分で読めます。
よっしー
よっしー

こんにちは。よっしーです(^^)

今日は、昨日に引き続き、Amazon Linux 2をベースにしてApache HTTP ServerとPHP 7.4をインストールし、それらを実行するための環境構築についてご紹介します。

スポンサーリンク

実行環境

この記事で使用されているコマンドは下記の環境で実行されています。

% sw_vers 
ProductName:            macOS
ProductVersion:         13.2.1
BuildVersion:           22D68

% sysctl machdep.cpu.brand_string
machdep.cpu.brand_string: Apple M1 Max

% docker --version
Docker version 20.10.23, build 7155243

使用している docker desktop のバージョンは下図になります。

docker desktop のバージョン
docker desktop のバージョン

docker を使用したPHPのインストール

下記のDocker関連のファイルを使用しています。

Dockerイメージには、amazonlinux:2 を利用しています。

ディレクトリ構造

各種ファイルの配置は下記のようになっています。

app
├── Dockerfile
├── docker-compose.yml
└── info.php

Dockerfile

FROM amazonlinux:2

# amazon-linux-extras install
RUN amazon-linux-extras install -y epel

# yum update & install
RUN yum update -y \
 && yum install -y \
        systemd \
        httpd

# PHP
RUN yum install -y 'http://rpms.famillecollet.com/enterprise/remi-release-7.rpm'
RUN yum install -y php74
RUN yum install -y php74-php
RUN yum install -y php74-php-fpm
RUN ln -s /usr/bin/php74 /usr/bin/php

# httpd
RUN echo "Mutex posixsem" >> /etc/httpd/conf/httpd.conf
RUN systemctl enable httpd

# init
CMD ["/sbin/init"]

docker-compose.yml

version: '3'

services:
  app:
    build: .
    container_name: amzn-linux-2-app
    platform: linux/x86_64
    privileged: true
    volumes:
      - ./info.php:/var/www/html/info.php
    ports:
      - 8080:80

info.php

PHPの動作確認するためのファイルになります。

<?php
    phpinfo();
?>

ビルド&起動

cd app
docker compose build
docker compose up -d

動作確認

ブラウザで「http://localhost:8080/info.php」にアクセスすると、下図のようになっていればPHPのインストールは成功です。

解説

Dockerfile

amazon-linux-extras install

# amazon-linux-extras install
RUN amazon-linux-extras install -y epel

Amazon Linux 2は、Amazon Linux Extrasと呼ばれる特別なリポジトリを提供しています。Amazon Linux Extrasには、標準のyumリポジトリには含まれていない追加のパッケージが含まれています。

amazon-linux-extras installコマンドは、Amazon Linux Extrasリポジトリからパッケージをインストールするための便利な方法を提供します。このコマンドを使用することで、Amazon Linux Extrasリポジトリに含まれるパッケージをインストールすることができます。

一方、yum install epelコマンドは、標準のyumリポジトリからEPELリポジトリをインストールするための方法です。しかし、Amazon Linux 2の場合、EPELリポジトリを標準のyumリポジトリからインストールすることはできません。代わりに、Amazon Linux Extrasのepelパッケージをインストールする必要があります。

そのため、amazon-linux-extras install -y epelを使用する必要があるのは、Amazon Linux ExtrasからEPELリポジトリをインストールするためであり、標準のyumリポジトリからEPELリポジトリをインストールすることはできないからです。

yum install -y ‘http://rpms.famillecollet.com/enterprise/remi-release-7.rpm

yum install -y 'http://rpms.famillecollet.com/enterprise/remi-release-7.rpm'は、Remiリポジトリをインストールするためのコマンドです。

Remiリポジトリは、PHPやMySQLなどのWeb開発に必要なパッケージを提供しています。このリポジトリには、CentOSやRHELなどのLinuxディストリビューション向けにビルドされた最新バージョンのパッケージが含まれています。

yum install -y 'http://rpms.famillecollet.com/enterprise/remi-release-7.rpm'コマンドは、指定されたURLからRemiリポジトリのRPMパッケージをダウンロードし、インストールします。RPMパッケージは、Red Hat Package Manager(RPM)と呼ばれるパッケージ管理システムであるRHELやCentOSなどのLinuxディストリビューションで使用されます。

このコマンドによって、Remiリポジトリがシステムに追加され、その中からPHP 7.4や関連するパッケージがインストールできるようになります。

なお、PHP 7.4は公式のサポートが終了しているので、これから使用する方は最新バージョンの利用を検討したほうがいいでしょう。今回は、業務でPHP 7.4を使用しているため、それに合わせた環境構築をしています。

RUN echo “Mutex posixsem” >> /etc/httpd/conf/httpd.conf

この設定をする以前には、下記のようなエラーが出ていて、apacheの起動ができませんでした。

bash-4.2# tail -v /var/log/httpd/error_log 
==> /var/log/httpd/error_log <==
[Fri Mar 31 10:23:35.236268 2023] [suexec:notice] [pid 161] AH01232: suEXEC mechanism enabled (wrapper: /usr/sbin/suexec)
[Fri Mar 31 10:23:35.240488 2023] [core:emerg] [pid 161] (95)Operation not supported: AH00023: Couldn't create the proxy mutex 
[Fri Mar 31 10:23:35.241988 2023] [proxy:crit] [pid 161] (95)Operation not supported: AH02478: failed to create proxy mutex
AH00016: Configuration Failed

「(95)Operation not supported: AH00023: Couldn’t create the proxy mutex」というエラーメッセージは、Apache HTTPサーバがプロキシモジュールのmutexを作成できなかったことを示しています。このエラーは、ファイルシステムがPOSIXセマフォをサポートしていない場合に発生することがあります。

このエラーを解消するには、Apache HTTPサーバのmutexの設定を変更する必要があります。具体的には、Apache HTTPサーバの設定ファイルであるhttpd.confに以下のようなディレクティブを追加して、mutexの種類を変更します。

Mutex posixsem

Apache HTTPサーバは、同時に多くのクライアントからのリクエストを処理するために、マルチプロセス・マルチスレッドモデルを採用しています。このモデルでは、複数のプロセスやスレッドが同時に実行されるため、データの整合性や排他制御が必要になります。

この排他制御には、mutex(ミューテックス)という仕組みが使用されます。mutexは、複数のプロセスやスレッドから同時にアクセスされる可能性のある共有リソースを保護するために使用されます。mutexを使用することで、同時に複数のプロセスやスレッドから共有リソースにアクセスすることができなくなり、データの整合性を保つことができます。

しかし、mutexの実装方法は複数あり、その中でもPOSIXセマフォは高いパフォーマンスを発揮することが知られています。Mutex posixsemは、Apache HTTPサーバの設定ファイルであるhttpd.confに設定することで、POSIXセマフォを使用するmutexを指定することができます。

設定ファイルを変更したら、Apache HTTPサーバを再起動して設定を反映させます。

docker-compose.yml

platform: linux/x86_64

Docker Composeのplatformキーは、Dockerイメージをビルドするプラットフォームを指定するために使用されます。platformキーを使用することで、特定のプラットフォーム向けのイメージをビルドすることができます。

linux/x86_64は、Linux x86_64アーキテクチャ向けのプラットフォームを指定します。x86_64は、64ビットIntelアーキテクチャを表します。

このプラットフォームを指定することで、Docker Composeは、x86_64アーキテクチャ向けのベースイメージを選択し、ビルドするDockerfileを適切に構成することができます。また、異なるプラットフォームをサポートするDockerfileを使用することで、異なるプラットフォーム向けのイメージをビルドすることもできます。

M1 Mac でビルドすると、armアーキテクチャが選択されるのですが、PHP 7.4 に armアーキテクチャ用のパッケージがないので、yum install で失敗してしまいます。そのため、このplatformキーにx86_64 を指定して、64ビットIntelアーキテクチャ用としてインストールしています。

platformの設定なしで、ビルドすると下記のようなエラーになりました。

=> ERROR [ 5/10] RUN yum install -y php74                                                                                                                     62.5s 
------                                                                                                                                                               
 > [ 5/10] RUN yum install -y php74:                                                                                                                                 
#0 0.284 Loaded plugins: ovl, priorities                                                                                                                             
#0 1.614 http://rpms.remirepo.net/enterprise/7/safe/aarch64/repodata/repomd.xml: [Errno 14] HTTP Error 404 - Not Found                                               
#0 1.614 Trying other mirror.                                                                                                                                        
(略)

おわりに

Amazon Linux 2をベースにしてApache HTTP ServerとPHP 7.4をインストールすることができました。次回は、フレームワークのインストールをしてみようと思います。

よっしー
よっしー

また明日お会いしましょう!

コメント

タイトルとURLをコピーしました