AlmaLinux + Apache2.4 + MySQL8.0 + PHP8.0をソースインストール縛りで構築しWordPressを動かす

概要

今回はLAMP環境をソースインストールでVirtualBox上の仮想マシンに構築し、WordPressをインストールして動かしてみようと思います。

以前ソースからLAMP環境 + WordPressを構築する(CentOS8 + Apache2.4 + MySQL8.0 + PHP7.4)という記事で、同じようにソースインストールでLAMP環境を構築しました。

しかし、必要になるライブラリをyumに頼ってしまっており、一番美味しいところを味わっていませんでした。

そこで今回は、gccやwget等の本当に最低限必要になるものは最初に揃えて、後から必要になるものは全てソースインストールします。

当記事ではVirtualBoxで仮想マシンを作成するところから始め、最終的にはWordPressにて記事を投稿・更新・削除等の動作確認をするところまでやります。

前提条件

  • VirtualBoxがインストール済みであること

これだけです。もしインストールしていなければ、下記リンクからインストールしてください。

Oracle VM VirtualBox

環境

  • VirtualBox 6.1.18
  • AlmaLinux Beta
  • Apache 2.4.46
  • MySQL 8.0.23
  • PHP 8.0.2
  • WordPress 5.6.1

事前準備

事前準備として当記事で利用する仮想マシンを作成・設定していきます。画像の通りに設定するだけなので、ここでは詳細の説明を省きます。

仮想マシンの作成

Oracle VM VirtualBox マネージャを開き、新規(N)をクリックし、以下のように設定していきます。

ここではメモリーサイズを4096MBに設定します。

仮想ハードディスクの容量ですが、今回のようにテスト環境用であれば50GBあれば大丈夫です。ちなみに20GBだとMySQLのインストール時に足りなくなります。

最後に作成をクリックすることで仮想マシンが作成されます。

仮想マシンの設定

仮想マシン起動時にディスクファイルが読み込まれるように、光学を一番最初に指定します。フロッピーは使用しないのでチェックを外しておきます。

プロセッサー数ですが、当記事では並列ビルドを行うため、2とします。PCのコア数に余裕があれば、もっと増やすことでビルド時間を短縮できます。

最後にネットワークの設定です。ホストOSとゲストOSが通信できて、外部ネットワークと接続することができるブリッジアダプターに設定します。

以上で仮想マシンの事前準備は終了です。

AlmaLinux Beta

LinuxディレクトリビューションをCentOS7にしようか迷ったのですが、せっかくなので先日Beta版がリリースされたAlmaLinuxを選択しました。

AlmaLinux - Forever-Free Enterprise-Grade Operating System
An open-source RHEL fork built by the team at CloudLinux, inspired by the community.

AlmaLinuxはRHELのフォークで、次期CentOSポジション候補として有力なディストリビューションです。さっそくインストールしていきます。

ISOイメージの取得

上記リンクからDownload Beta ISOsタブをクリックし、minimal版のISOイメージを取得します。

ディスクファイルの選択

ISOイメージのダウンロードが完了したら、Oracle VM VirtualBox マネージャを開き、”ディスクファイルを選択”をクリックします。

すると以下のように空と表示されていた光学ドライブにAlmaLinuxのISOイメージファイルが読み込まれます。OKをクリックして設定完了です。

AlmaLinuxのインストール

仮想マシンを起動させ、Install AlmaLinux 8を選択します。

日本人なので日本語を選択して、続行をクリックします。

色々設定項目が出ててくると思います。まずはソフトウェアの選択からしていきます。

デフォルトではベース環境にサーバーが選択されていますが、必要最小限のインストールを選択します。

次にネットワークとホスト名の設定です。Ethernet(enp0s3)をオフからオンに変更します。

後はrootパスワードや一般ユーザの作成、時刻と日付等を設定し、全て設定完了したら”インストールを開始”をクリックします。

するとインストールが始まるので、終わるまで待機し、完了後”システムの再起動”をクリックして再起動します。

再起動が行われ、以下のようにログイン画面が表示されれば無事インストール完了です。

SELinuxの無効化

扱いが難しいSELinuxを無効にしておきます。まず最初に現在有効であることを確認します。

$ getenforce
Enforcing

無効にするため、下記設定ファイルを編集します。

$ sudo /etc/selinux/config
SELINUX=disabled

設定を反映させるため、再起動します。

$ sudo reboot

再起動後、下記コマンドを実行してDisabledと表示されれば無効化されています。

$ getenforce
Disabled

ネットワークの設定

現在のネットワーク設定だとIPアドレスが度々変わるので、固定化させます。

下記コマンドでネットワークインターフェース名を確認します(enp0s3)。

$ ip a | grep "inet 192"
inet 192.168.0.5/24 brd 192.168.0.255 scope global dynamic noprefixroute enp0s3

次にnmcliコマンドを使用し、対象のインターフェースを指定してアドレスの変更・固定化の設定をします。

$ sudo nmcli c m enp0s3  ipv4.address 192.168.0.10/24
$ sudo nmcli c m enp0s3  ipv4.gateway 192.168.0.1
$ sudo nmcli c m enp0s3  ipv4.dns 192.168.0.1
$ sudo nmcli c m enp0s3  ipv4.method manual
$ sudo nmcli c u enp0s3

再度下記コマンドでIPアドレスが変更され、dynamicが無効になったことを確認します。

$ ip a | grep "inet 192"
inet 192.168.0.10/24 brd 192.168.0.255 scope global noprefixroute enp0s3

基本ツールのインストール

gccやwgetなどの最低限必要な基本ツールをyum groupinstallでサクッとインストールします。

$ sudo yum groupinstall "Development tools"
$ sudo yum groupinstall "Base"

以上でAlmaLinuxのインストールとソースインストールの準備は完了です。

Apache2.4

Apacheのビルド手順は下記リンクの公式ドキュメントに記載されています。

Compiling and Installing – Apache HTTP Server Version 2.4

基本の流れはこれに沿っていますが、記載されていないけれども必要なライブラリ等もあるので、整理してまとめています。

また、自分で新たにインストールするソフトウェアのソースは/usr/local/src配下に配置していきます。今後ビルドするにあたって、頻繁にディレクトリを行き来するので、ソースをダウンロードするときは都度カレントディレクトリを確認することをオススメします。

$ cd /usr/local/src

httpd-2.4.46のソース取得

まずはApache本体のソースを下記リンクから取得し、解凍します。

Download - The Apache HTTP Server Project
$ sudo wget -4 https://downloads.apache.org//httpd/httpd-2.4.46.tar.gz
$ sudo tar -zxvf httpd-2.4.46.tar.gz

ここではまだビルドを行わず、後述するaprやapr-utilといったライブラリをApacheのソースディレクトリ内に配置して、最後にまとめてビルドします。

apr-1.7.0のソース取得

APRのソースを下記リンクから取得し、解凍します。

Download - The Apache Portable Runtime Project
$ sudo wget -4 https://downloads.apache.org//apr/apr-1.7.0.tar.gz
$ sudo tar -zxvf apr-1.7.0.tar.gz

Apacheのビルド時に一緒にビルドされるように、Apacheの下記ソースディレクトリ内にaprという名前で配置します。

$ sudo mv apr-1.7.0 httpd-2.4.46/srclib/apr

apr-util-1.6.1のソース取得

APR-Utilのソースも下記リンクから取得し、解凍します。

Download - The Apache Portable Runtime Project
$ sudo wget -4 https://downloads.apache.org//apr/apr-util-1.6.1.tar.gz
$ sudo tar -zxvf apr-util-1.6.1.tar.gz

APRと同じように、下記ソースディレクトリ内にapr-utilという名前で配置します。

$ sudo mv apr-util-1.6.1 httpd-2.4.46/srclib/apr-util

PCRE

pcre-8.44のソース取得

次にPCRE(Perl Compatible Regular Expressions)のソースを下記リンクから取得し、解凍します。

PCRE - Perl Compatible Regular Expressions
The PCRE library is a set of functions that implement regular expression pattern matching using the same syntax and semantics as Perl 5. PCRE has its own native
$ sudo wget -4 https://ftp.pcre.org/pub/pcre/pcre-8.44.tar.gz
$ sudo tar -zxvf pcre-8.44.tar.gz

pcre-8.44のビルド

解凍したディレクトリに移動し、configureスクリプトを実行します。–prefixは自分が把握できる名前で管理するために使用しています。またmakeコマンドに-j2オプションを使用することで、2つのジョブを並列させながらビルドが行われます。-jオプションに渡す数値は、自身が仮想マシンに設定したプロセッサー数です。

$ cd pcre-8.44
$ sudo ./configure --prefix=/usr/local/pcre
$ sudo make -j2
$ sudo make install
$ cd ..

Expat

expat-2.2.10のソース取得

Expatのソースを下記リンクから取得し、解凍します。

Releases · libexpat/libexpat
:herb: Expat library: Fast streaming XML parser written in C; in the process of migrating from SourceForge to GitHub - libexpat/libexpat
$ sudo wget -4 https://github.com/libexpat/libexpat/releases/download/R_2_2_10/expat-2.2.10.tar.gz
$ sudo tar -zxvf expat-2.2.10.tar.gz

expat-2.2.10のビルド

解凍したディレクトリに移動し、ビルドします。

$ cd expat-2.2.10/
$ sudo ./configure --prefix=/usr/local/expat
$ sudo make -j2
$ sudo make install
$ cd ..

OpenSSL

HTTPS通信が基本の現在ではOpenSSLは必須です。なくてもApacheのビルドは成功しますが、あまりオススメしません。

openssl-1.1.1jのソース取得

OpenSSLのソースを下記リンクから取得し、解凍します。

/source/index.html
$ sudo wget -4 https://www.openssl.org/source/openssl-1.1.1j.tar.gz
$ sudo tar -zxvf openssl-1.1.1j.tar.gz

openssl-1.1.1jのビルド

OpenSSLの場合、configureスクリプトではなくて、configスクリプトです。名前が違うだけなので同じようにオプションを渡してビルドします。

$ cd openssl-1.1.1j/
$ sudo ./config --prefix /usr/local/openssl
$ sudo make -j2
$ sudo make install
$ cd ..

httpd-2.4.46のビルド

必要なものは揃ったのでApacheをビルドしていきます。

$ cd httpd-2.4.46/
$ sudo ./configure \
--prefix=/usr/local/httpd \
--with-included-apr \
--with-pcre=/usr/local/pcre/bin/pcre-config \
--enable-ssl \
--with-ssl=/usr/local/openssl \
--enable-mods-shared=all \
--with-mpm-shared=all \
CPPFLAGS="-I/usr/local/expat/include" \
LDFLAGS="-L/usr/local/expat/lib"

configureスクリプトに渡すオプションの説明は以下の通りです。

オプション説明
–prefixインストール先ディレクトリを指定
–with-included-aprAPRとAPR-Utilを一緒にビルドする
–with-pcrePCRE(pcre-config)の配置場所を指定
–enable-sslSSLサポートを有効化
–with-sslSSLの配置場所を指定
–enable-mods-shared=all多くの動的モジュールを有効化
–with-mpm-shared=allMPMモジュール(worker, prefork, event)を有効化
CPPFLAGS値をそのままコンパイラに渡す(includeディレクトリを指定)
LDFLAGS値をそのままコンパイラに渡す(libディレクトリを指定)

エラーもなくconfigureスクリプトを実行できればとりあえず大丈夫です。

$ sudo make -j2
$ sudo make install
$ cd ..

無事ビルドが完了できたら、インストールしたApacheのバージョンを確認します。

$ /usr/local/httpd/bin/httpd -v
Server version: Apache/2.4.46 (Unix)
Server built:   Feb 20 2021 13:38:30

遭遇しやすいエラー

ここではApacheのビルド時に遭遇しやすいエラーと解決策をいくつか紹介します。

pcre-config for libpcre not found

configure実行時に発生するこのエラーは、PCRE(pcre-config)へのパスが適切に指定されていなかったり、そもそもPCREをインストールしていないことが原因です。

checking for pcre-config... false
configure: error: pcre-config for libpcre not found. PCRE is required and available from http://pcre.org/

下記のようにconfugureスクリプトに–with-pcreオプションでpcre-configへのパスを渡すことで解決します。

--with-pcre=/usr/local/bin/pcre-config

mod_ssl has been requested but can not be built due to prerequisite failures

configure実行時に発生するこのエラーは、configureスクリプトに–with-sslオプションを使用していなかったり、–with-sslオプションを渡しているものの、opensslへのパスが適切に通っていないことが原因です。

checking whether to enable mod_ssl... configure: error: mod_ssl has been requested but can not be built due to prerequisite failures

インストールされているopensslの場所をきちんと調べ、–with-sslオプションで正確に指定してあげ流ことで解決します。

--with-ssl=/usr/local/openssl

expat.h: No such file or directory

configure実行時に発生するこのエラーは、Expatをインストールしていなかったり、適切なパスが通っていないことが原因です。

xml/apr_xml.c:35:10: fatal error: expat.h: No such file or directory
 #include <expat.h>
          ^~~~~~~~~
compilation terminated.

CFLAGSやCPPFLAGS等でincludeディレクトリへのパスを渡し、LDFLAGSでlibディレクトリへのパスを指定することで解決します。

CPPFLAGS="-I/usr/local/expat/include"
LDFLAGS="-L/usr/local/expat/lib"

undefined reference to `XML_*’

configure実行時に発生するこのエラーは、Expatのライブラリを見つけられないことが原因です。

/usr/local/src/httpd-2.4.46/srclib/apr-util/.libs/libaprutil-1.so: undefined reference to `XML_GetErrorCode'
/usr/local/src/httpd-2.4.46/srclib/apr-util/.libs/libaprutil-1.so: undefined reference to `XML_SetEntityDeclHandler'
/usr/local/src/httpd-2.4.46/srclib/apr-util/.libs/libaprutil-1.so: undefined reference to `XML_ParserCreate'
/usr/local/src/httpd-2.4.46/srclib/apr-util/.libs/libaprutil-1.so: undefined reference to `XML_SetCharacterDataHandler'
・・・

LDFLAGSにExapatのlibディレクトリのパスを渡すことで解決します。

LDFLAGS=/usr/local/expat/lib

Apacheの設定

Apacheを起動させるために必要な設定を行っていきます。

apacheユーザ・グループの作成

デフォルトではdaemonユーザとdaemonグループでとてもカッコ悪いので把握しやすいapacheに変更します。デーモン用のユーザなのでホームディレクトリを作成せず、ログインを禁止します。

$ sudo groupadd apache
$ sudo useradd -r -g apache -s /sbin/nologin apache

/usr/local/httpdディレクトリ以下の所有権を全てapacheユーザ・グループに変更します。

$ sudo chown -R apache.apache /usr/local/httpd
$ ls -la /usr/local/httpd
total 40
drwxr-xr-x  15 apache apache  175 Feb 20 13:41 .
drwxr-xr-x. 16 root   root    184 Feb 20 13:41 ..
drwxr-xr-x   2 apache apache  302 Feb 20 13:41 bin
drwxr-xr-x   2 apache apache  253 Feb 20 13:41 build
drwxr-xr-x   2 apache apache   78 Feb 20 13:41 cgi-bin
drwxr-xr-x   4 apache apache   84 Feb 20 13:41 conf
drwxr-xr-x   3 apache apache 4096 Feb 20 13:41 error
drwxr-sr-x   2 apache apache   24 Aug  1  2020 htdocs
drwxr-xr-x   3 apache apache 8192 Feb 20 13:41 icons
drwxr-xr-x   2 apache apache 4096 Feb 20 13:41 include
drwxr-xr-x   3 apache apache  281 Feb 20 13:41 lib
drwxr-xr-x   2 apache apache   58 Feb 20 13:48 logs
drwxr-xr-x   4 apache apache   30 Feb 20 13:41 man
drwxr-sr-x  14 apache apache 8192 Aug  1  2020 manual
drwxr-xr-x   2 apache apache 4096 Feb 20 13:41 modules

Apache設定ファイルの編集

次にApacheメイン設定ファイルを編集していきます。大切な設定ファイルなのでバックアップを行ってから編集します。

$ cd /usr/local/httpd/conf
$ sudo cp -p httpd.conf httpd.conf.`date "+%Y%m%d_%H%M%S"`
$ sudo vi httpd.conf
-----(追記)-----
ServerName localhost:80

-----(daemonからapacheに変更)-----
User apache
Group apache

編集後は構文に誤りがないかどうか、下記コマンドで構文チェックを行います。

$ ../bin/httpd -t
Syntax OK

systemdユニットファイルの作成

systemdで起動や停止等の操作を行えるように、ユニットファイルを作成します。

$ sudo vi /usr/lib/systemd/system/httpd.service
[Unit]
Description=The Apache HTTP Server
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
ExecStart=/usr/local/httpd/bin/apachectl start
ExecReload=/usr/local/httpd/bin/apachectl graceful
ExecStop=/usr/local/httpd/bin/apachectl stop

[Install]
WantedBy=multi-user.target

編集後は下記コマンドでユニットファイルを反映させます。

$ sudo systemctl daemon-reload

ファイアウォールの設定

HTTP/HTTPS用ポートを開放しないとアクセスできないので、下記コマンドを実行します。

$ sudo firewall-cmd --add-service=http --zone=public --permanent
$ sudo firewall-cmd --add-service=https --zone=public --permanent
$ sudo firewall-cmd --reload

ポートを開放できたかどうか下記コマンドで確認します。

$ sudo firewall-cmd --list-services
cockpit dhcpv6-client http https ssh

動作確認

Apacheを今すぐに起動&自動起動の設定を行います。

$ sudo systemctl enable --now httpd

起動したかどうか下記コマンドで確認します。

$ systemctl status httpd

これでページにアクセスできるはずなので、まずはコマンドライン上から動作確認します。

$ curl http://192.168.0.10
<html><body><h1>It works!</h1></body></html>

次にWebブラウザ上からhttp://IPアドレスにアクセスして確認します。

無事に表示されればApacheの構築と設定はひとまず完了です。

MySQL8.0

ここからはMySQLのビルドです。本体のビルドで必要になるライブラリからビルドしていきます。

Ncurses

ncurses-6.2のソース取得

Ncursesのソースを下記リンクから取得し、解凍します。

Index of /pub/gnu/ncurses
$ cd /usr/local/src
$ sudo wget -4 https://ftp.gnu.org/pub/gnu/ncurses/ncurses-6.2.tar.gz
$ sudo tar -zxvf ncurses-6.2.tar.gz

ncurses-6.2のビルド

解凍したディレクトリに移動し、ビルドしていきます。

$ cd ncurses-6.2/
$ sudo ./configure --prefix=/usr/local/ncurses --enable-overwrite
$ sudo make -j2
$ sudo make install
$ cd ..

configureスクリプトの–enable-overwirteをなぜつけているかというと、インストールされるincludeディレクトリのパスが/usr/local/ncurses/include/ncursesとなってしまうからです。

個人的にincludeディレクトリ直下にヘッダーファイルを持っていきたいので、–enable-overwriteをつけて、/usr/local/ncurses/includeになるようにしています。

libtirpc

libtirpc-1.3.1のソース取得

libtirpcのソースを下記リンクから取得して、解凍します。

libtirpc
Download libtirpc for free. Libtirpc is a port of Suns Transport-Independent RPC library to Linux. It's being developed by the Bull GNU/Linux NFSv4 project.
$ sudo wget -4 https://sourceforge.net/projects/libtirpc/files/libtirpc/1.3.1/libtirpc-1.3.1.tar.bz2
$ sudo tar -xvf libtirpc-1.3.1.tar.bz2

libtirpc-1.3.1のビルド

解凍したディレクトリに移動し、ビルドしていきます。

$ cd libtirpc-1.3.1/
$ sudo ./configure --prefix=/usr/local/libtirpc --disable-gssapi
$ sudo make -j2
$ sudo make install
$ cd ..

–disable-gssapiは名前の通りgssapiライブラリをビルドしないという意味です。

何もつけずにconfigureスクリプトを実行すると、gssapi使わないなら–disable-gssapiをつけてくれと指示されるので、それに従いました。このようないつ使うか分からないものは必要になったら取り入れるというスタンスでいきます。

インストールしたヘッダファイルをシステムが探せるように下記ディレクトリにシンボリックリンクを作成します。

$ sudo ln -s /usr/local/libtirpc/include/tirpc/rpc/* /usr/include/rpc/
$ sudo ln -s /usr/local/libtirpc/include/tirpc/netconfig.h /usr/include/

rpcgen

rpcsvc-proto-1.4.2のソース取得

rpcgenのソースを下記リンクから取得し、解凍します。

Release Release Version 1.4.2 · thkukuk/rpcsvc-proto
Allow newer gettext versions
$ sudo wget https://github.com/thkukuk/rpcsvc-proto/releases/download/v1.4.2/rpcsvc-proto-1.4.2.tar.xz
$ sudo tar -xvf rpcsvc-proto-1.4.2.tar.xz

rpcsvc-proto-1.4.2のビルド

解凍したディレクトリに移動し、ビルドしていきます。

$ cd rpcsvc-proto-1.4.2/
$ sudo ./cofnigure --prefix=/usr/local/rpcsvc-proto
$ sudo make -j2
$ sudo make install
$ cd ..

CMake

MySQLをビルドする際は、これまで登場したビルド手順とは少し異なり、CMakeというツールを使用します。

cmake-3.20.0-rc1のソース取得

CMakeのソースを下記リンクから取得し、解凍します。

Download | CMake
$ sudo wget -4 https://github.com/Kitware/CMake/releases/download/v3.20.0-rc1/cmake-3.20.0-rc1.tar.gz
$ sudo tar -zxvf cmake-3.20.0-rc1.tar.gz

cmake-3.20.0-rc1のビルド

解凍したディレクトリに移動し、ビルドしていきます。

$ cd cmake-3.20.0-rc1/
$ sudo env OPENSSL_ROOT_DIR=/usr/local/openssl ./configure --prefix=/usr/local/cmake
$ sudo make -j2
$ sudo make install
$ cd ..

OPENSSL_ROOT_DIRで新しくインストールしたopensslのパスを指定しています。これをつけないとopensslを見つけられず、エラーを吐くからです。

実行したいコマンドの前にenvコマンド+変数名を置くことで、環境変数を一時的に設定した上でコマンドを実行します。もちろん一時的なのでコマンド実行後にその環境変数はクリアになります。

mysql-8.0.23のソース取得

以上でMySQLのビルドにあたって必要なライブラリが揃いました。

下記リンクにアクセスし、以下の画像のようにソースコードのtarボールを探して取得し、解凍します。

Download MySQL Community Server – MySQL

$ cd /usr/local/src
$ sudo wget -4 https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.23.tar.gz
$ sudo tar -zxvf mysql-8.0.23.tar.gz

terminal.cの編集

このままビルドしていくと、以下のようなバグに遭遇します。mysqlコマンドでログインすると、Segmentation faultが発生してmysqlが強制終了します。

$ sudo /usr/local/mysql/bin/mysql -uroot -pPASSWORD
・・・
Segmentation fault(core dumped)

色々試行錯誤してみましたが、現状これしか有効な解決策がありませんでした。

MySQL Bugs: #58497: mysql client crashes due to unitialized string buffer in term.c

つまり、libeditディレクトリ以下にあるterminal.cファイルを編集するれば解消するとのことです。

システム内のどこにterminal.cがあるかは下記コマンドで確認することができます。

$ sudo find / -name terminal.c
/usr/local/src/mysql-8.0.23/extra/libedit/libedit-20190324-3.1/src/terminal.c

編集箇所は以下の2点です。845行目をコメントアウト、areaの値をbufからNULLに変更します。

$ sudo vi /usr/local/src/mysql-8.0.23/extra/libedit/libedit-20190324-3.1/src/terminal.c
------(コメントアウト)------
845 //      char buf[TC_BUFSIZE];
------(areaの値をNULLに変更)------
855         area = NULL;                

mysql-8.0.23のビルド

ビルド手順は下記ドキュメントを参考にしています。

MySQL :: MySQL 8.0 Reference Manual :: 2.9 Installing MySQL from Source

まず解凍したディレクトリに移動し、ビルド用のディレクトリを作成し、そこに移動します。

$ cd mysql-8.0.23/
$ sudo mkdir bld
$ cd bld

一般ユーザで絶対パスでcmakeを実行しても反応しなかったため、一時的にrootユーザになってビルドしていきます。

$ sudo su
# export PATH=/usr/local/rpcsvc-proto/bin:/usr/local/cmake/bin:$PATH
# cmake .. \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DDOWNLOAD_BOOST=1 \
-DWITH_BOOST=/usr/local/boost \
-DWITH_SYSTEMD=1 \
-DOPENSSL_ROOT_DIR=/usr/local/openssl \
-DOPENSSL_LIBRARIES=/usr/local/openssl/lib \
-DCURSES_LIBRARY=/usr/local/ncurses/lib/libcurses.a \
-DCURSES_INCLUDE_PATH=/usr/local/ncurses/include

cmakeのオプションは以下の通りです。

オプション説明
-DCMAKE_INSTALL_PREFIXインストール先ディレクトリの指定
-DDOWNLOAD_BOOSTBoostライブラリをダウンロードするかどうか指定
-DWITH_BOOSTboostライブラリのインストール先を指定
-DWITH_SYSTEMDsystemdサポートの有効化
-DOPENSSL_ROOT_DIROpenSSLのルートディレクトリを指定
-DOPENSSL_LIBRARIESOpenSSLのlibディレクトリのパスを指定
-DCURSES_LIBRARYlibcursesへのパスを指定
-DCURSES_INCLUDE_PATHNcursesのincludeディレクトリを指定
# make -j2
# make install
# exit
$ cd ../..

無事にビルドが完了したらバージョンを確認します。

$ /usr/local/mysql/bin/mysql -V
/usr/local/mysql/bin/mysql  Ver 8.0.23 for Linux on x86_64 (Source distribution)

遭遇しやすいエラー

ここではMySQLのビルド時に遭遇しやすいエラーと解決策をいくつか紹介します。

Could not find rpc/rpc.h in /usr/include or /usr/include/tirpc

cmake時に発生するこのエラーは、rpc.hを見つけられなかったり、そもそもインストールしていないことが原因です。

-- Checking for module 'libtirpc'
--   Package 'libtirpc', required by 'virtual:world', not found
CMake Error at cmake/rpc.cmake:65 (MESSAGE):
  Could not find rpc/rpc.h in /usr/include or /usr/include/tirpc

インストールしたlibtirpcのヘッダファイルへのシンボリックリンクを作成することで解決します。

$ sudo ln -s /usr/local/libtirpc/include/tirpc/rpc/* /usr/include/rpc/

Cannot find appropriate system libraries for WITH_SSL=system

cmake時に発生するこのエラーは、インストールしたOpenSSLを見つけられなかったり、そもそもインストールしていないことが原因です。

Cannot find appropriate system libraries for WITH_SSL=system.
Make sure you have specified a supported SSL version.
Valid options are :
system (use the OS openssl library),
yes (synonym for system),
</path/to/custom/openssl/installation>

CMake Error at cmake/ssl.cmake:61 (MESSAGE):
  Please install the appropriate openssl developer package.

下記オプションにopensslへのパスを指定してあげることで解決します。

-DOPENSSL_ROOT_DIR=/usr/local/openssl -DOPENSSL_LIBRARIES=/usr/local/openssl/lib

Curses library not found

cmake時に発生するこのエラーは、インストールしたNcursesを見つけられなかったり、そもそもインストールしていないことが原因です。

Could NOT find Curses (missing: CURSES_LIBRARY CURSES_INCLUDE_PATH)
CMake Error at cmake/readline.cmake:71 (MESSAGE):
  Curses library not found.  Please install appropriate package,

下記オプションにNcursesへのパスを指定してあげることで解決します。

-DCURSES_LIBRARY=/usr/local/ncurses/lib/libcurses.a -DCURSES_INCLUDE_PATH=/usr/local/ncurses/include

Could not find rpcgen

cmake時に発生するこのエラーはrpcgenコマンドへパスが通っていない、あるいはそもそもインストールしていないことが原因です。

CMake Error at plugin/group_replication/libmysqlgcs/cmake/rpcgen.cmake:104 (MESSAGE):
  Could not find rpcgen
Call Stack (most recent call first):
  plugin/group_replication/libmysqlgcs/CMakeLists.txt:53 (INCLUDE)

下記のようにrpcgenコマンドのパスを通すことで解決します。

PATH=/usr/local/rpcsvc-proto/bin/:$PATH

MySQLの設定

ここからはMySQLの起動に必要な設定をしていきます。

mysqlユーザ・グループの作成

デーモン用のmysqlユーザとグループを作成します。

$ sudo groupadd mysql
$ sudo useradd -r -g mysql -s /sbin/nologin mysql

公式ドキュメントに従い、下記ディレクトリの作成&所有権の変更を行います。

$ cd /usr/local/mysql
$ sudo mkdir mysql-files
$ sudo chown mysql.mysql mysql-files
$ sudo chmod 750 mysql-files

MySQL設定ファイルの作成

MySQL設定ファイルが存在しないため新たに作成します

$ sudo vi /usr/local/mysql/my.cnf
[mysqld]
datadir=/usr/local/mysql/data
socket=/tmp/mysql.sock

[mysqld_safe]
log-error=/usr/local/mysql/logs/mysql.log
pid-file=/var/run/mysql/mysql.pid

[client]
socket=/tmp/mysql.sock

設定ファイルで指定したディレクトリを作成&所有権変更しておきます。

$ sudo mkdir logs
$ sudo chown mysql.mysql logs
$ sudo mkdir /var/run/mysql
$ sudo chown mysql.mysql /var/run/mysql

初期化

先ほど作成した設定ファイルを指定し、mysqldを初期化します。rootユーザの初期パスワードが最後に出力されるので控えておきます。

$ sudo bin/mysqld --defaults-file=/usr/local/msyql/data --initialize --user=mysql
2021-02-20T09:42:12.112061Z 0 [System] [MY-013169] [Server] /usr/local/mysql/bin/mysqld (mysqld 8.0.23) initializing of server in progress as process 404819
2021-02-20T09:42:12.155595Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
2021-02-20T09:42:12.729417Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
2021-02-20T09:42:13.583578Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: ********** 

systemdの起動設定

cmake時に-DWITH_SYSTEMD=1を指定していたため、MySQL用ユニットファイルの雛形がすでに用意されています。下記コマンドを実行し、適切なディレクトリに配置します。

$ sudo cp usr/lib/systemd/system/mysqld.service /usr/lib/systemd/system/mysqld.service

ユニットファイルの反映をし、今すぐに起動&自動起動の設定を行います。

$ sudo systemctl daemon-reload
$ sudo systemctl enable --now mysqld

下記コマンドでMySQLが起動したかどうか確認します。

$ systemctl status mysqld

mysql_secure_installation

mysql_secure_installationで簡単にセキュアな初期設定を行います。

$ sudo bin/mysql_secure_installation
・・・
By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.

Remove anonymous users? (Press y|Y for Yes, any other key for No) : y
Success.


Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.

Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y
Success.

By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.


Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y
 - Dropping test database...
Success.

 - Removing privileges on test database...
Success.

Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.

Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y
Success.

All done!

動作確認

mysqlコマンドでログインできることを確認します。

$ sudo bin/mysql -uroot -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 18
Server version: 8.0.23 Source distribution

Copyright (c) 2000, 2021, Oracle and/or its affiliates.

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>

PHP8.0

ここからはPHPのビルドです。本体のビルドで必要になるライブラリからビルドしていきます

libxml2

libxml2-2.9.10のソース取得

libxml2のソースを下記リンクから取得し、解凍します。

ftp://xmlsoft.org/libxml2/

$ cd /usr/local/src
$ sudo wget -4 ftp://xmlsoft.org/libxml2/libxml2-2.9.10.tar.gz
$ sudo tar -zxvf libxml2-2.9.10.tar.gz

libxml2-2.9.10のビルド

解凍したディレクトリに移動し、ビルドしていきます。

$ cd libxml2-2.9.10/
$ sudo ./configure --prefix=/usr/local/libxml2 --without-python 
$ sudo make -j2
$ sudo make install
$ cd ..

SQLite

sqlite-3.34.1のソース取得

SQLiteのソースを下記リンクから取得し、解凍します。

SQLite Home Page
$ sudo wget -4 https://www.sqlite.org/2021/sqlite-autoconf-3340100.tar.gz
$ sudo tar -zxvf sqlite-autoconf-3340100.tar.gz

sqlite-3.34.1のビルド

解凍したディレクトリに移動し、ビルドしていきます。

$ cd sqlite-autoconf-3340100/
$ sudo ./configure --prefix=/usr/local/sqlite
$ sudo make -j2
$ sudo make install
$ cd ..

oniguruma

oniguruma-6.9.6のソース取得

onigurumaのソースを下記リンクから取得し、解凍します。

Releases · kkos/oniguruma
regular expression library. Contribute to kkos/oniguruma development by creating an account on GitHub.
$ sudo wget -4 https://github.com/kkos/oniguruma/archive/v6.9.6.tar.gz
$ sudo tar -zxvf v6.9.6.tar.gz

oniguruma-6.9.6のビルド

configureスクリプトが存在しない場合、まず最初に下記コマンドを実行し、conifgureスクリプトを作成します。

$ cd oniguruma-6.9.6/
$ sudo autoreconf -vfi

作成後はいつも通りのビルド手順になります。

$ sudo ./configure --prefix=/usr/local/oniguruma
$ sudo make -j2
$ sudo make install
$ cd ..

zlib

zlib-1.2.11のソース取得

zlibのソールを下記リンクから取得し、解凍します。

zlib Home Site
$ sudo wget -4 https://zlib.net/zlib-1.2.11.tar.gz
$ sudo tar -zxvf zlib-1.2.11.tar.gz

zlib-1.2.11のビルド

解凍したディレクトリに移動し、ビルドしていきます。

$ cd zlib-1.2.11/
$ sudo ./configure --prefix=/usr/local/zlib
$ sudo make -j2
$ sudo make install
$ cd ..

php-8.0.2のソース取得

以上でPHPのビルドに必要なライブラリは揃いました。

PHPのソースを下記リンクから取得し、解凍します。

PHP: Downloads
$ sudo wget -4 https://www.php.net/distributions/php-8.0.2.tar.gz
$ sudo tar -zxvf php-8.0.2.tar.gz

php-8.0.2のビルド

解凍したディレクトリに移動し、ビルドしていきます。

$ cd php-8.0.2/
$ sudo ./configure \
--prefix=/usr/local/php \
--with-apxs2=/usr/local/httpd/bin/apxs \
--with-mysqli \
--with-pdo-mysql \
--enable-mbstring \ 
--with-zlib \
PKG_CONFIG_PATH="/usr/local/libxml2/lib/pkgconfig\
:/usr/local/sqlite/lib/pkgconfig\
:/usr/local/oniguruma/lib/pkgconfig\
:/usr/local/zlib/lib/pkgconfig"

configureスクリプトのオプションの説明は以下の通りです。

オプション説明
–prefixインストール先ディレクトリを指定
–with-apxs2Apacheのapxsコマンドへのパスを指定
–with-mysqlimysqli拡張モジュールの有効化
–with-pdo-mysqlPDO MySQL拡張モジュールの有効化
–enable-mbstringmbstring(マルチバイト文字列)関数の有効化
–with-zlibzlibサポートの有効化
PKG_CONFIG_PATHpkgconfigへのパスを指定
$ sudo make -j2
$ sudo make install
$ cd ..

無事ビルドが完了したらバージョンを確認します。

$ /usr/local/php/bin/php -v
PHP 8.0.2 (cli) (built: Feb 21 2021 11:02:12) ( ZTS )
Copyright (c) The PHP Group
Zend Engine v4.0.2, Copyright (c) Zend Technologies

遭遇しやすいエラー

ここではPHPのビルド時に遭遇しやすいエラーと解決策をいくつか紹介します。

Package requirements (libxml-2.0 >= 2.9.0) were not met

configure実行時に発生するこのエラーは、libxmlを見つけられなかったり、そもそもインストールしていないことが原因です。

checking for libxml-2.0 >= 2.9.0... no
configure: error: Package requirements (libxml-2.0 >= 2.9.0) were not met:

Package 'libxml-2.0', required by 'virtual:world', not found

PKG_CONFIG_PATHでlibxml2のpkgconfigへのパスを指定することで解決します。

PKG_CONFIG_PATH="/usr/local/libxml2/lib/pkgconfig"

Package requirements (sqlite3 > 3.7.4) were not met:

configure実行時に発生するこのエラーは、sqliteを見つけられなかったり、そもそもインストールしていないことが原因です。

checking for sqlite3 > 3.7.4... no
configure: error: Package requirements (sqlite3 > 3.7.4) were not met:

Package 'sqlite3', required by 'virtual:world', not found

PKG_CONFIG_PATHでsqliteのpkgconfigへのパスを指定することで解決します。

PKG_CONFIG_PATH="/usr/local/sqlite/lib/pkgconfig"

Package requirements (oniguruma) were not met:

configure実行時に発生するこのエラーは、onigurumaを見つけられなかったり、そもそもインストールしていないことが原因です。

checking for oniguruma... no
configure: error: Package requirements (oniguruma) were not met:

Package 'oniguruma', required by 'virtual:world', not found

PKG_CONFIG_PATHでonigurumaのpkgconfigへのパスを指定することで解決します。

PKG_CONFIG_PATH="/usr/local/oniguruma/lib/pkgconfig"

Package requirements (zlib) were not met:

configure実行時に発生するこのエラーは、zlibを見つけられなかったり、そもそもインストールしていないことが原因です。

checking for zlib... no
configure: error: Package requirements (zlib) were not met:

Package 'zlib', required by 'virtual:world', not found

PKG_CONFIG_PATHでzlibのpkgconfigへのパスを指定することで解決します。

PKG_CONFIG_PATH="/usr/local/zlib/lib/pkgconfig"

PHPの設定

PHPとApache、MySQLが正常に連携できるように設定をしていきます。

設定ファイルの雛形をコピー

PHPの設定ファイルは雛形が数種類用意されており、今回は開発環境用の雛形を使用します。自分が把握しやすいディレクトリ配下にコピーします。今回は設定ファイルの編集はしません。

$ sudo cp /usr/local/src/php-8.0.2/
$ sudo cp /usr/local/src/php-8.0.2/php.ini-development /usr/local/php/php.ini

Apache設定ファイルの編集

php拡張子を持つファイルに対してPHPが実行されるようにするために、Apacheのメイン設定ファイルを編集します。また、配置したPHP設定ファイルを認識するように、PHPIniDirディレクティブで指定してあげます。

$ cd /usr/local/httpd/conf
$ sudo cp -p httpd.conf httpd.conf.`date "+%Y%m%d_%H%M%S"`
$ sudo vi httpd.conf
------(追記)------
<FilesMatch \.php$>
    SetHandler application/x-httpd-php
</FilesMatch>

PHPIniDir "/usr/local/php/php.ini"

設定を変更したので、構文チェックを行います。

$ ../bin/httpd -t
Syntax OK

設定ファイル編集後はApacheを再起動します。

$ sudo systemctl restart httpd

動作確認

ここでは2種類の動作確認を行います。

テストページの作成・表示確認

ドキュメントルートディレクトリに移動し、phpinfoのテストページを作成します。

$ cd /usr/local/httpd/htdocs/
$ sudo vi phpinfo.php
<?php
    phpinfo();
?>

まずはコマンドライン上から動作確認します。

$ curl http://192.168.0.10/phpinfo.php

次にWebブラウザ上からhttp://192.168.0.10/phpinfo.php動作確認します。

無事に確認できた後は、セキュリティ上の問題があるのでテストページを削除しておきます。

$ sudo rm -f phpinfo.php

MySQLへの接続確認

次はPHPからMySQLへの接続確認テストを行います。

まずはmysqlにログインし、テスト用ユーザ・グループを作成します。

$ sudo /usr/local/mysql -uroot -p
・・・
mysql> create user 'testuser'@'localhost' identified with mysql_native_password by '@PassWord';
mysql> create database testdb;
mysql> grant all privileges on testdb.* to 'test'@'localhost';
mysql> flush privileges;
mysql> quit

次にドキュメントルート直下に下記テストファイルを作成します。PHPのPDOでサクッとMySQLへの接続を確認するコードを使用させていただきました。

$ sudo vi test.php
<?php
define('HOSTNAME', 'localhost');
define('DATABASE', 'testdb');
define('USERNAME', 'testuser');
define('PASSWORD', '@PassWorD1');

try {
  $db  = new PDO('mysql:host=' . HOSTNAME . ';dbname=' . DATABASE, USERNAME, PASSWORD);
  $msg = "MySQL への接続確認が取れました。";
} catch (PDOException $e) {
  $isConnect = false;
  $msg       = "MySQL への接続に失敗しました。<br>(" . $e->getMessage() . ")";
}
?>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <title>MySQL接続確認</title>
  </head>
  <body>
    <h1>MySQL接続確認</h1>
    <p><?php echo $msg; ?></p>
  </body>
</html>

まずはコマンドライン上から確認します。

$ curl http://192.168.0.10/test.php
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <title>MySQL接続確認</title>
  </head>
  <body>
    <h1>MySQL接続確認</h1>
    <p>MySQL への接続確認が取れました。</p>
  </body>
</html>

次にWebブラウザ上からhttp://IPアドレス/test.phpにアクセスし、動作確認します。

確認後はテストファイルを削除しておきます。

$ sudo rm -f test.php

WordPress

WordPressは下記リンクを参考にインストールしていきます。

WordPress のインストール
WordPress はインストールが簡単なことで有名です。ほとんどの環境でごく簡単な手順でインストールが済み、…

WordPressのソースを取得

WordPressのソースを下記リンクから取得し、解凍します。

ダウンロード
WordPress を今すぐダウンロードし、世界で最も強力で、有名で、拡張性の高いプラットフォームの一つを使って、サイトを作り始めましょう。
$ sudo wget -4 https://ja.wordpress.org/latest-ja.tar.gz
$ sudo tar -zxvf latest-ja.tar.gz

解凍したディレクトリをドキュメントルート下に配置します。

$ sudo mv wordpress /usr/local/httpd/htdocs/wordpress

WordPress用ユーザ・データベースの作成

次にWordPress用のユーザ・データベースを作成します。

$ sudo /usr/local/mysql/bin/mysql -uroot -p
mysql> create user 'wordpressuser'@'localhost' identified with mysql_native_password by '@PasSWorD2';
mysql> create database wordpressdb;
mysql> grant all privileges on wordpress.* to 'wordpressuser'@'localhost';
mysql> flush privileges;
mysql> quit

Apacheの設定

Apacheのメイン設定ファイルを以下のように編集します。ここではドキュメントルートに/usr/local/httpd/htdocs/wordpressを設定し、DirectoryIndexにindex.phpを追加しています。

$ cd /usr/local/httpd/conf
$ sudo cp -p httpd.conf httpd.conf.`"+%Y%m%d_%H%M%S"`
$ sudo vi 
DocumentRoot "/usr/local/httpd/htdocs/wordpress"
<Directory "/usr/local/httpd/htdocs/wordpress">
・・・
</Directory>
<IfModule dir_module>
    DirectoryIndex index.html index.php
</IfModule>

設定ファイルを編集したので下記コマンドで構文チェックを行います。

$ ../bin/httpd -t
Syntax OK

Apacheを再起動します。

$ sudo systemctl restart httpd

WordPressの設定

最後にWordPressの設定ファイルを編集します。WordPressの設定ファイルの雛形がすでに用意されているので、wp-config.phpという名前でコピーして編集します。

$ cd /usr/local/httpd/htdocs/wordpress
$ sudo cp -p wp-config-sample.php wp-config.php
$ sudo vi wp-config.php
・・・
/** WordPress のためのデータベース名 */
define( 'DB_NAME', 'wordpressdb' );

/** MySQL データベースのユーザー名 */
define( 'DB_USER', 'wordpressuser' );

/** MySQL データベースのパスワード */
define( 'DB_PASSWORD', '@PassWorD2' );

編集後、Webブラウザ上からhttp://IPアドレスにアクセスすると、以下のように設定画面が表示されるようになります。

各自好きなタイトル、ユーザ名等を設定していき、”WordPressをインストール”をクリックすればインストール完了です。

動作確認

ログイン

作成したユーザとパスワードでログインすることができ、管理画面が表示されることを確認します。

記事の新規投稿

題名:テスト、内容:これはテストですという記事を作成し、投稿できていることを確認します。

記事の更新

先ほどの記事に”記事を更新しました”というメッセージが追加され、記事が更新されていることを確認します。

記事の削除

テスト用の記事を削除し、ブログのトップに表示されていないことを確認します。

最後に

今回はAlmaLinux、Apache、MySQL、PHP、WordPressをソースインストール縛りで構築し、動作確認を行いました。

yum等のパッケージインストールと比べると明らかに大変ですが、その分ライブラリやヘッダファイルの存在を強く意識できるようになりました。

また、今回LinuxディストリビューションにAlmaLinuxを選択しましたが、まだBeta版なので完全版がリリースされたらこの記事を更新しようと思います。

Comments

Copied title and URL