🧀

苦しんでインストールする最新のApache

2022/12/09に公開

はじめに

普通にインストールするだけなんですが、他のよくあるインストール系記事とは違い一人称っぽく作業を進めていくことを目指す。記事を見て周辺ライブラリも必要だと分かったので、一発でインストールできないのを知りつつもゆっくりインストールしていくという意味での苦しみである。事前知識をしっかり入れてしまっているが、そこはご愛嬌。

最新版のApache HTTP Server(以下Apacheという。)をインストールする系の記事はたくさんあり、悩まないように綺麗にサマリー化されている。「必要なライブラリを先にインストールしておく。必要なのは〇〇と××と、、、」と記事に書いてある通りに進めると最新版のApacheはインストールできた。が、自分の環境で本当に必要なのか分からないものを入れてしまう可能性があると思ったので、自力でインストールをしたい。

今回インストールする対象はApacheだが、このやり方(:必要最低限のものをインストール)は他のインストール作業にも転用できると思うので、残しておく。出力が違ったりするかもしれないので、適宜環境に合わせて対応してほしい。
※ロケールが日本語になっているのでそこも注意

作業を進める前に前提を確認しておきたい。記事を読んでるので、以下事項は知っているものとする。

  • 最新版のApacheはiusリポジトリからインストールする
  • 最新版のApacheのインストールには何やらhttpd以外も色々必要
    • エラーに従い、必要なものだけをインストールする
  • デフォルトリポジトリからインストールできるApacheのバージョンは2.4.6

ちなみに、yumコマンドについて先日記事を書いたので宣伝しておく。
https://zenn.dev/awonosuke/articles/f43f4b62340ad3

(デフォルトリポジトリからApacheをインストール、削除する)

新しくApacheをインストールする人はこの工程は全くいらない。あくまでApacheをデフォルトリポジトリからインストールしている状況を再現するために行なっているだけ。

2.4.6をインストール、起動、有効化してみる

消すと分かっていながら、設定を進める。

# yum -y install httpd
依存性関連をインストールしました:
httpd-tools.x86_64 0:2.4.6-97.el7.centos.5      mailcap.noarch 0:2.1.41-2.el7

# httpd -v
Server version: Apache/2.4.6 (CentOS)
Server built:   Xxx XX 20XX XX:XX:XX

// 必要があれば*.confをいじる
# vi /etc/httpd/conf/httpd.conf

# systemctl start httpd
# systemctl enable httpd

※依存関係の解決のためhttpd-tools、mailcapが一緒にインストールされいてる

虚しくもインストールしたものを消す

設定の無効化、サービスを止めてからアンインストールする。削除する際に周辺の依存関係を持つライブラリが消えることを確認する。
※httpdを削除しても/etc/conf, /etc/conf.d配下ファイルは残るが*.conf.rpmsaveとしてバックアップになっている可能性あるので出力を注意して確認すること。

# systemctl disable httpd
# systemctl stop httpd

// httpd、httpd-toolsを消す
# yum remove httpd
...
警告: /etc/httpd/conf/httpd.conf は /etc/httpd/conf/httpd.conf.rpmsave として保存されました。
...
削除しました: httpd.x86_64 0:2.4.6-97.el7.centos.5

依存性の削除をしました:   mod_ssl.x86_64 1:2.4.6-97.el7.centos.5   php.x86_64 0:7.4.33-1.el7.remi

完了しました!


# yum remove httpd-tools
...
削除しました:   httpd-tools.x86_64 0:2.4.6-97.el7.centos.5

完了しました!

ここで注目しておくべきなのは依存関係によってhttpd以外で削除されたライブラリがあることである。こんな感じでyumは自動的に依存関係を自動で解決してくれるので便利。
mod_ssl、phpが削除されているという感じ。(どんな環境かによるので、各自確認のこと)

さて、それでは最新版httpdをインストールに臨む。

必要リポジトリのインストール

初期にインストールされている有効リポジトリを確認

// 有効になっているリポジトリを確認
# yum repolist
リポジトリー ID
base/7/x86_64
elrepo
epel/x86_64
extras/7/x86_64
updates/7/x86_64

// 有効、無効問わずインストールしているリポジトリ一覧を確認する場合
# yum repolist all
リポジトリー ID
...

※自分の環境では、既に今回必要なepelリポジトリ入っていた(環境による)

epel、iusリポジトリのインストール

httpdのインストールに必要なepel、iusリポジトリをインストールしておく。

// epelリポジトリをインストール、非有効にする
# yum -y install epel-release
# yum-config-manager --disable epel

// 非有効になっていることを確認(標準出力がないことを期待する)
# yum repolist | grep epel

// iusリポジトリをインストール、非有効にする
# yum -y install https://repo.ius.io/ius-release-el7.rpm
# yum-config-manager --disable ius

// 非有効になっていることを確認(標準出力がないことを期待する)
# yum repolist | grep ius
小ネタ

最新のhttdのインストールに臨む

では、いよいよ最新のhttpdをインストールしていく。

当たって砕けろでしっかりコケる

iusリポジトリから最新のhttpdのインストールを試みる。

// デフォルトリポジトリに登録されているhttpdをインストールしないため、念の為非有効にしておく
// ※ yum installは自動的に高いバージョンを採用するらしいが、確証はないので対策しとく
# yum -y install --disablerepo=base,extras,updates --enablerepo=ius httpd
...
--> 依存性解決を終了しました。
エラー: パッケージ: httpd24u-2.4.54-2.el7.ius.x86_64 (ius)
             要求: libnghttp2.so.14()(64bit)
エラー: パッケージ: httpd24u-2.4.54-2.el7.ius.x86_64 (ius)
             要求: libbrotlienc.so.1()(64bit)
エラー: httpd24u-tools conflicts with httpd-tools-2.4.6-97.el7.centos.5.x86_64
...

やった!!予想通りコケた!!(意味不明)

コケた理由を特定

ということで、コケた理由を見てみる。

出力結果から以下の2つが必要らしいことが分かる。

  • libnghttp2.so.14()(64bit)
  • libbrotlienc.so.1()(64bit)

yum providesでどのパッケージに含まれるのか検索してみる。(実際にはepelリポジトリに両方含まれることは知っている。)

# yum provides --enablerepo=epel,ius libnghttp2
libnghttp2-1.33.0-1.1.el7.x86_64 : A library implementing the HTTP/2 protocol
リポジトリー        : epel

// これでは見つからない
# yum provides --enablerepo=epel,ius libbrotlienc
No matches found
小ネタ

libnghttp2はepelリポジトリに含まれることは分かった。
libbrotliencは見つからないので、googleで検索してみる。すると以下サイトが見つかった。
https://www.linuxfromscratch.org/blfs/view/svn/general/brotli.html
https://ai-soldier.work/install-apache/

brotliという圧縮アルゴリズムらしく、参考記事からepelリポジトリに入っていることが分かった。
それでは両方をインストールする。

# yum -y install --enablerepo=epel libnghttp2 brotli

さて、もう一度当たって砕けろでhttpdのインストールを試みる。

# yum -y install --disablerepo=base,extras,updates --enablerepo=ius httpd
依存性関連をインストールしました:
apr15u.x86_64 0:1.5.2-2.ius.el7
apr15u-util.x86_64 0:1.5.4-3.ius.el7
httpd24u-filesystem.noarch 0:2.4.54-2.el7.ius
httpd24u-tools.x86_64 0:2.4.54-2.el7.ius

完了しました!

// バージョン確認
# httpd -v
Server version: Apache/2.4.54 (IUS)
Server built:   Xxx XX 20XX XX:XX:XX

※依存関係の解決のためapr15u、apr15u-util、httpd24u-filesystem、httpd24u-toolsが一緒にインストールされている

httpdの動作確認

無事インストールが完了したので、httpdの動作確認をする。

# systemctl start httpd
# systemctl status httpd
...
Active: active (running) since X 20XX-XX-XX XX:XX:XX JST; XXs ago
...

動いてる、OK!
今回は全く設定してないが、本来ファイアーウォールの設定、WAFの導入、Apacheのセキュリティ設定は検討しておきたい。

他の記事ではもっと色々入れていたが思ったより必要ないな、と感じた。

おまけ

HTTPS化する

SSL/TLS証明書を発行しHTTPS通信に対応させるのが当たり前になっているので、Let's EncryptクライアントであるcertbotとApache用プラグインをインストールする。設定方法の詳細が知りたい場合、リンクを参考にしてみると良い。

これに関してはおまけなのでサラッと終わらせる。コケた場合は、httpdと同様に必要ライブラリをインストールしていく。

// certbot、python-certbot-apacheのインストール
# yum -y install --enablerepo=epel,ius certbot python-certbot-apache

※依存関係の解決のためにたくさんインストールされる

--apacheオプションを付けると自動でSSL周りの設定が書かれた*.confファイルを/etc/httpd/conf.d/配下に作ってくれる。(ファイル名はdomain-le-ssl.confの形で作成される)

// 証明書発行(対象ドメインがServerNameディレクティブに設定されている前提)
# certbot --apache -d domain

// 対象のドメインの証明書、ssl用のdomain-le-ssl.confを確認
# ls /etc/letsencrypt/live/ | grep domain
domain

# ls /etc/httpd/conf.d/ | grep domain
domain-ls-ssl.conf
domain.conf

// Apache再起動
# systemctl restart httpd

※オプションについてはcertbot helpで確認できるので、読んでみると良いかも

誰かを救うかもしれない小ネタ

https://rainbow-engine.com/letsencrypt-apache-centos/
https://weblabo.oscasierra.net/letsencrypt-2/
https://qiita.com/dolcano/items/4ad38ec85d0fd27a229c
https://qiita.com/s-katsumata/items/629222b24113d7a49b79

TLSのバージョンについて

この記事では(現時点で)最新のApacheをyumコマンドでインストールを進めたが、CentOSのBaseリポジトリに含まれるOpenSSLのバージョンは1.0.2系までしか対応していない。(CentOSの場合)1.1.1などはソースからビルド、コンパイルしてインストールする必要がある。また、yumでインストールするApache(+mod_ssl)ではシステム依存で有効になっているOpenSSLのバージョンが有効になった状態でビルドされる。

https://stackoverflow.com/questions/56172724/apache-reporting-illegal-protocol-when-using-tlsv1-3-with-openssl-1-1-1b-insta
https://teratail.com/questions/226010

そもため、CentOSでTLSv1.3対応のWebサーバー(Apache)を用意したいのであれば、ソースからビルドする必要がある。ApacheのTLS1.3に対応させる手順は別の記事で備忘録としてインストール記事を書こうと思っている。

参考URL

https://trios.pro/apache-version-list/
https://self-development.info/【セキュリティ対策】脆弱性のあるapache-2-4のアップデ/
https://trios.pro/centos7-apache2-4-latest/
https://www.rem-system.com/httpd-ius-install/
http://labo-blog.aegif.jp/2020/08/centos7apache-httpd2443iusurl.html
https://www.maruweb.jp.net/wp/?p=5376
https://server-recipe.com/3982/
https://iwatani.tv/linux-server/centos7-apache/
https://atmarkit.itmedia.co.jp/ait/articles/1107/22/news142.html

Discussion