努力したWiki

推敲の足りないメモ書き多数

ユーザ用ツール

サイト用ツール


documents:other:memo03:other-020

猫からのお叱り:画像と配信設定

ChatGPT生成

成果物

  • cat-notice.png:大きな原寸ポスター。
  • cat-notice.webp:画像として圧縮済みの配信用ファイル。設定例はこれをそのまま返します。
  • cat-notice.png.gz:PNGのgzip版。保管・ダウンロード用で、下記設定では配信しません。
  • info-cat.conf:対象VirtualHost内に追加する設定例。
    # Place inside the intended VirtualHost, before broad AliasMatch rules.
    # Requires mod_alias and mod_authz_core. Headers are optional.
    AliasMatch "^/info$" "/usr/local/www/info-cat/cat-notice.webp"
     
    <Directory "/usr/local/www/info-cat">
        AllowOverride None
        Options -Indexes -ExecCGI -Includes
        Require all granted
        <Files "cat-notice.webp">
            SetHandler default-handler
            ForceType image/webp
            AcceptPathInfo Off
        </Files>
    </Directory>
     
    <LocationMatch "^/info$">
        SetHandler default-handler
        ForceType image/webp
        <LimitExcept GET HEAD>
            Require all denied
        </LimitExcept>
        <IfModule mod_headers.c>
            Header set X-Content-Type-Options "nosniff"
            Header set Cache-Control "public, max-age=3600"
        </IfModule>
    </LocationMatch>

FreeBSD / Apache 2.4 への設置

実サーバーの設定・モジュール・PHPハンドラは未確認です。この設定は実機検証済みではありません。設定のバックアップ後、対象ホストで構文確認と応答確認を行ってください。

root権限で専用ディレクトリを作り、配信用WebPだけを置きます。転送済みファイルの場所に応じてコピー元を変更してください。

install -d -o root -g wheel -m 755 /usr/local/www/info-cat
install -o root -g wheel -m 644 cat-notice.webp /usr/local/www/info-cat/cat-notice.webp
/usr/local/sbin/apachectl -M

alias_module と authz_core_module が必要です。headers_module があればキャッシュとnosniffヘッダーも付与します。info-cat.conf の内容を /usr/local/etc/apache24/httpd.conf 内、または既存のIncludeから読み込まれる設定ファイルの、対象VirtualHostの内側に追加します。広い範囲を扱うAliasMatchより前に置いてください。

既存のRewriteRule、Redirect、ProxyPass、Location、PHP設定との競合はこの断片だけでは判断できません。特に既存の全URL向けプロキシやリライトがある場合は、その設定側でも /info を除外する調整が必要です。既存のアクセス制限があるホストでは Require all granted の影響も確認してください。

/usr/local/sbin/apachectl configtest
# Syntax OKを確認してから
service apache24 graceful
curl -I https://YOUR-HOST/info
curl -fsS https://YOUR-HOST/info -o /tmp/info-check.webp
cmp /usr/local/www/info-cat/cat-notice.webp /tmp/info-check.webp
curl -I https://YOUR-HOST/info/
curl -I https://YOUR-HOST/information
curl -I https://YOUR-HOST/info/test
curl -I 'https://YOUR-HOST/info?test=1'
curl -X POST -I https://YOUR-HOST/info

YOUR-HOSTを実際のホスト名に置き換えます。GET /info は通常200と image/webp、HEADは本文なし、POSTは403を想定します。末尾スラッシュ・子パス・information はこのAliasMatchに一致せず、既存サイト側の処理になります。クエリ文字列はパスではないため /info?test=1 も画像になります。ここでいう完全一致はApacheが処理するURLパスに対する一致であり、生のリクエスト表記を限定するものではありません。

圧縮と転送量の注意

WebPはすでに画像圧縮されています。gzipを重ねても小さくなるとは限りません。配信用WebPは Content-Type: image/webp で返し、Content-Encoding: gzip は付けません。PNG.gzをHTTP圧縮として配信するなら、Accept-Encodingによる選択、非対応クライアントへの未圧縮版、Content-Type: image/png、Content-Encoding: gzip、Vary: Accept-Encoding、二重圧縮の防止が別途必要です。本例はその複雑さを避けてWebPを固定配信します。

大きい画像を返すほど、主に自分側の転送量と接続占有が増えます。たとえば1応答300 kBを10万回送れば、本文だけで約30 GB(十進)です。キャッシュを無視する巡回にもこの費用は発生します。HTTPクライアントが画像をデコードする保証もなく、相手の計算資源を消費させられるとは限りません。

この画像の返却はアクセス抑止策ではありません。負荷を下げたい場合は小さな403/404応答や入口側の制限の方が適する可能性があります。実在する /info の機能を置き換えてよいかも確認してください。画像に異常な展開サイズ、再帰圧縮、遅延送信は使用していません。

一次資料

documents/other/memo03/other-020.txt · 最終更新: by k896951

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki