人間とウェブの未来

「ウェブの歴史は人類の歴史の繰り返し」という観点から色々勉強しています。

プログラミング

nginxのworkerプロセス数をCPUコア数の倍数で自動的に設定できるモジュールを書いた

nginxはworkerプロセスの数をCPUコア(スレッド)数で決定するworker_processes autoという便利設定があります。 これが多用されているのは、nginxがノンブロッキングでリクエスト処理を行うため、コンテキストスイッチなどを考慮した場合に、コア数で立ち上…

LinuxカーネルのTCPスタックとシステムコールの組み合わせによる手法よりも高速にポートのListenチェックを行う

まずは前回の記事で盛大な誤認をしていたことを訂正しなければなりません。 hb.matsumoto-r.jp 前回の記事では、高速にリモートホストのポートチェックを3パケットで実現する実装を行うために、RAWソケットとユーザランドの簡易TCPスタックを実装してパケッ…

高速にリモートホストのポートがListenしているかを調べる

hb.matsumoto-r.jp 以下のエントリは一部誤認が含まれていたので、上記エントリにその旨をまとめましたので御覧ください。 とある事情でミドルウェア上から高速にリモートホストのポートのListenチェックをしたくなりました。ローカルホストのポートであれば…

複数のmrubyインタプリタ間でデータを共有して使う方法

本記事は、mruby advent calendar 2016の23日目の記事です。22日は、ore_publicさんのruby製のコマンドラインツールをmrubyに置き換えるでした。 mrubyインタプリタ、mrubyの実装的にはmrb_state構造体なのですが、一つのプロセスの中で複数mrb_stateを作ら…

Pmilter: Programmable Mail Filter Serverを作った

Pmilterというサーバソフトウェアを作りました。 github.com PmilterはProgrammable Mail Filterの略で、SMTPサーバ(送信や受信)とmilterプロトコルで通信し、SMTPサーバの送受信の振る舞いをRubyでコントロールできるサーバソフトウェアです。 これまでに…

カーネルスレッドのループと停止をカーネルモジュールで実装

以前Linuxのカーネルスレッドがループして暴走したときに、カーネルスレッドの扱いを調べていた時期があって、それの簡単な動きを再現するべくカーネルモジュールを作りました。まずは、自力で試したい人は以下を見ずに試すと良いでしょう。

mrubyのRedisクライアントのPipelining対応とDisqueクライアント

この記事はmruby adevent calendar 24日目の記事です。 mrubyでRedisを操作するmruby-redisは以前から開発していたのですが、最近Pipelining対応のPRを頂きPipelining対応したのでそれの性能を確認してみました。また、その結果簡単に作れるようになった分散…

mrubyでHTTP/2の画像変換サーバを作った

この記事は、mruby advent calendar 2015の16日目の記事です。 画像やstaticコンテンツ配信系はHTTP/2が有利な状況が幾つかあるので、ついでにHTTP/2を喋る画像変換サーバのプロトタイプをmrubyで作ってみました。ベースはもちろんtrusterdです。なんていっ…

コマンド実行時のCPUやIOリソースを簡単に制御するツールrconを作った

CPUやメモリ、IOといったリソースの制限下でとあるコマンドを実行させたい場合に、cgroup上に何かgroupを作ったりしてからcgexecを実行して、実行後はそのgroupを消す、といったような一手間かかる方法がほとんどでした。 実行後のgroupも綺麗にしたい、とい…

ngx_mrubyのTCPロードバランシングを使ってFluentdのTCP通信とグラフ画像へのHTTP通信を動的に集約する

昨日、ngx_mrubyのTCPロードバランシング機能に対応した記事を書きました。 hb.matsumoto-r.jp というのも、実は以下に説明するようなFluetnd+Norika+GrowthForecastを利用したスケールアウト型のシステムを簡単に作りたかったからです。 ということで、まず…

ngx_mrubyがnginxのTCPロードバランシング機能に対応しました

nginxのv1.9あたりからOSS版でも使えるTCPロードバランシング機能をmrubyでプログラマブルに制御できるようにngx_mrubyでもサポートしました。 github.com これで、HTTPやHTTP/2だけでなくTCPのロードバランシングでもmrubyによって通信をプログラマブルに制…

mrubyのmrbgemをもっと簡単に作れるようにした

といっても、既存のmruby-mrbgem-templateをもう少し使いやすくしただけですが。

mrubyのmrbgemの依存関係とmgem-listの登録について

mrubyの機能拡張には、mrbgem(以下mgem)という所謂CRubyでのgemのような拡張モジュールを使います。mgemを開発していくと、もちろん以前作ったmgemの機能を再利用したい場合や、すでに存在する優れたmgemを使ってさらなる機能を実装したい場合が多くなるは…

mruby-cliを使ってプロセスのfdをリソース使用率を元に解析するワンバイナリなツールpfdsを作った

タイトルのままなのですが、pidから対象プロセスがopenしてるファイルとそのownerを解析し、CPU使用率やMemory使用率と合わせてレポートするワンバイナリなツールを作りました。 というのも、ホスティングにおいては負荷をかけているプロセスについて、リソ…

ApacheのVirtualHost単位でMaxClientsを設定するApacheモジュールをOSS化

一つのサーバに多数のホストを収容するような高集積なホスティングサービス(所謂レンタルサーバ)を提供しようとすると、収容しているユーザ単位でいかにリソースをコントロールするかが運用者には求められます。 そういう状況で、これまでApacheには色々な…

H2Oとmrubyを使ってIPアドレスベースでアクセス制御しつつリバースプロキシとして動かしてWebサイトをHTTP/2化しよう

弊社インフラチームが使っているmuninをh2oのHTTP/2で高速化して、諸々の制御はmrubyでコントロールした。チームから「はやーい!」「スクロールで勝てない!」「こんな早い表示最近みたことなかったですよ!」と喜びの声が多数届いております。— MATSUMOTO,…

ファイルパスの/で結構ハマってしまったメモ

Linuxでとあるコードを書いていたのですが、例えば、 mkdir hoge ln -s hoge hoge_link

H2Oのmruby拡張が実用的になってきた件

H2Oにmruby拡張の提案を行いmergeされてから幾つかのPRを経て、少しずつ実用的になってきました。 h2o/h2ogithub.com 今日は簡単にその使い方を紹介しようと思います。

Mac上でCentOS6用のkernel{3,4}系イメージのrpmを一発でビルドするビルドシステム作った

Kernelの新しい機能をフルに使おうとすると、新しいkernelを使う必要があるのですが、例えばCentOS6系でシステムを運用していた場合に、新しいKernelを使うべくCentOS7とかにあげるとsystemd含め運用が大きく変わってしまうため中々踏み出せないという状況が…

Apacheやnginxの同時接続状況における各リクエストの任意の属性をカウントする拡張を作った

先日、ApacheやnginxといったWebサーバにおいてDoS的アクセスを検知して任意の制御を行うhttp-dos-detectorを公開しました。 nginxでもapacheでも使用可能なDoS的アクセスを検知して任意の制御をするWebサーバ拡張をmrubyで作った - 人間とウェブの未来hb.ma…

h2o_mrubyがh2o本家にマージされました

h2o_mruby v0.0.1をリリースしてみた - 人間とウェブの未来hb.matsumoto-r.jp 先日、h2oの勉強がてら独自モジュールとして、h2o_mrubyというモジュールの開発をはじめてみました。所謂mod_mrubyやngx_mrubyのように、Webサーバの内部処理をmrubyでコントロー…

h2o_mruby v0.0.1をリリースしてみた

そういえば今から3年前に、 人間とウェブの未来 - mod_mruby 0.0.1をリリースしてみたblog.matsumoto-r.jp 人間とウェブの未来 - nginxをmrubyで制御するモジュールngx_mruby 0.0.1をリリースしましたblog.matsumoto-r.jp などなどの実装を開始しました。色…

nginxでもapacheでも使用可能なDoS的アクセスを検知して任意の制御をするWebサーバ拡張をmrubyで作った

matsumoto-r/http-dos-detectorgithub.com 会社の運用メンバーと色々議論していた中で、「カジュアルにWebサーバへのDoSみたいなアクセスが来た時に検知して制御したいよねー」という話が上がったので、http-dos-detectorというnginxでもapacheでも使えるWeb…

virtualingを使ってプロセスのメモリ使用量上限値をOoM-Killerのタイミングで自動拡張してみた

virtualingとは、わりとセキュアでCPUやメモリ・IOといったリソースの制御が可能なプロセス実行環境上で、設定や構成を変える事なくミドルウェアのようなプロセスを動作させることができるツールです。実装はmrubyです。 matsumoto-r/mruby-virtualinggithub…

virtualingでchroot配下のプロセスを簡単にリソース制御してみよう

virtualingとはkazuhoさんの低コストでchrootするためのjailingと、mruby-virtualingによるリソース制御や必要であればIPアドレスの付与する機能を組み合わせたツールです。virtualingを使うと、Rubyコードによって、リソース制御可能なchroot環境でミドルウ…

ngx_mrubyを使った簡単な画像変換サーバを数分で実装してみた

2日前にmrubyの画像変換mrbgem下さいとつぶやいて、その後2日以内にgdとMagick++のmrbgemが開発されるこのスピード感がmruby。 https://t.co/RzTZJsX9vP https://t.co/4YkJ2PwISQ— MATSUMOTO, Ryosuke (@matsumotory) 2015, 4月 25 というように、mrubyで画…

mod_process_securityを任意のhandlerで権限分離できるようにした

Apacheのコンテンツ処理をスレッド単位で権限分離するセキュリティモジュールのmod_process_securityですが、これまでは基本的に拡張子で権限分離を行うかどうかを判定していました。

MacOSX上でLinuxとWindowsとOSXで動くmrubyバイナリを簡単にクロスコンパイルできるmrbgem作った

ペパボ社内では、mrubyを使う機運が高まってきています。 誰よりも早い学習速度であっというまにmrubyを理解してしまったあんちぽさんや、CRubyだけでなくmrubyもマスターしてまさに真のRubyistになられたしばたさんと共に色々とmrubyの今後について議論して…

Rubyでabコマンドをプログラマブルに操作できるab-mrubyを業務で使ってみたけどまぁまぁ良かった

1年前ぐらいにab-mrubyという、Rubyでabコマンドをプログラマブルに操作・拡張できるツールを作っていたのですが、それを業務のとある環境で使ってみたところまぁまぁ良かったのでその使い方を紹介しようと思います。

ファイルをrmしたがプロセスがファイルを掴んでいる場合にそのファイル内容を再度得るには

ど忘れしていたのでメモです。 LinuxでApacheのログローテート時に、プロセスをgracefulしたつもりが何らかの原因によりできていなくて、その後古いログファイルを圧縮して、いらなくなったその生ログファイルをrmしたつもりが、プロセスはそのログファイル…

特定条件下におけるngx_mrubyのメモリリークを改善してメモリ増加量を半分にした

4月からペパボで働いているわけですが、前々から噂できいていたメモリリークの問題について、ペパボではわりと大規模かつ高負荷な環境でngx_mrubyを使ってくれているのでその環境を見ながらメモリリークを改善してみました。

Trusterd HTTP/2 Webサーバにリバースプロキシ機能を実装しました

タイトルの通り、trusterdにリバースプロキシ機能を実装しました。 trusterd/trusterd trusterd/trusterd · GitHub これで、フロントをHTTP/2で受けつつ、バックエンドに既存のHTTP/1.xサーバを置いてリバースプロキシすることで、HTTP/1.xのコンテンツを活…

Trusterd HTTP/2 Webサーバのmrubyによる設定と機能拡張について

trusterd HTTP/2 Web Serverは、設定や機能の拡張をRuby(mruby)で容易に実装できるという特徴を持つミドルウェアです。 また、別のアプリケーションにtrusterdのサーバ機能やクライアント機能を組み込めるという特徴も持っていますが、これについては以前…

mrubyのモジュールmrbgemを開発した際に簡単にTravis CIを設定する方法

mrubyのモジュールであるmrbgemを開発した際に、どうせならtravisの設定をして、自動でビルドやテストのCIを実施したいと思います。ですが、なんとなく後まわしにして、結果設定をしないまま放置しているmrbgemがあります。 そこで今回は、大抵のmrbgem上で…

独自でngx_mrubyのDockerイメージを作る方法

随分前にngx_mrubyをDocker対応していたのですが、最近になってより使いやすくなったので、ngx_mrubyをDockerで使う方法を簡単に紹介します。

trusterdのHTTP/2クライアント機能をCアプリに組み込んでみよう

前回の記事では、trusterdのHTTP/2サーバ機能をCアプリに組み込む方法を紹介しました。 C言語のアプリにmruby経由でtrusterdのHTTP/2サーバ機能を5分で組み込む方法 - 人間とウェブの未来 C言語のアプリにmruby経由でtrusterdのHTTP/2サーバ機能を5分で組み…

ngx_mrubyのDockerイメージがONBUILDをサポートしました

nagachikaさんの提案で、ngx_mrubyの本家Dockerイメージ(matsumotory/ngx-mruby)において、設定ファイルやコンテンツの読み込みをONBUILD化しました。

C言語のアプリにmruby経由でtrusterdのHTTP/2サーバ機能を5分で組み込む方法

今日は僕が開発しているTrusterd HTTP/2 Webサーバの一つの特徴である、「HTTP/2機能のアプリ組込み」の方法を紹介したいと思います。 Cをちょっと書けるレベルの人でも5分でCアプリにHTTP/2機能を組み込んで、自分のHTTP/2サーバを実装できます。

ngx_mruby経由でtrusterdをnginxに組み込んでnginxの情報をHTTP/2で裏から取得してみた

trusterdはHTTP/2クライアントとサーバ両方の機能を持っており、それらの機能は全てモジュールとして取り外し可能な設計にしています。 そのため、HTTP/2クライアント・サーバ機能をmrubyモジュールとして取り外して、他のアプリケーションにmruby経由で組み…

Trusterd HTTP/2 WebサーバのTLS接続時の性能を改善

もはやHTTP/2リファレンス実装であるHTTP/2のCライブラリnghttp2の作者であるtatsuhiro_tさんが素晴らしいベンチマーク結果を公開されました。 その中で以下のように、あまりにもH2Oやnghttpdと比べてtrusterdのTLS利用時の性能が遅かったため改善しました。…

mod_mrubyとngx_mrubyの次の一手となる新しいソフトウェア

この記事は、mod_mruby ngx_mruby advent calendar 2014の最終日25日の記事になります。

ngx_mrubyインストール後入門 - ngx_mrubyによるnginx変数の扱い

本記事はmod_mruby ngx_mruby advent calendar 2014 21日目の記事です。

mrubyのサーバアプリケーション組込みにおいて複数スクリプトでインタプリタを共有することのデメリットとその対策

本記事はmod_mruby ngx_mruby advent calendar 2014 20日目の記事です。 昨日は、 @inokappa さんによる「ngx_mruby で Nginx への接続数等の内部情報を取得して InfluxDB と Tasseo で可視化してみる」でした。

mod_mrubyとngx_mrubyの設計思想とスクリプト間でオブジェクトを共有するためのアーキテクチャ概論

本記事はmod_mruby ngx_mruby advent calendar 2014 17日目の記事です。 昨日は、 @hkusu さんによる「静的リソースをリバースプロキシで配信する《mod_mruby ngx_mruby Advent Calendar 2014》」でした。

地理情報を使ってmod_mrubyとngx_mrubyでプログラマブルにアクセス制御

mod_mruby ngx_mruby advent calendar 2014 13日目の記事になります。 12日目は @ainoya さんの「mod_mrubyでJWTベースの認証proxyを作る」でした。 Apacheでもnginxでも、GeoIPの地理情報を使ってアクセス制御をすることができます。ですが、mod_mrubyやngx…

mod_mrubyインストール後入門

thanks to @bamchoh https://github.com/bamchoh/mod_mruby_logo ngx_mrubyのロゴも募集中です!(このロゴを緑ベースでngx_mrubyとするだけでも良いかも...) おはようございます。@matsumotory でございます。 この記事は、mod_mruby ngx_mruby advent cal…

nginxのworkerプロセス初期化・exit時にRubyスクリプトを実行できる機能をngx_mrubyに追加

タイトルそのままなのですが、nginxのworkerプロセスの初期化・exit時にRubyスクリプトを実行出来る機能をngx_mrubyに追加しました。 matsumoto-r/ngx_mruby matsumoto-r/ngx_mruby · GitHub

Apache httpd 2.4系をバックエンドに置く場合のクライアントIPアドレスの扱いとハマりどころ

nginxやその他のリバースプロキシをフロントにおいて、バックエンドにApache httpdを置くという構成をとることがあります。 その場合に何も対処しないと、アクセスログやアプリが認識するクライアントIPアドレスがリバースプロキシのIPアドレスになってしま…

コードレビューとスタンフォード監獄実験

コードレビューにおいて、レビューする側の人間がレビューされる側の人間に対してどう接していくかという議論はいくつもされてきています。

ApacheやnginxのMarkdownファイル変換モジュールをmrubyで簡単に書いてみよう

今回は、.mdファイルにMarkdown形式で文章を書いておき、それをApache httpdやnginxでホストし、ブラウザからアクセスするとHTMLに変換されて表示されるMarkdownコンバータモジュールをmrubyで書く方法を紹介したいと思います。