Create a gist now

Instantly share code, notes, and snippets.

What would you like to do?

自己紹介

  • 各種SNSをcatatsuyでやっている
    • かたついと呼ばれることが多い
  • ピクシブ株式会社で技術基盤チームと広告チームの兼任
    • pixivの技術的な改善が主な業務
  • 単著『pixivエンジニアが教えるプログラミング入門(星海社新書)
    • ピクシブ社内の非エンジニア向けのプログラミング研修の書籍化
  • pixiv社内ISUCONやISUCON6本選の問題作成
  • 実はCPAN Authorです

普段使う言語

  • 仕事
    • PHP(/JavaScript/Go/Ruby on Rails)
  • 趣味
    • Go

Perlは趣味でも仕事でも書く機会はあまりないですが、最近使ったPerlの話をします

常時HTTPS化

git grep -l 'http://source.pixiv.net' | xargs perl -pi -e 's@http://source.pixiv.net@https://source.pixiv.net@g'

常時HTTPS化で最低限
覚えて欲しいこと

  • CSPでmixed contentsはある程度発見できる
    • ブラウザ拡張機能がmixed contentsにしても送られる
  • HTTPSに対応していない配信広告事業者はほとんどない
  • HTTPSに対応していないサービスの埋め込みは諦める

Kyoto Tycoon廃止

  • 開発基盤チームが目指す事 #pixiv_night - Qiita
  • PHP7化に向けて、Memcacheモジュールを廃止したい
    • Memcachedモジュールは互換性がない
  • メンテナンスが止まっているKyoto Tycoonを廃止したい
    • memcachedプロトコルでマルチマスターレプリケーションが可能
    • 永続データを扱える
  • 以前の話ではRedisに移行しました

pixivのnginx-lua事例

  • nginxでアクセス制御をするためにKyoto Tycoonを使用
  • Kyoto Tycoonに永続データが入っている
    • pixivでは永続データはMySQLに極力寄せたい
    • lua-resty-mysqlでMySQLをlua上で扱える
    • MySQLの方がmemcachedより通信の数が増えるため、パフォーマンスは当然落ちる
    • 画像のオリジナルサーバーで使用していて前段にキャッシュがあるため、高いパフォーマンスは不要

lua-resty-mysqlについて

  • リクエスト毎にMySQLにコネクションを張る
    • コネクションを保持しないので運用も楽
  • nginx-lua上で名前解決するにはnginx.conf上でresolverの設定を渡す必要がある
    • 名前解決の結果を少しの間キャッシュに持つ(validオプションを渡せば調節できる)
    • MySQLのホスト名にドメイン名を使っている場合は注意
    • 名前解決ができない場合、エラーの変数に原因が書かれているのでエラーログに流すようにするとよい

nginx-luaでのテスト

  • OpenRestyのモジュールでは作者自身が作ったcpanモジュールのTest::Nginxが使われていることが多い
  • nginxのテストを書くには以下のことが必要
    • nginxをテストしたい設定で起動
    • 実際にリクエストを送る
    • ステータスコードなどレスポンスが想定したものか確認
    • ISUCONのベンチマーカでは??

ISUCONのベンチマーカ

  • シナリオに基づいてリクエストを送り、正しいレスポンスが返ってくるか検査
    • ISUCONの場合シナリオは複数、ものによっては複雑なロジックになる
  • 各シナリオは並列にリクエストを行う必要がある
  • 検査するシナリオとは別に、負荷をかけるだけのシナリオもある
  • 捌けたリクエスト数などでスコアを出す
  • それぞれ1つ1つ実装していく必要がある

Test::Nginx

  • nginxのテストに特化している
  • __DATA__以下にnginxの設定やリクエスト先やレスポンスの内容をコメントで書いていくだけで色々テストができる
  • ステータスコード・レスポンスボディは当然確認できる
  • user_filesを使えば特定のファイルを書き込むことができる
  • アクセスログ・エラーログなどのチェックもできる
  • 詳しくは Automated Testing · Programming OpenResty

Test::Nginxの流れ

  1. nginxの設定を反映したnginxを起動
  2. リクエストを送ってレスポンスを確認する
  • シナリオに相当
  1. nginxをkill -KILLする
  2. 1に戻る

プログラムで1つ1つ書くと面倒な処理が、コメントで宣言的に書ける

工夫した部分

  • MySQLを起動したいのでTest::mysqldを使用
    • 最初はMySQLを起動するためにDocker Composeを使おうと考えていたが、今回のケースで使うのはおおげさなので辞めた
    • テスト上で簡単にMySQLを起動できる
  • 簡単に実行できるようにDockerにする
    • cubicdaiya/nginx-buildを使ってOpenRestyをコンパイル
    • 環境変数TEST_NGINX_BINARYを設定するとTest::Nginxで実行するバイナリを切り替えられる

demo

catatsuy/demo_test_nginx_mysql

まとめ

  • PerlはHTTPS化の際の置換に便利
    • サービスのHTTPS化が続々進行中
  • cpanモジュールのTest::Nginxは便利
  • 普段Perlは使わないけどチャンスがあれば使っていきたい
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment