- 各種SNSをcatatsuyでやっている
- かたついと呼ばれることが多い
- ピクシブ株式会社で技術基盤チームと広告チームの兼任
- pixivの技術的な改善が主な業務
- 単著『pixivエンジニアが教えるプログラミング入門(星海社新書)
- ピクシブ社内の非エンジニア向けのプログラミング研修の書籍化
- pixiv社内ISUCONやISUCON6本選の問題作成
- 実はCPAN Authorです
- 仕事
- PHP(/JavaScript/Go/Ruby on Rails)
- 趣味
- Go
Perlは趣味でも仕事でも書く機会はあまりないですが、最近使ったPerlの話をします
- pixivを常時HTTPS化するまでの道のり(前編) - pixiv inside
- pixivを常時HTTPS化するまでの道のり(後編) - pixiv inside
- 本家YAPCでは常時HTTPS化についての発表を応募していました(落ちて悲しい😢)
- pixivの常時HTTPS化はperlで置換をしまくりました
git grep -l 'http://source.pixiv.net' | xargs perl -pi -e 's@http://source.pixiv.net@https://source.pixiv.net@g'
- CSPでmixed contentsはある程度発見できる
- ブラウザ拡張機能がmixed contentsにしても送られる
- HTTPSに対応していない配信広告事業者はほとんどない
- HTTPSに対応していないサービスの埋め込みは諦める
- 開発基盤チームが目指す事 #pixiv_night - Qiita
- PHP7化に向けて、Memcacheモジュールを廃止したい
- Memcachedモジュールは互換性がない
- メンテナンスが止まっているKyoto Tycoonを廃止したい
- memcachedプロトコルでマルチマスターレプリケーションが可能
- 永続データを扱える
- 以前の話ではRedisに移行しました
- nginxでアクセス制御をするためにKyoto Tycoonを使用
- Kyoto Tycoonに永続データが入っている
- pixivでは永続データはMySQLに極力寄せたい
- lua-resty-mysqlでMySQLをlua上で扱える
- MySQLの方がmemcachedより通信の数が増えるため、パフォーマンスは当然落ちる
- 画像のオリジナルサーバーで使用していて前段にキャッシュがあるため、高いパフォーマンスは不要
- リクエスト毎にMySQLにコネクションを張る
- コネクションを保持しないので運用も楽
- nginx-lua上で名前解決するにはnginx.conf上でresolverの設定を渡す必要がある
- 名前解決の結果を少しの間キャッシュに持つ(validオプションを渡せば調節できる)
- MySQLのホスト名にドメイン名を使っている場合は注意
- 名前解決ができない場合、エラーの変数に原因が書かれているのでエラーログに流すようにするとよい
- OpenRestyのモジュールでは作者自身が作ったcpanモジュールのTest::Nginxが使われていることが多い
- nginxのテストを書くには以下のことが必要
- nginxをテストしたい設定で起動
- 実際にリクエストを送る
- ステータスコードなどレスポンスが想定したものか確認
- ISUCONのベンチマーカでは??
- シナリオに基づいてリクエストを送り、正しいレスポンスが返ってくるか検査
- ISUCONの場合シナリオは複数、ものによっては複雑なロジックになる
- 各シナリオは並列にリクエストを行う必要がある
- 検査するシナリオとは別に、負荷をかけるだけのシナリオもある
- 捌けたリクエスト数などでスコアを出す
- それぞれ1つ1つ実装していく必要がある
- nginxのテストに特化している
__DATA__
以下にnginxの設定やリクエスト先やレスポンスの内容をコメントで書いていくだけで色々テストができる- ステータスコード・レスポンスボディは当然確認できる
- user_filesを使えば特定のファイルを書き込むことができる
- アクセスログ・エラーログなどのチェックもできる
- 詳しくは Automated Testing · Programming OpenResty
- nginxの設定を反映したnginxを起動
- リクエストを送ってレスポンスを確認する * シナリオに相当
- nginxをkill -KILLする
- 1に戻る
プログラムで1つ1つ書くと面倒な処理が、コメントで宣言的に書ける
- MySQLを起動したいのでTest::mysqldを使用
- 最初はMySQLを起動するためにDocker Composeを使おうと考えていたが、今回のケースで使うのはおおげさなので辞めた
- テスト上で簡単にMySQLを起動できる
- 簡単に実行できるようにDockerにする
- cubicdaiya/nginx-buildを使ってOpenRestyをコンパイル
- 環境変数TEST_NGINX_BINARYを設定するとTest::Nginxで実行するバイナリを切り替えられる
catatsuy/demo_test_nginx_mysql
- PerlはHTTPS化の際の置換に便利
- サービスのHTTPS化が続々進行中
- cpanモジュールのTest::Nginxは便利
- 普段Perlは使わないけどチャンスがあれば使っていきたい