TCPの接続を許可する
streamモジュールは、TCPの接続をプロキシし、listen ... udpではUDPのセッションもプロキシします。streamブロックのserverでは、mruby_streamで指定したRubyのスクリプトが、streamモジュールのaccessフェーズで動きます。スクリプトは、nginxがupstreamに接続する前に、セッションごとに1回動きます。スクリプトはNginx::Stream::Connectionでセッションのアドレスを読みます。スクリプトがstream_statusをNginx::Stream::ABORTにすると、セッションが閉じます。
スクリプトは、リストにあるアドレスからのセッションだけを通します。その後、nginxは接続をupstreamへプロキシします。ここでのupstreamは、テストの設定にあるポート18168のHTTPのサーバです。リクエストとレスポンスは、クライアントがTCPの接続で送るバイト列と受け取るバイト列です。
upstream guide_tcp_backend { server 127.0.0.1:18168;}
server { listen 127.0.0.1:12364; mruby_stream build/nginx/html/guide_tcp.rb; proxy_pass guide_tcp_backend;}allowed = ["127.0.0.1", "::1"]c = Nginx::Stream::Connectionc.stream_status = Nginx::Stream::ABORT unless allowed.include?(c.remote_ip)GET /status HTTP/1.1Host: 127.0.0.1:12364Connection: closeHTTP/1.1 200 OKContent-Type: text/plain
the backend on port 18168 answeredCIが動くたびに、ケースのtest/t/cases/guides.rbがこのリクエストを送ります。ケースは、ステータス行、ここに載せたヘッダ、ボディ全体を比べます。5個のファイルを最後に変えたのは、2026-10-29のコミット32219e53です。
気をつけること
Section titled “気をつけること”- streamモジュールは、UDPのセッションでもスクリプトを実行します。テストスイートが送るのはTCPだけです。
- スクリプトはnginxがクライアントのデータを読む前に動くので、判断に使えるのは、クライアントが送る内容ではなく、セッションのアドレスとポートです。
streamブロックは、httpブロックとは別に独自のmrb_stateを持ちます。起動時に動くコードにも、streamブロック専用のディレクティブのmruby_stream_initとmruby_stream_init_workerがあります。