OpenResty XRay がどのようにしてアプリケーションの問題特定と効率化を支援するかをご覧ください。

詳細はこちら LIVE DEMO

OpenResty はオープンソースの Web プラットフォームです。拡張版の Nginx コア、LuaJIT、複数の Lua ライブラリを 1 つのディストリビューションにまとめており、Nginx のリクエスト処理ロジックを Lua で直接記述できます。 Nginx とは別の新しいサーバーではなく、Nginx をベースに拡張したプラットフォームです。OpenResty は公式 Nginx のバージョンアップに追随しており、実行ファイルは引き続き nginx で、既存の Nginx 設定もそのまま使えます。OpenResty は OpenResty Inc. がメンテナンスしています。

Nginx はそれ自体で十分に強力です。静的ファイル配信、リバースプロキシ、ロードバランシング、キャッシュ、レート制限は、いずれも設定だけで利用できます。問題になるのは、ユーザーごとの認証や、業務ルールに応じたレート制限・ルーティングなど、独自のルールでリクエストを処理したい場合です。複雑な条件判定を Nginx のディレクティブで書くのは手間がかかり、挙動を確かめるためにドキュメントを何度も読み返さなければならないディレクティブも少なくありません。設定が長くなれば保守も難しくなります。C でモジュールを書くと開発コストが高く、Nginx をアップグレードするたびにモジュールの再コンパイルが必要になることもあります。外部サービスに処理を任せれば、リクエストごとにネットワークの往復が 1 回増えます。OpenResty なら、こうしたロジックを Nginx の中で Lua を使って直接記述できます。コードの見通しがよく、ロジックを変更しても Nginx を再コンパイルする必要はありません。たとえるなら、Nginx が多機能な電卓、OpenResty はそれをプログラム可能なコンピュータにアップグレードしたものです。既存の機能を設定して使うだけでなく、独自の業務ロジックを書けるようになります。

本記事は OpenResty のメンテナーチームが執筆しました。OpenResty で何ができるのか、どのように動作するのか、どのような要素で構成されているのか、そしてオープンソースの OpenResty と関連する商用製品との関係を順に解説します。

OpenResty の主な用途

OpenResty がよく使われるのは、トラフィックの入口に位置し、リクエストごとに判定と処理を行う必要があるサービスです。

  • API ゲートウェイと外部向け API 基盤:リクエストがバックエンドに届く前に、認証、署名検証、レート制限、ルーティング、プロトコル変換を行います。SaaS や有料 API では、顧客ごとの呼び出し回数の上限設定や利用量の記録にも使えます。
  • Web アプリケーションファイアウォール(WAF):Nginx のアクセスフェーズでリクエストを検査し、SQL インジェクションや XSS などの攻撃をブロックするほか、IP ブラックリスト・ホワイトリストなどのアクセスルールを適用します。
  • 動的ルーティング、カナリアリリース、ロードバランシング:リクエストヘッダー、Cookie、Redis 上の設定に基づき、どのアップストリームにリクエストを転送するかをリアルタイムに決定します。ユーザー単位や割合指定で、一部のトラフィックを新バージョンに振り分けることもできます。アップストリームが変わっても Nginx をリロードする必要はありません(openresty.org の Redis を使った動的ルーティングの例を参照)。
  • 大型セールやタイムセール時のトラフィック保護:商品ページや API をキャッシュし、リクエスト頻度を制限し、ピーク時には異常なリクエストを遮断してバックエンドサービスを守ります。
  • CDN とエッジノード:ユーザーに近いノードで、キャッシュ制御、リクエストの書き換え、レスポンスのフィルタリングを行います。
  • AI/LLM ゲートウェイ:複数のモデルへのリクエストを一元的にプロキシし、チームやアプリケーションごとにトラフィックを割り当て、トークンのクォータを管理します。
  • 同時接続数の多い Web サービス:Nginx の中で Web アプリケーションや API を丸ごと実装し、MySQL、PostgreSQL、Redis、Memcached にノンブロッキングでアクセスします。

これらのユースケースに共通するのは、ロジックがリクエストの経路上で実行されなければならないという点です。Nginx の外にある独立したサービスに移せば、リクエストごとにネットワークの往復が 1 回増え、チームがデプロイ・監視するサービスも 1 つ増えます。ルーティングの更新を頻繁なリロードでまかなえば、レスポンスのレイテンシーに影響し、ロードバランシングの状態もリセットされます。OpenResty はロジックを Nginx のプロセス自体に組み込みます。業務ロジック用の別サービスにリクエストを転送する必要がなく、ルーティングの更新にリロードも要りません。チームはスクリプト言語で業務ロジックを書きながら、デプロイと運用はこれまでどおり Nginx のやり方で行えます。

ノードが増えて設定の一元管理が必要になった場合、オープンソースの OpenResty 自体は本格的なコンソールや設定配信の仕組みを備えていません。その場合は、既存の Lua スクリプトと OpenResty の実行環境を活かしたまま OpenResty Edge を導入できます。ロードバランシング、WAF、キャッシュ、ルーティングのポリシーを一元管理して複数のノードに同期でき、バージョン管理とロールバックも可能です。

OpenResty の仕組み

OpenResty の動作は、次の 3 点にまとめられます。

  1. ネットワークとイベントループは Nginx が担当します。 各 worker プロセスはスレッドを 1 つしか使わず、イベント駆動方式で数千から数万の接続を同時に処理します。
  2. Lua コードはリクエスト処理フェーズにフックされます。 Nginx は 1 つのリクエストの処理を rewrite、access、content、log などのフェーズに分けており、レスポンスを送信する前には header/body フィルターも通ります。OpenResty の中核コンポーネントである ngx_lua を使うと、これらの箇所に Lua コードを挿入できます(rewrite_by_lua*、access_by_lua*、content_by_lua* など)。リクエストをアップストリームに転送する場合は、balancer_by_lua* を使い、Lua のロジックでアップストリームノードを選択することもできます。各リクエストは、それぞれ専用の Lua コルーチンで実行されます。
  3. バックエンドへのアクセスには cosocket を使い、スレッドをブロックしません。 cosocket は、OpenResty が提供するノンブロッキングなネットワークアクセス API 群です。Lua コードが Redis、MySQL、アップストリームの HTTP サービスに接続すると、cosocket API はデータを待つ間、現在のコルーチンを一時停止し、worker は他のリクエストの処理に移ります。データが届くと、cosocket API がコルーチンを再開します。コードを書く側から見れば、通常の同期呼び出しと変わりません。cosocket は rewrite、access、content などのフェーズとタイマー内で使用できますが(各フェーズの対応状況は lua-nginx-module のドキュメントを参照)、フィルターや log フェーズでは使用できません。これらのフェーズは、軽量な書き換えや記録に向いています。

各 worker プロセスはそれぞれ LuaJIT 仮想マシンを 1 つ持ち、ホットコードは機械語に JIT コンパイルされます。worker 間で共有する必要があるデータ(カウンターやレート制限の状態など)は、lua_shared_dict の共有メモリ領域に置きます。

オープンソースの OpenResty はランタイムの機能を提供しますが、問題の切り分けは依然としてログ、メトリクス、人手による分析に頼るのが一般的です。本番環境で CPU 使用率の急上昇、メモリ使用量の増加、リクエストの遅延が発生した場合は、OpenResty XRay を使って、実行中の OpenResty、Nginx、LuaJIT プログラムを動的トレーシングで解析できます。コードを変更せず、アプリケーションを再起動することもなく、フレームグラフで時間のかかっているコードパスを特定できます。OpenResty XRay は独立した商用の診断ツールであり、OpenResty の実行に必須のコンポーネントではありません。

Lua の知識は必要か

使い始める段階では必要ありません。Nginx の設定方法は変わらないため、独自のロジックが必要な location に Lua を数行加えるだけで済みます。

location /hello {
    default_type text/plain;
    content_by_lua_block {
        local name = ngx.var.arg_name or "world"
        ngx.say("hello, ", name)
    }
}

/hello?name=openresty にアクセスすると、hello, openresty が返ります。content_by_lua_block の中は Lua、ブロックの外は標準的な Nginx ディレクティブです。OpenResty が使用する LuaJIT は、Lua 5.1 と完全な互換性があります。Lua は構文が簡潔で、比較的習得しやすい言語です。

実際に試してみたい場合は、OpenResty のインストールから始め、OpenResty チュートリアルの 7 つのステップに沿って、Hello World から本番環境まで進めてみてください。

OpenResty は Web サーバーか:Nginx との関係

はい。OpenResty はそれ自体が完全な Web サーバーであり、リバースプロキシ、ロードバランサー、TCP/UDP プロキシとしても使えます。OpenResty を起動すると、実際に動作するのは Nginx プロセスです。openresty コマンドは通常、OpenResty に同梱されている nginx 実行ファイルを起動しているにすぎません。

標準の Nginx との関係は、バージョン番号を見ればわかります。OpenResty のバージョン番号の最初の 3 つの数字は、同梱されている Nginx コアのバージョンです。 たとえば OpenResty 1.31.1.1 には Nginx 1.31.1 が同梱されており、4 つ目の数字は OpenResty 独自のリビジョン番号です。あるWeb サイトのレスポンスヘッダーやエラーページに openresty/1.31.1.1 と表示されていれば、そのサーバーで稼働している OpenResty のバージョンを示しています。

openresty.org の FAQ によると、OpenResty は「tick-tock」方式でリリースされています。tock リリースでは Nginx コアを公式の最新 mainline バージョンにアップグレードし、続く tick リリースでは OpenResty 自身の機能と改善に注力します。各バージョンの変更点は、openresty.org のリリースアナウンスで確認できます(例:OpenResty 1.31.1.1 リリースアナウンス)。

OpenResty の構成コンポーネント

openresty.org の紹介ページによると、OpenResty に含まれる Nginx モジュールの多くは OpenResty のメンテナー自身が開発しているため、モジュール同士がうまく連携して動作します。主なコンポーネントは次のとおりです。

コンポーネント役割
拡張版 Nginx コアネットワーク、イベントループ、HTTP および TCP/UDP プロキシ。OpenResty のパッチを適用済み
LuaJIT(OpenResty がメンテナンスする luajit2 ブランチ)Lua コードを JIT コンパイルして実行。Lua 5.1 と完全互換
ngx_lua(lua-nginx-module)HTTP リクエスト処理の各フェーズに Lua を組み込み、ngx.* API と cosocket を提供
stream-lua-nginx-moduleTCP/UDP の L4 トラフィック上で Lua を実行
lua-resty-* ライブラリRedis、MySQL、Memcached、DNS、WebSocket などのクライアントのほか、キャッシュ、レート制限、ロック、アップストリームのヘルスチェックなどの汎用ライブラリ
lua-cjson高速な JSON エンコード/デコード
resty コマンドラインツールnginx.conf を書かずに、ターミナルから直接 OpenResty の Lua コードを実行

完全な一覧は、openresty.org のコンポーネント一覧をご覧ください。オープンソースのライブラリの性能や機能が特定の業務要件を満たせない場合は、OpenResty Inc. が提供するプライベートライブラリを使って、一部の Lua ライブラリや Nginx モジュールを置き換えたり強化したりすることもできます。コミュニティが提供するその他の Lua ライブラリは、OPM で見つけられます。

OpenResty の利用状況

Netcraft の 2026 年 7 月 Web サーバー調査によると、OpenResty を使用しているWeb サイトは約 1 億 2,000 万(Netcraft が集計した全Web サイトの 8.02%)、ドメインは約 4,270 万(全体の 13.98%)で、いずれも世界の Web サーバーの中で 4 位です。

直接デプロイして使われるだけでなく、OpenResty は多くのインフラソフトウェアの実行基盤にもなっており、主要なオープンソース API ゲートウェイの中にも、OpenResty 上に構築されているものが複数あります。そのため、OpenResty を直接インストールしたことがない企業でも、自社のリクエストトラフィックが OpenResty を通過している可能性があります。

OpenResty の開発・メンテナンス体制

OpenResty は章亦春(GitHub ID: agentzh)が創設したプロジェクトで、現在は OpenResty Inc. がメンテナンスを担い、OpenResty Software Foundation(OpenResty ソフトウェア財団)とともにプロジェクトを支えています。

OpenResty は無料のオープンソースソフトウェアで、同梱されるコンポーネントの多くは BSD や MIT などの寛容なライセンスを採用しています。ソースコード、ビルド済みパッケージ、ドキュメントは openresty.org から入手でき、パッケージリポジトリは Ubuntu、Debian、RHEL 系、Alpine などの主要な Linux ディストリビューションに対応しています。

OpenResty Inc. は、OpenResty Edge、OpenResty XRay、OpenResty プライベートライブラリといった独立した商用製品も提供しており、それぞれ複数ノードの一元管理、本番環境の問題診断、特定コンポーネントの性能最適化といった機能を補うものです。いずれも、オープンソースの OpenResty を実行するための前提条件ではありません。

よくある質問

OpenResty と Nginx の違いは何ですか?

OpenResty は Nginx コア全体を含み、そのうえに LuaJIT と Lua ライブラリを追加しています。標準の Nginx 設定はそのまま使えるため、必要に応じて location 単位で Lua のロジックを追加できます。プログラミングで実現するカスタム動作は、標準の Nginx では通常 C モジュールなどの拡張手段が必要ですが、OpenResty では同様の処理の多くを Lua で実現できます。

OpenResty は無料で使えますか?

はい。OpenResty はオープンソースソフトウェアで、本番環境で使用する場合も有料ライセンスは不要です。OpenResty Inc. の OpenResty Edge、OpenResty XRay、OpenResty プライベートライブラリは、別途提供される商用製品です。

OpenResty をベースに構築されているソフトウェアには何がありますか?

オープンソースの API ゲートウェイである Kong と Apache APISIX は、いずれも公式ドキュメントで OpenResty(Nginx + LuaJIT)上で動作することを明記しています。OpenResty Inc. の OpenResty Edge も、OpenResty をベースに構築されています。

OpenResty が使用している Lua のバージョンは何ですか?

OpenResty は、OpenResty がメンテナンスする LuaJIT 2.1 ブランチを使用しています。このブランチは Lua 5.1 と完全な互換性があり、Lua 5.2 と Lua 5.3 の拡張の一部にも対応しています。標準的な Lua 5.1 のコードは変更なしで動作し、FFI など LuaJIT 固有の機能も利用できます。ネットワークにアクセスする際は、ngx.* や lua-resty-* ライブラリが提供するノンブロッキング API を使ってください。そうすれば、worker はデータを待つ間も他のリクエストを処理し続けられます。

Web ページに「403 Forbidden openresty」と表示されるのは、どういう意味ですか?

そのWeb サイトのサーバーで OpenResty が動作していることを示しています。エラーページ下部の openresty や openresty/1.31.1.1 は、サーバー名とバージョン番号です。403、404、502、504 などのステータスコードは、そのWeb サイト自身の設定やバックエンドサービスによって決まるもので、OpenResty ソフトウェア自体の障害を意味するものではありません。サイトの訪問者であれば、そのWeb サイトにお問い合わせください。Web サイトの管理者であれば、まず Nginx の error.log を確認し、リクエストが拒否された原因やアップストリームでエラーが発生した原因を特定してください。

OpenResty アプリケーションのトラブルシューティングはどうすればよいですか?

Lua の実行時エラーは Nginx の error.log に書き込まれるため、まずはここを確認します。resty コマンドラインツールは、サーバーの外で問題を再現するのに便利です。本番環境での CPU 使用率の急上昇、メモリ使用量の増加、リクエストの遅延は、ログだけでは原因を特定できないことがよくあります。その場合は、OpenResty XRay で実行中のプロセスについて Lua レベルの CPU フレームグラフを生成し、時間のかかっているコードパスを直接確認できます。

次のステップ

著者について

章亦春(GitHub ハンドル: agentzh)は、OpenResty® オープンソースプロジェクトのオリジナル作成者であり、OpenResty Inc. の CEO です。

章亦春は「オープンソース技術」の最も初期の提唱者およびリーダーの一人です。Cloudflare や Yahoo! など、国際的に著名な複数のテック企業で勤務しました。「エッジコンピューティング」「動的トレーシング」「マシンコーディング」の先駆者であり、22 年以上のプログラミング経験と 16 年のオープンソース経験を持ちます。章亦春はオープンソース界で OpenResty® のプロジェクトリーダーとして広く知られており、同プロジェクトは全世界で 4,000 万以上のWeb サイトドメインに採用されています。

OpenResty Inc. は章亦春が 2017 年に設立したエンタープライズソフトウェアスタートアップで、世界最大級の企業を顧客に持ちます。フラッグシップ製品の OpenResty XRay は、動的トレーシング技術を大幅に強化・活用する非侵入型のプロファイリングおよびトラブルシューティングツールです。また、OpenResty Edge 製品は、強力な分散トラフィック管理およびプライベート CDN ソフトウェア製品です。

熱心なオープンソースコントリビューターとして、章亦春は Linux カーネル、Nginx、LuaJIT、GDB、SystemTap、LLVM、Perl など、数多くのオープンソースプロジェクトに 100 万行以上のコードを貢献しています。また、60 以上のオープンソースソフトウェアライブラリを開発しています。

翻訳

英語版の原文と日本語訳版(本文)をご用意しております。読者の皆様による他の言語への翻訳版も歓迎いたします。全文翻訳で省略がなければ、採用を検討させていただきます。心より感謝申し上げます!