我、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の流れ

    1. nginxの設定を反映したnginxを起動

 

    1. リクエストを送ってレスポンスを確認する

シナリオに相当

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は使わないけどチャンスがあれば使っていきたい

广告
将在 10 秒后关闭
bannerAds