From f8aaa5944d99858a7dfd8ef37528f49ffed95b4c Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 20 Oct 2026 20:38:07 +0900 Subject: [PATCH] =?UTF-8?q?docs:=20nginx.customConfig=20=E3=81=AE=E5=8F=96?= =?UTF-8?q?=E3=82=8A=E9=81=95=E3=81=88=E3=81=A8=20client=5Fmax=5Fbody=5Fsi?= =?UTF-8?q?ze=20=E9=87=8D=E8=A4=87=E3=82=92=E9=98=B2=E3=81=90=E8=A8=98?= =?UTF-8?q?=E8=BF=B0=E3=81=AB=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit あるプロジェクトから「serverSnippet が効かない」「snippet は古いキー」との 指摘があり調査した結果、指摘の前提は誤りだった。 - 実際に使われる templates/configmap.yaml が読むのは snippet で、values.yaml と README も snippet で一致している。 - serverSnippet / httpSnippet は、.Values.nginx.enabled が存在せず一度も出力 されない configmap-nginx.yaml だけが読むキーで、values・README に載ったことが なく、指定しても黙って無視される。 - README 例6・例9 が snippet に client_max_body_size を書く手順になっており、 v8.5.9-b 以降は uploadMaxSize の自動出力と重複して nginx が起動しない (2026-09-29 の障害の発生源)。例6 は location ~ \.php$ も重複定義していた。 挙動の変更はなくドキュメント・コメントのみ。 - values.yaml / README: 読まれるキーは snippet のみ、挿入先は server ブロック内、 client_max_body_size は書かず uploadMaxSize を使うことを明記 - README 例6・例9 を uploadMaxSize 指定に修正 - configmap-nginx.yaml: 未使用であることを示す注記を追加 手動リリース 8.5.11-a。 --- CLAUDE.md | 10 ++++++++++ Chart.yaml | 2 +- README.md | 36 +++++++++++++++++++++------------- templates/configmap-nginx.yaml | 8 ++++++++ values.yaml | 10 ++++++++++ 5 files changed, 51 insertions(+), 15 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 12963fe..2eaff3c 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -27,6 +27,16 @@ Websites 組織の各サイト(e-learn.jp / fcdomain.com / hotels / tskholding ## チャート改修履歴 +### nginx.customConfig の取り違え防止(ドキュメント修正、2026-10-20, v8.5.11-a) + +- **症状 / 背景**: あるプロジェクトのレポートで「`serverSnippet` が効かない。既定の `snippet:` はどのテンプレートも読まない古いキーでは」という指摘があった。別件で、`snippet` に `client_max_body_size` を書いていたプロジェクトが `directive is duplicate` で nginx 起動失敗する障害(2026-09-29)も起きていた。 +- **原因**: + - 指摘は誤り。実際に使われる `templates/configmap.yaml` が読むのは `snippet` で、`values.yaml`・README と一致している。`serverSnippet` / `httpSnippet` は、一度も出力されない `templates/configmap-nginx.yaml`(`.Values.nginx.enabled` が values に無く常に偽)だけが読むキーで、values・README に載ったことがない(コミット `31106e0` 由来)。指定すると黙って無視される。 + - README 例6・例9 が `snippet` に `client_max_body_size` を書く手順を案内しており、v8.5.9-b 以降は `uploadMaxSize` の自動出力と重複して起動失敗する。例6 はチャート本体と重複する `location ~ \.php$` も再定義していた。 +- **修正内容**: 挙動の変更なし(ドキュメント・コメントのみ)。`values.yaml` と README に「読まれるキーは `snippet` のみ、挿入先は server ブロック内、`client_max_body_size` は書かず `uploadMaxSize` を使う」を明記。README 例6・例9 を `uploadMaxSize` 指定に修正。`configmap-nginx.yaml` 先頭に「未使用」の注記を追加。 +- **やらなかったこと**: `snippet` を `serverSnippet` に改名する(動いているキーを壊すため)。`serverSnippet` を `snippet` の別名として有効化する(これまで無視されていた設定が突然有効になり、重複で起動失敗する恐れがあるため)。`http` レベルの snippet が必要になった場合は、別途 `configmap.yaml` に正式対応を追加する。 +- **対象ファイル**: `values.yaml`, `README.md`, `templates/configmap-nginx.yaml`(コメントのみ), `Chart.yaml` + ### Cron(CronJob)定期実行機能を追加(2026-09-27, v8.5.10-e) - **背景**: 定期実行したいPHPスクリプト(レポート送信・バッチ処理等)を動かす手段がなく、外部で別途スケジューラを用意する必要があった。 diff --git a/Chart.yaml b/Chart.yaml index 58db84f..2d3ffd1 100644 --- a/Chart.yaml +++ b/Chart.yaml @@ -2,6 +2,6 @@ apiVersion: v2 name: phpfpm description: Nginx + PHP-FPM Helm Chart with external DB and optional Selenium support type: application -version: 8.5.11 +version: 8.5.11-a appVersion: "8.5.11" icon: https://upload.wikimedia.org/wikipedia/commons/thumb/2/27/PHP-logo.svg/330px-PHP-logo.svg.png diff --git a/README.md b/README.md index 6e9db2e..6c3dba7 100644 --- a/README.md +++ b/README.md @@ -329,13 +329,18 @@ smtp: | パラメータ | 説明 | デフォルト | |-----------|------|-----------| | `nginx.customConfig.enabled` | カスタム設定有効化 | `false` | -| `nginx.customConfig.snippet` | 設定スニペット | `""` | +| `nginx.customConfig.snippet` | `server { }` ブロック末尾へそのまま挿入するnginx設定(下記注意参照) | `""` | | `nginx.forwardRealIP.enabled` | リアルIP取得有効化 | `false` | | `nginx.forwardRealIP.header` | リアルIP取得ヘッダー | `"X-Forwarded-For"` | | `nginx.forwardRealIP.recursive` | 再帰的IP検索 | `true` | | `nginx.forwardRealIP.trustedProxies` | 信頼するプロキシネットワーク | `["10.0.0.0/8", "172.16.0.0/12", "192.168.0.0/16"]` | | `nginx.forwardRealIP.additionalTrustedProxies` | 追加の信頼プロキシ | `[]` | +> **📌 `nginx.customConfig.snippet` の注意点** +> - 読まれるキーは `snippet` のみです。`serverSnippet` / `httpSnippet` というキーは存在せず、指定しても**無視されます**(過去に作られた未使用テンプレート `configmap-nginx.yaml` 専用のキーで、一度も出力されたことがありません)。 +> - 挿入先は `server { }` ブロック内です。`limit_req_zone` など `http` レベル専用のディレクティブは書けません。 +> - チャートが自動で出力する設定を重複して書くと、nginxが起動しなくなります。特に **`client_max_body_size` は書かないでください**(`directive is duplicate` で起動失敗)。アップロード上限は `uploadMaxSize` で設定します。 + > **📌 sitemap.xml のContent-Type** > `/sitemap.xml`(静的ファイルとして配置した場合)は、常に `Content-Type: application/xml; charset=utf-8` で配信されます。標準の `mime.types` では `.xml` が `text/xml` 扱いでcharsetが付かず、ブラウザやGoogle Search Consoleなどのツールが正しく解釈できない場合があるための組み込み対応です(設定不要、常時有効)。 > なお、PHPで動的に生成する場合はこの設定は適用されません(PHP側で `header('Content-Type: application/xml; charset=utf-8');` を指定してください)。 @@ -521,22 +526,21 @@ $driver->quit(); ```yaml # values.yaml + +# アップロード上限は snippet ではなく uploadMaxSize で設定する +# (nginx の client_max_body_size を snippet に書くと、チャートの自動出力と重複して起動失敗する) +uploadMaxSize: "100m" + nginx: customConfig: enabled: true + # server { } ブロックの末尾にそのまま挿入される。 + # PHPの location ~ \.php$ はチャート本体が定義済みのため、ここでは再定義しない + # (タイムアウト等は server レベルで指定すれば PHP の location にも継承される) snippet: | - client_max_body_size 100M; - - location ~ \.php$ { - fastcgi_pass 127.0.0.1:9000; - fastcgi_index index.php; - fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; - include fastcgi_params; - - fastcgi_read_timeout 300; - fastcgi_send_timeout 300; - } - + fastcgi_read_timeout 300; + fastcgi_send_timeout 300; + location /admin { auth_basic "Administrator Area"; auth_basic_user_file /etc/nginx/.htpasswd; @@ -546,6 +550,8 @@ persistence: enabled: true ``` +> `snippet` で指定する際の注意点は、[Nginx設定](#nginx設定)の「`nginx.customConfig.snippet` の注意点」を参照してください。 + ### 例7: ベアメタル環境でのリアルIP取得 ベアメタルKubernetesやLoadBalancer経由でのアクセスで、PHPからクライアントの実IPアドレスを取得する設定です。 @@ -706,11 +712,13 @@ ingress: hosts: - api.production.com +# アップロード上限は snippet ではなく uploadMaxSize で設定する +uploadMaxSize: "50m" + nginx: customConfig: enabled: true snippet: | - client_max_body_size 50M; fastcgi_read_timeout 300; # Opcache設定 diff --git a/templates/configmap-nginx.yaml b/templates/configmap-nginx.yaml index b4dffbb..0619dee 100644 --- a/templates/configmap-nginx.yaml +++ b/templates/configmap-nginx.yaml @@ -1,3 +1,11 @@ +{{- /* + 【未使用】このファイルは出力されない。 + 下の if が参照する .Values.nginx.enabled は values.yaml に存在しないため、常に偽になる。 + 実際に使われる nginx 設定は templates/configmap.yaml(deployment.yaml が nginx.conf キーを + マウントしている)。カスタム設定として読まれるのは nginx.customConfig.snippet のみで、 + このファイルだけが読む serverSnippet / httpSnippet は指定しても無視される。 + nginx の設定を変更する場合は configmap.yaml を編集すること。 +*/ -}} {{- if .Values.nginx.enabled }} apiVersion: v1 kind: ConfigMap diff --git a/values.yaml b/values.yaml index 0c00364..2361726 100644 --- a/values.yaml +++ b/values.yaml @@ -64,6 +64,16 @@ persistence: size: 1Gi nginx: + # 独自のnginx設定を、server { } ブロックの末尾へそのまま挿入する(templates/configmap.yaml)。 + # 読まれるキーは snippet のみ。serverSnippet / httpSnippet は未使用の + # templates/configmap-nginx.yaml 専用で出力されないため、指定しても無視される。 + # また挿入先は server ブロック内のため、http レベル専用のディレクティブ + # (limit_req_zone 等)は書けない。 + # + # 【重複注意】以下はチャートが自動で出力するため snippet に書かない + # (書くと "directive is duplicate" 等で nginx が起動しなくなる): + # - client_max_body_size → uploadMaxSize で設定する + # - location = /sitemap.xml(Content-Typeの明示) customConfig: enabled: false snippet: |-