nginx-c-modules について
nginx-c-modulesは、nginx Cモジュール開発者向けの開発ガイドです。メモリ、リクエストのライフサイクル、設定、イベント処理など8分野のルールを優先度順に整理し、一般的な実装ミスの防止に役立ちます。
主な機能
- 018カテゴリのモジュール開発ルール
- 02影響度順のルール構成
- 03プールと共有メモリの管理指針
- 04リクエストのライフサイクルと設定の実践方法
- 05フィルター、アップストリーム、イベントループの指針
活用シーン
- 01nginx HTTPハンドラーやフィルターの作成
- 02リクエストメモリと共有メモリゾーンの管理
- 03設定ディレクティブとマージ処理の実装
- 04非同期リクエストとイベントループの処理
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ pproenca/ dot-skills --skill nginx-c-modulesインストール後、Claude Code で/nginx-c-modulesを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
metadata.jsonassets/templates/_template.mdreferences/_sections.mdconf-build-config.mdconf-context-flags.mdconf-custom-handler.mdconf-merge-all-fields.mdconf-module-ctx-null.mdconf-null-command.mdconf-unset-init.mdds-cpymem-pattern.mdds-hash-readonly.mdds-list-iteration.mdds-ngx-str-not-null-terminated.mdds-ngx-str-set-literals.mdevent-handle-read-write.mdevent-no-blocking.mdevent-posted-events.mdevent-thread-pool.mdevent-timer-management.mdfilter-buffer-chain-iteration.mdfilter-buffering-flag.mdfilter-call-next.mdfilter-check-subrequest.mdfilter-registration-order.mdhandler-add-variable.mdhandler-content-handler.mdhandler-empty-response.mdhandler-error-page.mdhandler-last-buf.md詳細
nginx.org C モジュール開発のベストプラクティス
nginx の公式開発ドキュメントとコミュニティの知見に基づく、nginx C モジュールの包括的な開発ガイドです。8 つのカテゴリにわたる 49 のルールを含み、影響度に応じて優先順位を付けることで、モジュールを正しく実装し、よくあるクラッシュ、メモリリーク、未定義動作を防ぎます。
適用するタイミング
次の作業では、これらのガイドラインを参照してください。
- 新しい nginx C モジュール(ハンドラー、フィルター、アップストリーム、ロードバランサー)を作成するとき
- 設定ディレクティブとマージロジックを実装するとき
- nginx のプールと共有メモリゾーンを使用してメモリを管理するとき
- HTTP リクエストのライフサイクル(ボディの読み取り、サブリクエスト、完了処理)を扱うとき
- nginx のイベントループ、タイマー、スレッドプールを使用するとき
優先度別のルールカテゴリ
| 優先度 | カテゴリ | 影響度 | 接頭辞 |
|---|---|---|---|
| 1 | メモリ管理 | CRITICAL | mem- |
| 2 | リクエストのライフサイクル | CRITICAL | req- |
| 3 | 設定システム | HIGH | conf- |
| 4 | ハンドラー開発 | HIGH | handler- |
| 5 | フィルターチェーン | MEDIUM-HIGH | filter- |
| 6 | アップストリームとプロキシ | MEDIUM | upstream- |
| 7 | イベントループと並行処理 | MEDIUM | event- |
| 8 | データ構造と文字列 | LOW-MEDIUM | ds- |
クイックリファレンス
1. メモリ管理(CRITICAL)
mem-pool-allocation- ヒープの malloc ではなく、プール割り当てを使用するmem-check-allocation- すべての割り当ての戻り値が NULL かどうか確認するmem-pcalloc-structs- 構造体の初期化に ngx_pcalloc を使用するmem-cleanup-handlers- 外部リソースにプールクリーンアップハンドラーを登録するmem-pnalloc-strings- 文字列データの割り当てに ngx_pnalloc を使用するmem-pfree-limitations- プール割り当てで ngx_pfree に依存しないmem-shared-slab- 共有メモリゾーンにはスラブアロケーターを使用する
2. リクエストのライフサイクル(CRITICAL)
req-finalize-once- リクエストを完了処理するのは必ず 1 回だけにするreq-no-access-after-finalize- 完了処理後にリクエストへアクセスしないreq-body-async- リクエストボディの読み取りを非同期で処理するreq-discard-body- 読み取らないリクエストボディは破棄するreq-subrequest-completion- 完了処理にはサブリクエスト後のハンドラーを使用するreq-count-reference- 非同期処理の前にリクエストカウントを増やすreq-internal-redirect- 内部リダイレクト後は処理を返す
3. 設定システム(HIGH)
conf-unset-init- UNSET 定数を使って設定フィールドを初期化するconf-merge-all-fields- merge_loc_conf ですべての設定フィールドをマージするconf-context-flags- ディレクティブに正しいコンテキストフラグを使用するconf-null-command- コマンド配列の末尾を ngx_null_command にするconf-custom-handler- 複雑なディレクティブ解析にはカスタムハンドラーを使用するconf-module-ctx-null- 使用しないモジュールコンテキストのコールバックを NULL に設定するconf-build-config- モジュールのコンパイルに適した config ビルドスクリプトを記述する
4. ハンドラー開発(HIGH)
handler-send-header-first- ボディ出力の前にヘッダーを送信するhandler-last-buf- 最終バッファーで last_buf フラグを設定するhandler-phase-registration- postconfiguration でフェーズハンドラーを登録するhandler-content-handler- ロケーション固有のレスポンス生成には content_handler を使用するhandler-error-page- エラーレスポンスでは HTTP ステータスコードを返すhandler-empty-response- ボディが空のレスポンスには header_only を使用するhandler-module-ctx- リクエストごとの状態にはモジュールコンテキストを使用するhandler-add-variable- preconfiguration でカスタム変数を登録する
5. フィルターチェーン(MEDIUM-HIGH)
filter-registration-order- postconfiguration でトップフィルターを保存して置き換えるfilter-call-next- チェーン内の次のフィルターを必ず呼び出すfilter-check-subrequest- フィルター内でメインリクエストとサブリクエストを区別するfilter-buffer-chain-iteration- cl->next パターンを使ってバッファーチェーンを反復処理するfilter-buffering-flag- レスポンスデータの蓄積時にバッファリングフラグを設定する
6. アップストリームとプロキシ(MEDIUM)
upstream-create-request- create_request で完全なリクエストバッファーを構築するupstream-process-header- process_header でアップストリームレスポンスを段階的に解析するupstream-peer-free- Peer free コールバックで失敗を追跡するupstream-finalize- finalize_request コールバックでリソースをクリーンアップするupstream-connection-reuse- アップストリーム接続で Keepalive を有効にする
7. イベントループと並行処理(MEDIUM)
event-no-blocking- イベントハンドラー内ではブロッキング呼び出しを使用しないevent-timer-management- 関連データを解放する前にタイマーを削除するevent-handle-read-write- I/O 操作後に ngx_handle_read/write_event を呼び出すevent-thread-pool- ブロッキング操作をスレッドプールに移すevent-posted-events- 遅延処理にはポスト済みイベントを使用する
8. データ構造と文字列(LOW-MEDIUM)
ds-ngx-str-not-null-terminated- ngx_str_t がヌル終端されていると仮定しないds-ngx-str-set-literals- ngx_string マクロは文字列リテラルにのみ使用するds-cpymem-pattern- バッファーへの連続書き込みには ngx_cpymem を使用するds-list-iteration- 部分ベースのパターンを使って ngx_list_t を反復処理するds-hash-readonly- ハッシュテーブルは設定時にのみ構築する
使用方法
詳しい説明とコード例については、各リファレンスファイルをお読みください。
リファレンスファイル
| ファイル | 説明 |
|---|---|
| references/_sections.md | カテゴリーの定義と順序 |
| assets/templates/_template.md | 新しいルール用のテンプレート |
| metadata.json | バージョンとリファレンス情報 |
コメント
Markdown 対応