Makery Blog

西麻布のクリエイティブラボ「Makery」でテクノロジーとアイデアをこねています。

Webサーバのソフトウェア・アップデートについて考えてみた

f:id:bbmedia:20180622114516p:plain

はじめに

テクノロジーデザイングループの木村です。
この記事では、ビービーメディアで使用頻度の高いCentOSを例に、WebサーバOSのアップデート設定をどのように行うかを考えてみたいと思います。

皆さんが普段利用されているパソコンには、Windowsには「WindowsUpdate」、MacOSにも「ソフトウェア・アップデート」と、それぞれ必要に応じてOSの自動更新を行う機能が存在しています。
Webサイトを公開するためのWebサーバも、(OSの種類こそ違いますが) 個人向けのパソコンと同じような仕組みで動作しているため、OSやミドルウェアのアップデートはやはり必要です。
しかし、Webサーバ向けのOSでは個人用パソコンとは異なり、通常デフォルトの状態では自動更新はオンになっていないため、サーバ管理者が都度設定を行うことになります。
共用レンタルサーバやroot権限なしのマネージドサーバを利用する場合、特にこれらのアップデートを意識することはありませんが、VPSAWSなどのクラウドサーバを使用する場合、サーバ管理者はこれらの仕組みについて理解しておく必要があります。

最低限の自動アップデート

CentOSでは、OSにインストールされるアプリケーションの管理ツールとして、yumという仕組みが存在します。
例えば、サーバOSにログインした状態で以下のコマンドを実行すると、インターネットから対象のソフトウェアをダウンロードし、新規インストールすることができます。

yum -y install httpd

インストール済みのソフトウェアをアップデートするコマンドはこちらです。

yum update -y

この仕組みを使用して、例えば朝4時に「yum update」を自動で実行するように定期実行を行えば、アップデートを行うことは可能です。
ここで注意が必要なのが、「yum update」を行っても、即座に更新内容が反映されるとは限らないということです。
例えば、すでに起動済みのアプリケーションに対して新しいバージョンへの更新がインストールされた場合、一度ソフトウェアの再起動を行わないと、変更が反映されません。
アップデートの定期実行を行った後で合わせて再起動も行うためには、以下のように複数のコマンドを組み合わせて設定する必要があります。

yum update -y && /sbin/shutdown -r

自動アップデートの改善

これでソフトウェアの更新&再起動はかかるようになりましたが、この設定には若干の問題があります。
それは、特に何の更新もなかった場合にも、定期実行のたびにサーバOSが再起動されてしまうということです。
数分程度ではありますが、毎日再起動のタイミングでサーバダウンしているということになりますし、サーバの死活監視を設定している場合は、毎晩異常発生の通知が届いてしまいます。

不要な再起動を避けるためには、「yum update」による更新後に再起動の要・不要をチェックする必要があり、そのために「yum-utils」のツールを使用します。
まず、以下のコマンドでツールをインストールします。

yum install -y yum-utils

インストールが完了すると、needs-restarting コマンドが使用できるようになります。
このコマンドは 「needs-restarting -s」 でサービスとして起動しているプロセス(Web、FTPSSHなど)、「needs-restarting -r」 でカーネルなどコア部分をチェックし、再起動の必要があるソフトウェア名を一覧表示することができます。
例えば、以下のようなコマンドを定期実行すれば、自動的にソフトウェアのアップデートをチェックし、必要な場合は自動で再起動を行うことができます。

yum update -y; needs-restarting -r || shutdown -r

ただ、注意点として「needs-restarting -s」については再起動の必要がある場合でもコマンドが終了コード1 を返さないため、同様の書き方ができません。
そのため、サービスに更新があった場合はプロセスの再起動を行い、OSのコア部分に更新がある場合はOS自体の再起動を行う、などの細やかな自動化を行うためには別途シェルスクリプトを作成する必要があります。

自動アップデートを止める

そもそも、ソフトウェアの自動更新を行った際に自動で再起動がかかることについては若干のリスクがあります。
稀なケースだとは思いますが、OSのコア部分が自動でアップデートされ、再起動後にうまくソフトウェアが動作しなかった場合は長時間のサーバダウンが発生してしまいます。
一度適用した更新を元に戻すことは難しく、原因の調査・復旧にも時間がかかります。
このことを考慮してサーバの稼働率を重視する場合、アップデートについては管理者にメールで通知を行い、実際のアップデート作業や再起動は手動で行うことも可能です。
この場合、「yum-cron」を使用します。

インストールは以下のコマンドで行います。

yum install -y yum-cron

次に、yum-cronの設定ファイルを編集します。

vi /etc/yum/yum-cron.conf

色々な設定項目が存在するのですが、以下設定項目を修正します。

update_messages = yes
download_updates = no
apply_updates = no

email_to = (通知を行うメールアドレス)

修正した内容を保存したのち、以下の「service yum-cron restart」コマンドで稼働中のyum-cron を再起動すれば、毎日自動的にソフトウェアがアップデートをチェックし、更新がある場合は指定したメールアドレスに通知されるようになります。
通知を受けたらサーバマシンにSSHでログインし、手動で「yum update」や「needs-restarting」を行います。
この運用方法では、本番環境と同じ状態の開発用サイトを用意しておけば事前にテストを行うことも容易ですし、アップデートによって何か不具合が発生した場合も速やかに対処することができます。
一方で、OSやミドルウェアにアップデートが入る頻度はそこそこ高いので、管理するサーバの台数が増えたり、管理するOSの種類が増えアップデートのタイミングがバラバラになってくると適時対応していくのもなかなか大変になるので、悩ましいところです。

まとめ

今回取り上げたテーマは基本的な事ではあるのですが、案外掘り下げて説明されている記事を見かけないため、個人的な理解をまとめてみました。
ご意見、ツッコミなどあればお気軽に教えていただければ幸いです。