Varnishのリリースは少し前に半年に一回行う様になりました。
もちろんその間にBugfixなどがされたりするのですが、その場合でも半年待つ必要があります。(クリティカルなバグについてはその限りではないはず)
では、どうしてもすぐに修正されたものを使いたかったりする場合はどうすればよいでしょうか?
今回はpkg-varnishcacheを利用してパッケージを作成する方法を紹介します。
今回の環境はUbuntu16.04LTS(Xenial)で作成するパッケージの対象はXenialとしてます
(2017-08-09追記)なお、記事中で修正箇所の記載がありますが、masterのものを使用する場合はまだpkg-varnish-cacheが追い付いてないことが多く当時は修正が必要だったということです。
バージョンにより修正が不要になったり、また別の修正が必要になったりするので注意が必要です。
sbuild環境の準備
最初にpkg-varnishcacheはsbuildを利用しているので環境を作ります。
ubuntu@xa:~$ sudo apt-get update ubuntu@xa:~$ sudo apt-get install -y sbuild schroot ubuntu-dev-tools ubuntu@xa:~$ sudo adduser ubuntu sbuild #ubuntu userの場合
adduserしたので一度セッションを切って再度ログインします。
buildに必要なパッケージをインストールします
ubuntu@xa:~$ sudo apt-get install -y git debhelper automake autotools-dev libtool pkg-config python-docutils libedit-dev libjemalloc-dev libncurses-dev libpcre3-dev python-sphinx dh-systemd
次にxenialのイメージを作成します。
やっているのはsources.listを日本のミラー(jp.archive.ubuntu.com)に向けているのとビルドに必要なパッケージのインストールです。
この作業をやっておくとビルドが早くなるのでお勧めです。
当然ながらパッケージはどんどん更新されているので、たまにupgradeしておくと良いと思います。
また、今回はxenialとしてますが、ここをtrustyにしたりすることで別のディストリビューション向けに作ることも可能です。
ubuntu@xa:~$ mk-sbuild xenial --arch=amd64 #↑で通らないときはmk-sbuild --distro=ubuntu xenial --arch=amd64で試してみてください ubuntu@xa:~$ sudo schroot -c source:xenial-amd64 -u root (xenial-amd64)root@xa:~# sed -i.bak -e "s%http://archive.ubuntu.com/ubuntu%http://jp.archive.ubuntu.com/ubuntu%g" /etc/apt/sources.list (xenial-amd64)root@xa:~# apt-get update (xenial-amd64)root@xa:~# apt-get upgrade -y (xenial-amd64)root@xa:~# apt-get install -y automake autotools-dev libedit-dev libjemalloc-dev libncurses-dev libpcre3-dev libtool pkg-config python-docutils python-sphinx git (xenial-amd64)root@xa:~# apt-get install -y debhelper dh-systemd (xenial-amd64)root@xa:~# logout
pkg-varnish-cacheの修正
次にpkg-varnish-cacheの取得と修正です。
そのままのものだとtrusty向けしかビルドできないので少し修正します。
ubuntu@xa:~$ git clone https://github.com/varnishcache/pkg-varnish-cache.git ubuntu@xa:~$ cd pkg-varnish-cache ubuntu@xa:~/pkg-varnish-cache$ vi package-deb
修正箇所は以下です。
ubuntu@xa:~/pkg-varnish-cache$ git diff diff --git a/package-deb b/package-deb index 2b5e9fc..7c68a1a 100755 --- a/package-deb +++ b/package-deb @@ -68,7 +68,7 @@ cd .. # By now we are done setting up and building the source package. -if [ "$V" = "3.0" ] || [ "$V" = "4.0" ] || [ "$V" = "4.1" ]; then +if [ "$V" = "3.0" ] || [ "$V" = "4.0" ] || [ "$V" = "4.1" ] || [ "$V" = "5.1" ]; then # Build binary packages for the requested releases inside chroots. for dist in $BINDISTS; do # Legacy packages embedded the release into the package version.
パッケージビルド
まずは公式で提供されているソースからパッケージを作ってみましょう。
ubuntu@xa:~$ curl http://repo.varnish-cache.org/source/varnish-5.1.1.tar.gz > sources/varnish-5.1.1.tar.gz ubuntu@xa:~$ BINDISTS=xenial ./package-deb
するとこんな感じでパッケージができます。
ubuntu@xa:~/pkg-varnish-cache$ BINDISTS=xenial ./package-deb ... +------------------------------------------------------------------------------+ | Summary | +------------------------------------------------------------------------------+ Build Architecture: amd64 Build-Space: 61528 Build-Time: 79 Distribution: xenial Host Architecture: amd64 Install-Time: 6 Job: varnish_5.1.1-0+daily+20170322.012214.dsc Machine Architecture: amd64 Package: varnish Package-Time: 88 Source-Version: 5.1.1-0+daily+20170322.012214 Space: 61528 Status: successful Version: 5.1.1-0+daily+20170322.012214 -------------------------------------------------------------------------------- Finished at 20170322-0123 Build needed 00:01:28, 61528k disc space You have new mail in /var/mail/ubuntu ubuntu@xa:~/pkg-varnish-cache$ ls build/ varnish-5.1.1 varnish_5.1.1-0+daily+20170322.012214.dsc varnish-dbgsym_5.1.1-0+daily+20170322.012214~xenial_amd64.ddeb varnish_5.1.1-0+daily+20170322.012214_amd64.build varnish_5.1.1-0+daily+20170322.012214_source.changes varnish-dev_5.1.1-0+daily+20170322.012214~xenial_amd64.deb varnish_5.1.1-0+daily+20170322.012214_amd64.changes varnish_5.1.1-0+daily+20170322.012214~xenial_amd64.deb varnish_5.1.1-0+daily+20170322.012214.diff.gz varnish_5.1.1.orig.tar.gz ubuntu@xa:~/pkg-varnish-cache$
次はgithubのコードからパッケージを作成してみましょう。
まずはソースを持ってきて、足りないディレクトリ(doc/html)を作成します。
ubuntu@xa:~$ git clone https://github.com/varnishcache/varnish-cache.git ubuntu@xa:~$ cd varnish-cache ubuntu@xa:~/varnish-cache$ mkdir doc/html
後はautogen.shを走らせた後に圧縮してビルドします。
ubuntu@xa:~$ cd varnish-cache ubuntu@xa:~/varnish-cache$ git pull ubuntu@xa:~/varnish-cache$ ./autogen.sh ubuntu@xa:~/varnish-cache$ cd .. ubuntu@xa:~$ rm pkg-varnish-cache/sources/varnish-trunk.tar.gz ubuntu@xa:~$ tar cfz pkg-varnish-cache/sources/varnish-trunk.tar.gz varnish-cache ubuntu@xa:~$ cd pkg-varnish-cache/ ubuntu@xa:~/pkg-varnish-cache$ BINDISTS=xenial ./package-deb
これでパッケージができると思います。
自分は環境がないので試していませんがrpmも作成できるはずなので、
RHEL/CentOSな人はpackage-rpmを使うとよいと思います。(多少必要なパッケージが変わると思います)
ddebをインストールしたいとき
ビルドの指定でkeep-debugがあるので通常の場合は不要なのですが、入れたいひとは以下のようにすると入ります。
そのままだとkeep-debugで入る.debugとConflictとするのでそれを削る感じです。
diff --git a/debian/rules b/debian/rules index c9e6246..b1203e8 100755 --- a/debian/rules +++ b/debian/rules @@ -79,4 +79,5 @@ override_dh_compress: dh_compress -X/usr/share/doc/varnish-doc/html override_dh_strip: - dh_strip --keep-debug + dh_strip
#with --keep-debug ubuntu@xa:~/pkg-varnish-cache/build$ sudo dpkg -i *ddeb (Reading database ... 76080 files and directories currently installed.) Preparing to unpack varnish-dbgsym_5.1.1-0+daily+20170325.112955~xenial_amd64.ddeb ... Unpacking varnish-dbgsym (5.1.1-0+daily+20170325.112955~xenial) over (5.1.1-0+daily+20170325.110252~xenial) ... dpkg: error processing archive varnish-dbgsym_5.1.1-0+daily+20170325.112955~xenial_amd64.ddeb (--install): trying to overwrite '/usr/lib/debug/.build-id/a0/654ed2469d729bc1c9652860fe3243c6c84358.debug', which is also in package varnish 5.1.1-0+daily+20170325.112955~xenial dpkg-deb: error: subprocess paste was killed by signal (Broken pipe) Errors were encountered while processing: varnish-dbgsym_5.1.1-0+daily+20170325.112955~xenial_amd64.ddeb #without --keep-debug ubuntu@xa:~/pkg-varnish-cache/build$ sudo dpkg -i *ddeb Selecting previously unselected package varnish-dbgsym. (Reading database ... 76038 files and directories currently installed.) Preparing to unpack varnish-dbgsym_5.1.1-0+daily+20170325.113630~xenial_amd64.ddeb ... Unpacking varnish-dbgsym (5.1.1-0+daily+20170325.113630~xenial) ... Setting up varnish-dbgsym (5.1.1-0+daily+20170325.113630~xenial) ...
多分必要なケースはほぼないと思います・・
[tips]panicメッセージでシンボルが表示されないものが何かを調べる
直接はpkg-varnishcacheとは関係ないのですが、これを使ってパッケージを作ってる人は
基本的に最新のものを使っていたりしてバグを踏んだりすることが多いと思いますのでtips的な・・・
Panic at: Wed, 22 Mar 2017 14:05:23 GMT Assert error in vrt_priv_dynamic(), cache/cache_vrt_priv.c line 114: Condition((vp)->magic == 0x24157a52) not true. version = varnish-5.1.1 revision 4d3037a, vrt api = 6.0 ident = Linux,4.4.0-24-generic,x86_64,-junix,-smalloc,-sfile,-sfile,-smalloc,-hcritbit,epoll now = 2149357.291496 (mono), 1490191522.571085 (real) Backtrace: 0x438945: /usr/sbin/varnishd() [0x438945] 0x44ac28: /usr/sbin/varnishd() [0x44ac28] 0x7f3eb15411ce: vcl_boot.1490188582.198924065/vgc.so(VGC_function_verificationCookie+0x9e) [0x7f3eb15411ce] 0x7f3eb15424ef: vcl_boot.1490188582.198924065/vgc.so(VGC_function_***_recv+0x1f) [0x7f3eb15424ef] 0x7f3eb1544d32: vcl_boot.1490188582.198924065/vgc.so(VGC_function_vcl_recv+0x13b2) [0x7f3eb1544d32] 0x4464f0: /usr/sbin/varnishd() [0x4464f0] 0x448d0a: /usr/sbin/varnishd(VCL_recv_method+0x5a) [0x448d0a] 0x43ccd9: /usr/sbin/varnishd(CNT_Request+0xd89) [0x43ccd9] 0x46130f: /usr/sbin/varnishd(h2_do_req+0x4f) [0x46130f] 0x451d72: /usr/sbin/varnishd() [0x451d72] thread = (cache-worker) ...
例えば上記のようなvarnishadm panic.showで表示されたbacktraceがあったとして
0x438945: /usr/sbin/varnishd() [0x438945] 0x44ac28: /usr/sbin/varnishd() [0x44ac28] 0x4464f0: /usr/sbin/varnishd() [0x4464f0] 0x451d72: /usr/sbin/varnishd() [0x451d72]
このシンボルが出ていないのが何かを調べるにはgdbを使います。
ubuntu@xa:~$ gdb /usr/sbin/varnishd GNU gdb (Ubuntu 7.11.1-0ubuntu1~16.04) 7.11.1 Copyright (C) 2016 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "x86_64-linux-gnu". Type "show configuration" for configuration details. For bug reporting instructions, please see: . Find the GDB manual and other documentation resources online at: . For help, type "help". Type "apropos word" to search for commands related to "word"... Reading symbols from /usr/sbin/varnishd...done. (gdb) info symbol 0x438945 pan_ic + 373 in section .text (gdb)
こんな感じで0x438945はpan_ic+373(0x175)だということがわかりました。
同じ様な感じで解決していくと
Backtrace: 0x438945: /usr/sbin/varnishd(pan_ic+0x175) [0x438945] 0x44ac28: /usr/sbin/varnishd(vrt_priv_dynamic+0x1b8) [0x44ac28] 0x7f3eb15411ce: vcl_boot.1490188582.198924065/vgc.so(VGC_function_verificationCookie+0x9e) [0x7f3eb15411ce] 0x7f3eb15424ef: vcl_boot.1490188582.198924065/vgc.so(VGC_function_***_recv+0x1f) [0x7f3eb15424ef] 0x7f3eb1544d32: vcl_boot.1490188582.198924065/vgc.so(VGC_function_vcl_recv+0x13b2) [0x7f3eb1544d32] 0x4464f0: /usr/sbin/varnishd(vcl_call_method+0x210) [0x4464f0] 0x448d0a: /usr/sbin/varnishd(VCL_recv_method+0x5a) [0x448d0a] 0x43ccd9: /usr/sbin/varnishd(CNT_Request+0xd89) [0x43ccd9] 0x46130f: /usr/sbin/varnishd(h2_do_req+0x4f) [0x46130f] 0x451d72: /usr/sbin/varnishd(WRK_Thread+0x4c2) [0x451d72]
わかりやすいバックトレースが得られるのでデバッグには便利かと思います。
まとめ
HTTP/2関連のコードの修正は活発なため最新のものを使うと良いと思います。
また、Varnish自体のリリース手順はこんな感じです。