internal がデフォルトで、特に問題もないしずっとこれにしていたが、h2o が再起動されるたびにキャッシュが消えるのではないか? どうせ memcached も起動してるのでそっちにストアすべきではないか? と思いはじめたので変えてみた。

まぁ弱小ウェブサイトだとそもそも resumption かかるようなことがぜんぜんないので意味ない。Google Bot も分散アクセスのせいか全く resumption しないし。

  1. トップ
  2. tech
  3. h2o の ssl-session-resumption のストア先を memcached に

最近子どもがとなりのトトロにハマってて毎日見てるんだけど、今朝は「お父さん」と「お母さん」が病院で会話しているシーンを見て、「星野源みたいねぇ」「ガッキーみたいねぇ」とか言いだして笑った。メガネかけてると星野源みたいねぇと言うのはしばしばあるんだけど、さらに「ガッキーみたいねぇ」は初めて聞いた。

最近は直接見てないはずなので (というか親が見ようとすると嫌がる)、結構前のを覚えているようだ。

↑ の写真 webp で Google Photos にアップロードしたんだけど、Chrome で見ても jpeg でしか配信されない。うーん…… いまいち webp 配信の条件がわからない。

Google Photos 上のサムネとかは webp になってるけど、大きめの画像は jpeg 固定なんだろうか

webp のインストール

homebrew で入れる。

$ brew install libtiff
$ brew install --HEAD webp
    • HEAD つけないとコンパイル済みの TIFF 非対応バイナリがインストールされるので注意

Export Actions にシェルスクリプトを置く

~/Library/Application Support/Adobe/Lightroom/Export Actions

にスクリプトを置くと、書き出しダイアログで選べるようになる。書き出したあとスクリプトの引数に現像済みファイル名が渡されるので、これを処理するようにすればよい。

以下のようなファイルを webp.rb という名前で Export Actions フォルダに保存して実行属性をつけておく。

#!/usr/bin/env ruby

require 'logger'

logger = Logger.new('/tmp/webplog')
logger.info ARGV.inspect

begin
	ARGV.each do |f|
		dir = File.dirname(f)
		out = File.join(dir, File.basename(f, ".tif") + '.webp')
		logger.info "%s => %s" % [f, out]
		IO.popen([
			'/usr/local/bin/cwebp',
			'-metadata', 'all',
			'-preset', 'photo',
			'-q', '90',
			'-o', out,
			'--',
			f
		], :err=>[:child, :out]) do |io|
			while l = io.gets
				logger.info l.chomp
			end
		end
	end

rescue Exception => e
	logger.fatal e.inspect
end

Lightroom の書き出し設定

ファイル設定

  • TIFF
  • 8 bit/チャンネル

として

「後処理」で「webp」を選ぶ

で書きだし。

問題点

EXIF が消える。cwebp が TIFF の EXIF デコードに非対応のため

  1. トップ
  2. tech
  3. Lightroom で webp の一発書きだし

リバースプロキシとして使っている h2o で

proxy.reverse.url: http://localhost:5001/

みたいに書いていたら確率的に connection failure がでて悩んだ。結局

proxy.reverse.url: http://127.0.0.1:5001/

で解決

なぜこうなったか

/etc/hosts に ::1 localhost のエントリ(IPv6)があり、h2o は解決したアドレスのうちからランダムに1つ選択するため。プロキシ先のバックエンドサーバは IPv6 を bind しておらず、::1 が選択された場合に接続に失敗していた。

メモ

  1. トップ
  2. tech
  3. h2o の proxy.reverse.url で localhost を指定していたら確率的に connection failure

start_server が listen してないポートは以下のようなエラーになる。

cp socket:(null):80 is not being bound to the server

h2o は SIGHUP で graceful restart が可能だが、listen するポートが変わった場合は実際にlistenしている親プロセス (start_server プロセス) の再起動が必要になる。

  1. トップ
  2. tech
  3. h2o で listen するポートを増やしたときは master プロセスの再起動が必要

これまで HTTPS (443) だけ h2o で処理していたが、nginx に使ってるぶんのメモリ量がMOTTAINAIのでh2oだけでやるようにした。さようなら nginx。

複雑なことをしているホストは全くなかったので普通に書きかえていっただけ

  1. トップ
  2. tech
  3. nginx をアンインストール