Hatena::ブログ(Diary)

Dマイナー志向 このページをアンテナに追加 RSSフィード

2015-09-27

ISUCON5で予選敗退しましたがアクセスログ解析ツールkataribeは充実しました

「チームSELinuxはEnforcing」としてishikawa84g、matsuu、netmarkjpの3人でISUCON5に参加したものの、スコアが伸びず予選敗退となりました。

最終スコアは3886。構成はVarnish+Python+MySQLでした。

ちなみにUbuntuだったためSELinuxはインストールしておらずEnforcingにしてません。すみません。でもAppArmorは有効にしたままだよ!

当初はGo言語で実装する予定だったものの、運営からGo言語の実装にはバグがあるとの事前通知があったため、バグ解消に時間をとられるのを嫌ってPythonを選択しました。しかしPythonの知見が乏しくツラい感じでした。選択ミスった…。

やったことはMySQLのチューニング、nginx→Varnishの差し替え、SQLのチューニングなどです。

VarnishにしたのはESIで部分キャッシュを実装するためでしたが、結局部分キャッシュを実装するところまで至りませんでした。

そのあたりもあって焦りが先に来てしまいなかなかスコアを伸ばせず撃沈となりました。

アクセスログ解析ツールkataribeについて

ISUCON5の事前準備として、前回のISUCON4参加時で作ったアクセスログ解析ツールkataribeを充実させました。

元々はgoのソースコードを直接書き換えて都度go buildする仕様でしたが、TOML形式の設定ファイルでカスタマイズできるようにしました。いくつかのチームは実際にISUCON5予選で使って頂いたようで、私として嬉しい限りです。俺の屍を越えてゆけ的な。

kataribeの特徴は、正規表現で複数のリクエストを束ねられることです。

例えばISUCON5予選では、以下のように設定しました。

(一部省略)
[bundles]
  [bundles.get_profile]
  name = "GET /profile/*"
  regexp = '^GET /profile/.*'
  [bundles.post_profile]
  name = "POST /profile/*"
  regexp = '^POST /profile/.*'
  [bundles.diary_entries]
  name = "GET /diary/entries/*"
  regexp = '^GET /diary/entries/.*'
  [bundles.diary_entry]
  name = "GET /diary/entry/*"
  regexp = '^GET /diary/entry/.*'
  [bundles.post_diary_comment]
  name = "POST /diary/comment/*"
  regexp = '^POST /diary/comment/.*'
  [bundles.post_friends]
  name = "POST /friends/*"
  regexp = '^POST /friends/.*'
  [bundles.css]
  name = "GET /css/*"
  regexp = '^GET /css/.*'
  [bundles.fonts]
  name = "GET /fonts/*"
  regexp = '^GET /fonts/.*'
  [bundles.js]
  name = "GET /js/*"
  regexp = '^GET /js/.*'

すると以下のような出力が得られます。

便利!

まだまだ至らない部分もあるツールですが、今後も徐々に改善していこうと思います。まる。

2015-08-30

ISUCON過去問で予選通過のスコアを再現できるようにした

今年のISUCONは「チームSELinuxはEnforcing」で参加するmatsuuです。

前回のエントリーでISUCON過去問を再現できるようにしましたが、予選時と異なるスペックでどこまでスコアを上げればいいのかわからないという問題がありました。

そこで、ほぼ予選通過のスコアを再現できるVagrantとAnsibleを用意しました。

現在はISUCON4予選のみ用意してます。ISUCON3予選は…まぁそのうち。

使い方

vagrant-isucon-passからVagrantfileをダウンロードしてvagrant upでokです。

既にvagrant-isucon(ansible-isucon)で構築したサーバがある場合は、サーバ内で以下の手順を踏むことでも構築できます。

git clone https://github.com/matsuu/ansible-isucon-pass.git
cd ansible-isucon-pass/isucon4-qualifier
ansible-playbook -i local playbook.yml

ベンチマーク

これを使って手元の環境でスコアを測ってみました。

環境初期スコアチューニング後備考
AWS m3.xlarge(vCPU 4個、メモリー15GB)124738862予選時のスペック
Macbook12inch+VirtualBox(メモリー2GB)63214850

ちなみにISUCON4の予選通過スコアは37808、私のチームのスコアは45742でした。当日のスコア一覧はこちら

まとめ

CPUスペックやメモリ容量が異なり、ボトルネックになる箇所が本来と異なる可能性があるため*1、このスコアもあくまで参考程度にしかなりませんが、ひとつの目安として使えるのではないかと思います。

何をチューニングしてるかはansible-isucon-passを覗けばわかりますが、まずは中身を見ずに自力でこのスコアを目指してみるのがいいと思います。Let's enjoy!

*1:一応できるだけメモリを節約しながらスコアを上げてみました

2015-08-15

ISUCON予選突破の鍵は過去問を解くことなので無料で試せるようにした(Vagrant+Ansible)

タイトルでいいきった。

ISUCON5参加者へのアドバイス

まもなくISUCON5が開催されますね。

毎年参加して予選突破を果たしている私からのアドバイスは、過去問を解いてチューニング力を高めることが重要です。これホント大事。

過去問やってる?

ですが、ISUCONの過去問はAWS用AMIとソースコード一式が用意して提供されているものの結構難しいんですよね。

  • AWSの利用は課金がつらい(特に学生)
  • AWSの利用はクレジットカードが必要でつらい*1
  • ソースコードから構築する方法がわからない(AMIの中身を見ないとわからないこと多数)

無料で過去問やろう

そこで無料かつ簡単に手元で構築できるよう、VagrantfileとAnsible用Playbookを用意しました。

https://github.com/matsuu/vagrant-isucon/

https://github.com/matsuu/ansible-isucon/

Vagrant+VirtualBoxの実行環境を用意すればお手軽に環境構築できます。

またVagrantが用意できなくても、CentOS6さえ用意すれば試せるようになっています*2

Pull Request歓迎

取り急ぎISUCON3ISUCON4の予選問題を用意しました。決勝問題やISUCON1, ISUCON2のpull requestお待ちしております。

過去問以外にやるべきこと

事前に予選で使われるプラットフォームに慣れておきましょう。操作がわからず時間を取られるのはもったいないです。

特に今回の予選はGoogle Cloud Platformが使われるため過去に参加された方も改めて操作方法を確認しておきましょう。

*1:AWSでは一部のプリペイド型クレジットカードが使えます

*2CentOS内でansibleを実行するのでansibleを別途用意する必要もない

2015-08-02

WoSign Free SSL Certificateが3年無料でマルチドメイン対応かつStartSSLがクロスルートと最強な件

TL;DR 申し込みはこちらから

はじめに

Let's Encryptが2015年9月14日の週から利用可能になる予定だったり、さくらインターネットがRapidSSL証明書1年分無料キャンペーンを展開するなど最近盛り上がりをみせるSSL証明書業界ですが、今ここに新たな救世主がやってきました。

それが中国系SSL認証局沃通(WoSign)が提供するWoSign Free SSL Certificateです。

http://www.wosign.com/pic/Logo_new.jpg

WoSign Free SSL Certificateの仕様

WoSign Free SSL Certificateは3年間無料、しかも1つのSSL証明書でマルチドメインに対応しています(100ドメインまで)。ま、マジで!

通常こういったマイナーな認証局が発行するSSL証明書はサポートするブラウザが極端に少なかったりするのですが、クロスルート方式でStartSSLをルート証明書にもつこともあり最近のブラウザであればそこそこカバーできているんじゃないかと思われます[要出典]

申し込み方法

申し込みはこちらからどうぞ。

詳しい説明はきっと誰かが書いてくれるんじゃないでしょうか。

導入例 matsuu.net

2015年現在matsuu.netのSSL証明書はWoSignを使っています。動作確認用にどうぞ。

SSL Labsの診断結果もこちらに貼り付けておきますね。証明書パスは脅威の3つ。

f:id:tmatsuu:20150802080727p:image

OCSP Staplingに関して

OCSP Staplingも設定可能です。WoSign用Trusted Certificate Chainはこちらに用意しました

matsuu.netはこれを使ってOCSP Staplingを設定済です。

過去の経緯

私がWoSignを知ったのは2015年2月に読んだWoSignを紹介する英語のブログがきっかけなのですが、当時のWoSignは申し込みページが中国語のみでクロスルートもSHA1しかなく、Google Chromeで見るとエラーが表示されてしまうなど残念仕様でした。

現在は英語ページも用意されクロスルートにもSHA2が用意されており、問題はひと通り解消したと思われます。

利用規約

利用規約は各自きちんとご確認ください。自己責任です。

2015-02-21

ApacheのAddHandlerはセキュリティ上の懸念から使用すべきではない

元ネタはこちら。

どういうことか

次のような指定は危険である。

AddHandler php5-script .php

この時に指定される.phpはファイル名の末尾である必要はない。例えば、

aaa.php.html
bbb.php.png

などもphp5-scriptとして解釈されてしまうのだ。これは.XXX.YYYと複数の拡張子が書かれた場合、.XXXと.YYYもAddHandlerの対象となることが原因。

ちなみに次のような場合にはphp5-scriptとして解釈されない。

ccc.php_foo (.php_fooとして解釈されるため)
ddd.php_bar.html (.php_barと.htmlとして解釈されるため)

実はこのことはApacheのドキュメントにも明記されている

Apache モジュール mod_mime 複数の拡張子のあるファイル

ファイル名のドット区切りでの最後の部分を使って、 特定の部分のメタデータにマッピングしたい場合は、 Add* ディレクティブは使わないでください。 たとえば foo.html.cgi を CGI スクリプトとして処理したいけれども、 bar.cgi.html は CGI スクリプトとしては処理したくない場合、 AddHandler cgi-script .cgi とする代わりに 次のようにしてください

Configure handler based on final extension only

<FilesMatch \.cgi$>
SetHandler cgi-script
</FilesMatch>

つまり仕様です。

あなたのサイト、大丈夫?

RHELCentOSでmod_phpが用意する/etc/httpd/conf.d/php.confは以下のように記載されていた。

AddHandler php5-script .php
AddType text/html .php

ビンゴです。

基本的に第三者がアップロードしたファイル名をそのまま使っていたりしなければ大丈夫だろうけど、うっかりミスでやってしまう可能性もあるし怖いですね。

対策

元ブログでや上記Apache公式ドキュメントでもFilesMatchとSetHandlerを組み合わせて使えと書かれていた。

  <FilesMatch "\.(php|php5|phtml)$">
    SetHandler application/x-httpd-php
  </FilesMatch>

  <FilesMatch "\.phps$">
    SetHandler application/x-httpd-php-source
  </FilesMatch>

上記RHEL/CentOSのphp.confも、とりあえずFilesMatchで囲んでやれば対策になりそう。

<FilesMatch "\.php$">
  AddHandler php5-script .php
  AddType text/html .php
</FilesMatch>

FilesMatchの中であればAddHandlerでもいいんじゃないかと思う。冗長だけどね。

残念ながら世の中にはAddHandlerを設定する方法を紹介するサイトで溢れかえっているし、Apache公式ドキュメントですら一部にAddHandlerを使っている。これは啓蒙活動が必要だね、というのが元ブログの主張でした。