コンテンツにスキップ

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の接続で送るバイト列と受け取るバイト列です。

test/conf/conf.d/stream/42-guide-tcp.conf
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;
}
test/html/guide_tcp.rb
allowed = ["127.0.0.1", "::1"]
c = Nginx::Stream::Connection
c.stream_status = Nginx::Stream::ABORT unless allowed.include?(c.remote_ip)
test/html/guide_tcp.request:ケースが送るリクエスト
GET /status HTTP/1.1
Host: 127.0.0.1:12364
Connection: close
test/html/guide_tcp.response:ケースが比べるレスポンス
HTTP/1.1 200 OK
Content-Type: text/plain
the backend on port 18168 answered

CIが動くたびに、ケースのtest/t/cases/guides.rbがこのリクエストを送ります。ケースは、ステータス行、ここに載せたヘッダ、ボディ全体を比べます。5個のファイルを最後に変えたのは、2026-10-29のコミット32219e53です。

  • streamモジュールは、UDPのセッションでもスクリプトを実行します。テストスイートが送るのはTCPだけです。
  • スクリプトはnginxがクライアントのデータを読む前に動くので、判断に使えるのは、クライアントが送る内容ではなく、セッションのアドレスとポートです。
  • streamブロックは、httpブロックとは別に独自のmrb_stateを持ちます。起動時に動くコードにも、streamブロック専用のディレクティブのmruby_stream_initとmruby_stream_init_workerがあります。