Debian backports から最新の libssl をインストールする
Debian backportsは、便利なリポジトリで、
backports とは、あるパッケージの新バージョン——Linux カーネル、Iceweasel ブラウザ、OpenOffice.org スイートなどを、 システムの全体の安定度を損うことなく安定版ディストリビューションのユーザに提供するために、 テスト版ディストリビューションから現在の安定版 (あるいは旧安定版も) のリリース向けに再コンパイルされたパッケージのことです。
とあるように 安定性を確保しつつ新しいバージョンを取り込むことができる Debian 公式リポジトリの一つです。
先に記述したように HTTP/2 を利用するには、OpenSSL の 1.0.2 以上が必要です。
そこで、nginx上で HTTP/2 を動作させるための必要最小限のライブラリだけ(ここでは、libssl の 1.0.2 以上)インストールします。
では、 backports から 最新のlibsslをインストールしてみましょう。
Debian backports をパッケージダウンロード先として登録する
/etc/apt/sources.list の末尾に以下を追記し、リポジトリの登録を行います。
$ vi /etc/apt/sources.list
...
deb http://ftp.debian.org/debian jessie-backports main
|
sources.list の書式
- バイナリパッケージの書式:
deb URL Distribution [component1] [component2]…
- ソースパッケージの書式:
deb-src URL Distribution [component1] [component2]…
apt-get でキャッシュならびシステムの更新を行う
ダウンロード先の登録などを行った場合は、キャッシュ情報など更新のために apt-get (aptitudeでも可) でアップデートを行います。
$ apt-get update
...
Reading package lists... Done
|
apt-get (aptitudeでも可) で最新の libssl をインストールする
$ apt-get -y install -t jessie-backports libssl1.0.0
...
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下の追加パッケージがインストールされます:
libssl-dev
以下のパッケージはアップグレードされます:
libssl-dev libssl1.0.0
アップグレード: 2 個、新規インストール: 0 個、削除: 0 個、保留: 43 個。
...
取得:1 http://ftp.debian.org/debian/ jessie-backports/main libssl-dev amd64 1.0.2l-1~bpo8+1 [1,542 kB]
取得:2 http://ftp.debian.org/debian/ jessie-backports/main libssl1.0.0 amd64 1.0.2l-1~bpo8+1 [1,295 kB]
...
libssl1.0.0:amd64 (1.0.2l-1~bpo8+1) を設定しています ...
libssl-dev:amd64 (1.0.2l-1~bpo8+1) を設定しています ...
libc-bin (2.19-18+deb8u10) のトリガを処理しています ...
|
一応、インストールを終えたら、バージョンを確認してみましょう。
$ openssl version
OpenSSL 1.0.1t 3 May 2016 (Library: OpenSSL 1.0.2l 25 May 2017)
|
Library が、1.0.2l となっている点に注意してください。
(参考)最新の libsslをインストールしていない場合は、以下のように表示されるはずです。
$ openssl version
OpenSSL 1.0.1t 3 May 2016
|
apt-get upgrade 時の Priority を設定する
最後に、 libssl1.0.0 がより現状のバージョンより新しいバージョンがリリースされた場合、
apt-get upgrade で更新されるように設定しておきます。
/etc/apt/preferences.d/backports を作成しておきます。(ファイル名はなんでも良いです。)
Package: libssl1.0.0
Pin: release a=jessie-backports
Pin-Priority: 500
|
これを設定しておくと jessie-backports からlibssl1.0.0だけが、apt-get upgrade で更新の対象となります。
また、同一バージョンかそれ以上が、他のリポジトリに存在すれば、そちらがインストールされるでしょう。
(Pin-Priority: 500 は、通常リポジトリのそれと同じ値です。)
以下は、上記の設定を行った時のパッケージの優先順位を出力したものです。
通常リポジトリでは、優先順位が 500 になっていますから、先に記述したように
同一バージョンかそれ以上が、通常リポジトリに存在すれば、そちらが優先的にインストールされます。
(現状では、最新版がbackportsからインストールされていますので、そのバージョンを超えない限りアップデートされません。)
以下は、apt-cache コマンドで確認をしています。大丈夫そうですね。
$ apt-cache policy libssl1.0.0
libssl1.0.0:
インストールされているバージョン: 1.0.2l-1~bpo8+1
候補: 1.0.2l-1~bpo8+1
パッケージ Pin: 1.0.2l-1~bpo8+1
バージョンテーブル:
*** 1.0.2l-1~bpo8+1 500
100 http://ftp.debian.org/debian/ jessie-backports/main amd64 Packages
100 /var/lib/dpkg/status
1.0.1t-1+deb8u6 500
500 http://ftp.jp.debian.org/debian/ jessie/main amd64 Packages
500 http://security.debian.org/ jessie/updates/main amd64 Packages
|
Debian の backports リポジトリは、基本的に
Priority が 100 となっています。
つまり、インストール済の状態です。
そのため、一般的な apt-get upgrade を実行しても、仮に、backports リポジトリに最新バージョンが存在したとしても
アップデートされることはありません。
$ apt-cache policy nginx
nginx:
インストールされているバージョン: (なし)
候補: 1.6.2-5+deb8u5
バージョンテーブル:
1.10.3-1+deb9u1~bpo8+2 0
100 http://ftp.debian.org/debian/ jessie-backports/main amd64 Packages
1.6.2-5+deb8u5 0
500 http://security.debian.org/ jessie/updates/main amd64 Packages
1.6.2-5+deb8u4 0
500 http://ftp.jp.debian.org/debian/ jessie/main amd64 Packages
|
上記の例は、nginxが 通常リポジトリより backportsにより新しいバージョンが存在しますが、
通常リポジトリの 1.6.2-5+deb8u5 が候補となっています。
リポジトリとパッケージ管理方法については、Debian(Ubuntu)で apt-get upgrade で自動更新したくない場合の対応 を参照してください。
この libssl1.0.0 を backports からインストールせずに、
むりやり HTTP/2 対応の nginx の インストールしようとしても以下のように受け付けてくれません。
$ apt-get install -t jessie-nginx-http2 nginx
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
インストールすることができないパッケージがありました。おそらく、あり得
ない状況を要求したか、(不安定版ディストリビューションを使用しているの
であれば) 必要なパッケージがまだ作成されていなかったり Incoming から移
動されていないことが考えられます。
以下の情報がこの問題を解決するために役立つかもしれません:
以下のパッケージには満たせない依存関係があります:
nginx : 依存: nginx-full (>= 1.12.1-1~dotdeb+http2+8.1) しかし、インストールされようとし ていません または
nginx-light (>= 1.12.1-1~dotdeb+http2+8.1) しかし、インストールされようとしていません または
nginx-extras (>= 1.12.1-1~dotdeb+http2+8.1) しかし、インストールされよう としていません
依存: nginx-full (< 1.12.1-1~dotdeb+http2+8.1.1~) しかし、インストールされようと していません または
nginx-light (< 1.12.1-1~dotdeb+http2+8.1.1~) しかし、インストールされようとしていません または
nginx-extras (< 1.12.1-1~dotdeb+http2+8.1.1~) しかし、インストールされよ うとしていません
E: 問題を解決することができません。壊れた変更禁止パッケージがあります。
|
急がば回れではありませんが、まずは、確実にやっておきましょう。
Dotdeb から HTTP/2 対応のnginxをインストールする
Dotdeb から HTTP/2 対応のnginxをインストールするために、以下に簡単な手順を解説しておきます。
Dotdebのサイトをパッケージダウンロード先として登録する
/etc/apt/sources.list の末尾に以下を追記し、リポジトリの登録します。
この時、Distribution の指定に注意してください。
一般的には、 Debian 8 なら jessie のみの場合が多いですが、ここでは、
jessie-nginx-http2 と指定します。
$ vi /etc/apt/sources.list
...
deb http://packages.dotdeb.org jessie-nginx-http2 all
deb-src http://packages.dotdeb.org jessie-nginx-http2 all
|
Dotdebのサイトから、パッケージの公開鍵をダウンロードし、apt-keyで追加する
apt-get でキャッシュならびシステムの更新を行う
ダウンロード先の登録などを行った場合は、キャッシュ情報など更新のために apt-get (aptitudeでも可) でアップデートを行います。
$ apt-get update
...
Reading package lists... Done
...
$ apt-cache policy nginx
nginx:
インストールされているバージョン: 1.12.1-1~jessie
候補: 1.12.1-1~jessie
バージョンテーブル:
*** 1.12.1-1~jessie 0
500 http://nginx.org/packages/debian/ jessie/nginx amd64 Packages
100 /var/lib/dpkg/status
1.12.1-1~dotdeb+http2+8.1 0
500 http://packages.dotdeb.org/ jessie-nginx-http2/all amd64 Packages
1.12.0-1~jessie 0
...
|
ここでは、Dotdebと同じ最新版がインストールされています。
次に、バージョン(1.12.1-1~dotdeb+http2+8.1)を指定してインストールします。
apt-get で HTTP/2 対応のnginxをインストールする
ここでは、既にnginx がインストールされているものとして解説しています。
nginx が、既存バージョンとリポジトリが異なる場合、設定ファイルの構成が異なる場合があり、うまくアップデートできない場合があるため
バージョン指定(あるいはターゲット指定)のアップデートでなく、一旦、削除してクリーンインストールしています。
では、早速、簡単に解説してみます。
設定ファイルおよび関連ファイルの全バックアップ
nginxの設定ファイルあるいは個別になにか必要な関連データがあれば、全バックアップを行ってください。
$ tar cfz /var/log/nginx.backup.tar.gz /etc/nginx
...
...
|
nginx を全削除
nginx を 一旦、全削除を行います。
$ apt-get purge nginx
...
|
dotdeb の最新版 nginx をインストール
dotdeb の最新版 nginx をインストールします。
$ apt-get install -t jessie-nginx-http2 nginx
...
$ nginx -V
nginx version: nginx/1.12.1
built with OpenSSL 1.0.2l 25 May 2017
TLS SNI support enabled
...
|
nginx のバージョン情報の中で、OpenSSL 1.0.2 以上になっていることを確認します。
nginx の設定ファイルを戻す
先にバックアップした nginx の設定ファイルをもとに戻します。
$ service nginx stop
$ tar cfz /var/log/nginx.backup_new.tar.gz /etc/nginx
...
$ rm -fR /etc/nginx
$ tar xfz /var/log/nginx.backup.tar.gz -C /
...
$ service nginx start
|
nginxを起動して問題なければOKです。
うまく起動できない場合は、設定ファイルがあまりにも古い設定のままになっているのかもしれません。
先に、バックアップした新しい nginx の設定ファイル を参考に、設定ファイルを見直してみてください。
apt-get upgrade 時の Priority を設定する
最後に、 nginx がより現状のバージョンより新しいバージョンがリリースされた場合、
apt-get upgrade で dotdeb から 更新されるように設定しておきます。
/etc/apt/preferences.d/nginx を作成しておきます。(ファイル名はなんでも良いです。)
Package: nginx
Pin: origin packages.dotdeb.org
Pin-Priority: 999
|
これを設定しておくと nginxに関しては、dotdeb のnginx を最優先でアップデートします。
Pin-Priority: 999 は、最優先となります。
apt-get -t で指定した場合でも その時の Pin-Priority: 990 ですから、それさえも無視されます。
もし、それと同等レベルにする場合は、990 程度に設定してください。
以下は、apt-cache コマンドで確認をしています。大丈夫そうですね。
$ apt-cache policy nginx
nginx:
インストールされているバージョン: 1.12.1-1~dotdeb+http2+8.1
候補: 1.12.1-1~dotdeb+http2+8.1
パッケージ Pin: 1.12.1-1~dotdeb+http2+8.1
バージョンテーブル:
1.12.1-1~jessie 999
500 http://nginx.org/packages/debian/ jessie/nginx amd64 Packages
*** 1.12.1-1~dotdeb+http2+8.1 999
500 http://packages.dotdeb.org/ jessie-nginx-http2/all amd64 Packages
100 /var/lib/dpkg/status
1.12.0-1~jessie 999
500 http://nginx.org/packages/debian/ jessie/nginx amd64 Packages
1.12.0-1~dotdeb+http2+8.1 999
500 http://packages.dotdeb.org/ jessie-nginx-http2/all amd64 Packages
...
|
HTTP/2 対応するようnginxの設定ファイルを編集する
HTTP/2 対応するようnginxのサーバの設定ファイルを編集します。
対応させたいウェブサーバの設定ファイルを編集します。
ここでは、例として /etc/nginx/conf.d/exmaple.com.conf が既に存在するものとします。
ssl のポート指定のところに http2 を追記するだけです。
...
server {
listen 443 ssl http2;
...
|
サーバ設定の http2 を追記しただけです。
編集を終えたら、nginx の設定ファイル再読み込みを実行してください。
$ service nginx reload
|
HTTP/2 に対応できたか動作確認を行ってみる
nginxがHTTP/2 に対応できたか動作確認を行ってみます。
これらの動作確認においては、ほとんどウェブブラウザで行うことができます。
ここでは、 Firefox と Chrome を使って、確認してみましょう。
Firefox で確認してみます。
- Firefoxを起動し、メニューを表示、[開発ツール]をクリックします。
- 開発ツールメニューの[ネットワーク]をクリックします。
- 開発ツール画面が表示されたら、ターゲットのページを表示します。
読み込んだファイルの一覧が、つらつらと流れるように表示されていきます。
ファイルの一覧の中のトップのターゲットページのファイルをクリックすると、右側に画面が表示され、
そこに バージョン : HTTP/2.0 が表示されれば、ちゃんと HTTP/2 に対応していることになります。
Chrome で確認してみます。
- Chromeを起動し、メニューを表示、[その他のツール] – [デベロッパーツール]をクリックします。
- デベロッパーツール画面が表示されたら、[Protocol]の表示項目があるか確認します。
なければ、表題を右クリックし、表示項目一覧の中から[Protocol]の項目にチェックを入れます。
- ターゲットのページを表示します。
読み込んだファイルの一覧が、つらつらと流れるように表示されていきます。
ファイルの一覧の中のトップのターゲットページのファイルの [Protocol] 表示欄が、 h2 と表示されていれば、ちゃんと HTTP/2 に対応していることになります。
HTTP/2 で読み込み速度は速くなるのか、遅くなるのか?
最後にHTTP/2 で読み込み速度は速くなるのか、遅くなるのか??一応、ブラウザで確認してみました。
ここでは、 Chrome を使って、確認してみました。
HTTP1.0の読み込み速度
見づらいかもしれませんが、画面下にLoad 3.86 s と表示されました。
HTTP/2.0の読み込み速度
見づらいかもしれませんが、画面下にLoad 3.82 s と表示されました。
実際には、数回、試してみましたが、正直、そんなに差があるとは思いませんでした。
一応、HTTP/2 は、SSL/TLS接続における高速化が目的とされています。
プロセスリソースの削減やサーバープッシュ(簡単にいうと、あらかじめ登録しておいたファイルをブラウザからの要求なしに送り付ける機能)、
ヘッダの圧縮化、バイナリ転送などの様々な機能が盛り込まれています。
それらの機能をうまく活用するためには、これだけでは不十分ですし、まだまだサーバ側の設定も必要です。
ただ、あまりサーバの設定をカスタマイズせずに、もう少し、速さの違いが見えてくるのかなぁ・・と思っていましたが、
少々、思惑が違ったという感じです。(期待しずぎ?でしたかね。)
それでも、運用上では、それなりに効果はあるのだろうと思います。
今回は、テストの環境も一定でないですし、回数も少ないですから、サーバの負荷状態や回線の込み具合などによっても効果の違いはあるのかなぁというのが、率直な感想です。
いかがだったでしょうか?
HTTP/2 の導入に、OpenSSL 1.0.1 ベースの Debian 8 でビルド(make)せずにできないかなぁと思ってやってみました。
ちょっと、詳しく段取りを解説しすぎた感じはありますが、ご参考になさってはいかがでしょうか。
コメントを投稿 :