文系プログラマによるTIPSブログ

文系プログラマ脳の私が開発現場で学んだ事やプログラミングのTIPSをまとめています。

EOLを迎えるapache2.2を2.4にアップグレードしよう!

f:id:treeapps:20170808011258p:plain

もうご存知だと思いますが、とうとうapache2.2系がEOL(End Of Life)を迎え、2017年12月が最後のセキュリティアップデートとなります。
[ANNOUNCE] Apache HTTP Server 2.4.25 Released

世の中のオンプレ案件や個人サイトではapache2.2を使っているケースが多いと思うので、2.4との違いやアップグレード時のエラー対応について、少しだけ手順をまとめてみようと思います。

概要

現在apache2.2系を使っていて、これから2.4にアップグレードする人向けの記事となります。

既にある2.2系の設定ファイルを2.4向けに修正していきます。

この記事ではバージョン2.4.6へ移行する記事となります。

2.2から2.4へ

インストール後に2.2と2.4のディレクトリ構成等でかなり戸惑うと思うので、順番にまとめていきます。

2.4をインストール

repoを入れてyumでインストールします。

cd /etc/yum.repos.d
sudo wget https://repos.fedorapeople.org/repos/jkaluza/httpd24/epel-httpd24.repo
sudo yum install httpd24

ディレクトリ構成等の違い

2.2と2.4で全然違うので、比較してみましょう。(yumでインストールした場合)

内容 2.2 2.4
ServerRoot /etc/httpd /opt/rh/httpd24/root/etc/httpd
システム設定 /etc/sysconfig/httpd /opt/rh/httpd24/root/etc/sysconfig/httpd
httpd /usr/sbin/httpd /opt/rh/httpd24/root/usr/sbin/httpd
apachectl /usr/sbin/apachectl /opt/rh/httpd24/root/usr/sbin/apachectl
起動スクリプト /etc/init.d/httpd /etc/init.d/httpd24-httpd
ログ /etc/httpd/logs /opt/rh/httpd24/root/etc/httpd/logs
modules /etc/httpd/modules /opt/rh/httpd24/root/etc/httpd/modules
DocumentRoot /var/www/html/ /opt/rh/httpd24/root/var/www/html
pid /var/run/httpd/httpd.pid /opt/rh/httpd24/root/var/run/httpd/httpd.pid
lock /var/lock/subsys/httpd /opt/rh/httpd24/root/var/lock/subsys/httpd

2.4のデフォルトServer MPMについて

[vagrant@node1 sbin]$ /opt/rh/httpd24/root/usr/sbin/apachectl -V
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1. Set the 'ServerName' directive globally to suppress this message
Server version: Apache/2.4.6 (Red Hat)
Server built:   Sep 25 2013 05:25:46
Server's Module Magic Number: 20120211:23
Server loaded:  APR 1.4.8, APR-UTIL 1.5.2
Compiled using: APR 1.4.8, APR-UTIL 1.5.2
Architecture:   64-bit
Server MPM:     prefork
  threaded:     no
    forked:     yes (variable process count)
Server compiled with....
 -D APR_HAS_SENDFILE
 -D APR_HAS_MMAP
 -D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
 -D APR_USE_SYSVSEM_SERIALIZE
 -D APR_USE_PTHREAD_SERIALIZE
 -D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
 -D APR_HAS_OTHER_CHILD
 -D AP_HAVE_RELIABLE_PIPED_LOGS
 -D DYNAMIC_MODULE_LIMIT=256
 -D HTTPD_ROOT="/opt/rh/httpd24/root/etc/httpd"
 -D SUEXEC_BIN="/opt/rh/httpd24/root/usr/sbin/suexec"
 -D DEFAULT_PIDLOG="/opt/rh/httpd24/root/var/run/httpd/httpd.pid"
 -D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
 -D DEFAULT_ERRORLOG="logs/error_log"
 -D AP_TYPES_CONFIG_FILE="conf/mime.types"
 -D SERVER_CONFIG_FILE="conf/httpd.conf"

実はデフォルトがpreforkなのです。これでは勿体無いので、nginxのようにevent mpmに変更したいですね。

2.2のServer MPMの変更方法

以下のようにhttpd.workerのコメントを外してhttpdを再起動します。

vi /etc/sysconfig/httpd

#HTTPD=/usr/sbin/httpd.worker
HTTPD=/usr/sbin/httpd.worker
2.4のServer MPMの変更方法

2.4では/etc/sysconfig/httpdで設定しません。

更に言うと、/opt/rh/httpd24/root/etc/sysconfig/httpdでも設定しません。

以下のように、00-mpm.confで設定する形に変わりました。

vi /opt/rh/httpd24/root/etc/httpd/conf.modules.d/00-mpm.conf
#LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
#LoadModule mpm_worker_module modules/mod_mpm_worker.so
LoadModule mpm_event_module modules/mod_mpm_event.so

デフォルトではpreforkのコメントが外れている状態なので、ここをmod_mpm_event.soのみコメントが外れている状態に変更すると、Server MPMがeventになります。

エラー集

2.2の設定ファイルの状態で2.4を起動した際に起きたエラーから、それぞれの対応策についてまとめます。

Ignoring deprecated use of DefaultType

DefaultTypeは廃止されたので削除します。

Either all Options must start with + or -, or no Option may.

2.2の頃は、以下のような記述をしていました。これが2.4になって、Optionsの部分は必ずプラスかマイナスを付ける必要があります。

<Directory "/var/www/html">
    Options -Indexes FollowSymLinks
    AllowOverride None
    Order deny,allow
    Allow from all
</Directory>

    Options -Indexes +FollowSymLinks

DocumentRoot must be a directory

DocumentRootの実体(ディレクトリ)が存在しないと、起動時にエラーになります。DocumentRootのフォルダを生成して下さい。

Invalid command 'SSLMutex', perhaps misspelled or defined by a module not included in the server configuration

以前は以下のように記述していましたが、記述方法が変わりました。

SSLMutex  "file:/etc/httpd/logs/ssl_mutex"

Mutex default ssl-cache

NameVirtualHost has no effect and will be removed in the next release

まだエラー扱いではありませんが、時期バージョンで削除されるぞ〜、と言われています。
単純にNameVirtualHostを削除します。

Invalid command 'RewriteLog', perhaps misspelled or defined by a module not included in the server configuration

これはちょっと嫌な仕様変更です。

今まではrewriteのログは以下のように出力していましたが、2.4になって記述方法が変わりました。

RewriteLog logs/rewrite.log
RewriteLogLevel 2

# see https://httpd.apache.org/docs/2.4/ja/mod/core.html#loglevel
LogLevel rewrite:info

ドキュメントにかかれていますが、2.4になって仕様が変わり、エラーログの中に混ぜ込む形でrewriteログが出力されるようになります。(誰得なんですかね・・・)

実質デバッグ用途でしか使えないものとなったと言えると思います。

allow deny等の権限の設定方法

今までの書き方は、以下でした。

order deny,allow
deny from all
allow from 192.168. 127.0.0.1

Require all denied
Require ip 192.168. 127.0.0.1

しかし、この変更は mod_access_compat.so モジュールが有効かどうかで変わります。

mod_access_compat.so はデフォルトで有効になっており(v2.4.6)、有効な場合、2.2の古い書き方と2.4の新しい書き方の両方で書けるようになります。

恐らくここが最も修正量が多い項目だと思うので、最初は mod_access_compat.so を有効にしておき、最後に少しづつ新しい書き方に直していく方が安全と思われます。

なお、将来的に2.2の書き方は完全に廃止される可能性が高いので、極力2.4の書き方に頑張って書き換えた方がいいです。

OpenSSLをLibreSSLに変更?

脆弱性祭りでお馴染みのOpenSSLですが、できればLibreSSLに移行したいですね。

しかし、CentOSだと5,6系ではyum repoが無く、7系にしかありません。Amazon LinuxはCentOS6系がベースと思われ、yumでインストールできません。

残念ながらソースからコンパイルするのが定石っぽいので、コンパイルしましょう。

しかしコンパイルとなると、アップグレードがちょっと嫌ですよね。こういう時「Dockerだったらお手軽で簡単だったのに・・・」と思いますね。

2.2の構成を再現する

あまりに構成が異なって戸惑う問題があるのと、パスが長すぎる問題があるので、レガシーな2.2の構成を再現してみます。

# ServerRoot
sudo ln -sfn /opt/rh/httpd24/root/etc/httpd /etc/httpd
# log
sudo ln -sfn /opt/rh/httpd24/root/var/log/httpd /var/log/httpd
# sysconfig
sudo ln -sfn /opt/rh/httpd24/root/etc/sysconfig/httpd /etc/sysconfig/httpd
# DocumentRoot
sudo ln -sfn /opt/rh/httpd24/root/var/www /var/www
# pid
sudo ln -sfn /opt/rh/httpd24/root/var/run/httpd /var/run/httpd
# lock
sudo ln -sfn /opt/rh/httpd24/root/var/lock/subsys/httpd /var/lock/subsys/httpd
# 起動スクリプト
sudo ln -sfv /etc/init.d/httpd24-httpd /etc/init.d/httpd

大体こんな感じで2.2の頃のパスが再現できると思います。

雑感

2.4をインストールすると、絶対みんなこう思うことでしょう・・・

/opt/rh/httpd24/root/etc/httpdってなんだ・・・

/etc/httpd24/ でいいじゃねえか!とか思いませんか?


それにしても、apache2.2系は世の中に死ぬ程沢山稼働している筈なので、2017/12を過ぎた後、悪い人達に真っ先に狙われるのではないかと思われます。

そのままapache2.2が脆弱性祭りになって第2のOpenSSLになってしまうと、私達開発者にとっては悩みの種になってしまうので、可能な限り速く2.4にするか、lighttpdにするか、いっそnginxにするか、等で移行した方がよさそうですね。

ついでにOpenSSLとも決別してLibreSSLに移行できると最高なのですが、なかなか政治的な理由でそれが難しかったりするのが悩みどころです。