我、HTTPS化、nginx-lua和Perl
我在YAPC::Fukuoka前两天晚会(非官方)上以《我的HTTPS化、nginx-lua和Perl之旅》为题进行了演讲,并参加了YAPC::Fukuoka大会。
我在发布的时候,因为Qiita还没有实现HTTPS加密,所以我把代码贴在了gist上。但是现在Qiita已经实现了HTTPS加密,所以我会把代码贴在Qiita上。
持续将网站转为HTTPS安全协议
-
- 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'
请记住至少以下内容:始终使用HTTPS。
-
- CSPでmixed contentsはある程度発見できる
ブラウザ拡張機能がmixed contentsにしても送られる
HTTPSに対応していない配信広告事業者はほとんどない
HTTPSに対応していないサービスの埋め込みは諦める
停用京都大君数据库
-
- 開発基盤チームが目指す事 #pixiv_night – Qiita
-
- PHP7化に向けて、Memcacheモジュールを廃止したい
Memcachedモジュールは互換性がない
メンテナンスが止まっているKyoto Tycoonを廃止したい
memcachedプロトコルでマルチマスターレプリケーションが可能
永続データを扱える
以前の話ではRedisに移行しました
pixiv的nginx-lua案例
-
- nginxでアクセス制御をするためにKyoto Tycoonを使用
Using ngx_lua / lua-nginx-module in pixiv
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つ実装していく必要がある
测试::Nginx
-
- nginxのテストに特化している
__DATA__以下にnginxの設定やリクエスト先やレスポンスの内容をコメントで書いていくだけで色々テストができる
ステータスコード・レスポンスボディは当然確認できる
user_filesを使えば特定のファイルを書き込むことができる
アクセスログ・エラーログなどのチェックもできる
詳しくは Automated Testing · Programming OpenResty
Test::Nginxの流れ
-
- nginxの設定を反映したnginxを起動
-
- リクエストを送ってレスポンスを確認する
シナリオに相当
nginxをkill -KILLする
1に戻る
在程序中,如果一个一个地编写会很繁琐的处理,可以用注释以声明的方式来书写。
努力的部分
-
- MySQLを起動したいのでTest::mysqldを使用
最初はMySQLを起動するためにDocker Composeを使おうと考えていたが、今回のケースで使うのはおおげさなので辞めた
テスト上で簡単にMySQLを起動できる
簡単に実行できるようにDockerにする
cubicdaiya/nginx-buildを使ってOpenRestyをコンパイル
環境変数TEST_NGINX_BINARYを設定するとTest::Nginxで実行するバイナリを切り替えられる
即使
猫套鱼/演示_测试_nginx_mysql
总结
-
- PerlはHTTPS化の際の置換に便利
サービスのHTTPS化が続々進行中
cpanモジュールのTest::Nginxは便利
普段Perlは使わないけどチャンスがあれば使っていきたい