こんにちは。よっしーです(^^)
今日は、昨日に引き続き、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 を使用した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をインストールすることができました。次回は、フレームワークのインストールをしてみようと思います。
また明日お会いしましょう!
コメント