AlmaLinux 9 + Apache に mod_xsendfile を導入したので備忘録
■はじめにX-Sendfile とは、PHPなどのスクリプト経由で実ファイルを配信するための Apache モジュールです。
通常、PHPでファイルを読み込んで出力すると、下記のような問題があります。
・メモリを消費する
・大容量ファイルでパフォーマンスが落ちる
・Range配信などが煩雑になる
X-Sendfile を使うと、
「認可だけPHPで行い、実ファイル送信はApacheに任せる」
という構成が可能になります。
用途の例としては、ログインしている人にしかダウンロードさせたくないデータがあるけれど、
実ファイル(mp3やzip)のURLをSNSなどにばらまかれてダウンロードされたら困るという時などがあげられます。
余談ですが、仕事などで完全に限定的な人にだけ渡したい場合はダイジェスト認証などの方が楽です。
用途に合わせて使い分けていきましょう。
■ 環境情報
本記事では AlmaLinux 9 + Apache 2.4 系を前提とします。
昨今はもっぱら Nginx も流行っていますが、その場合は X-Accel-Redirect などで調べてみるといいかと思います。
■ mod_xsendfile のインストール
まずはEPELとCRBを有効化し、モジュールをインストールします。
# sudo dnf -y install epel-release
# sudo dnf config-manager --set-enabled crb
# sudo dnf -y install mod_xsendfile
設定テスト
# sudo apachectl configtest
問題なければ再起動
# sudo systemctl restart httpd
この際、reload を使いたくなりますが、個人的には不安です。
まだ、非公開環境などで好きに再起動できるなら restart をオススメします。
■ 配信用ディレクトリの作成
X-Sendfileで送信を許可する実ファイル置き場を作ります。
# sudo mkdir -p /var/www/xsendfile_data
テスト用ファイル作成(任意だが確認用として推奨)
# sudo sh -c 'echo "X-Sendfile OK." > /var/www/xsendfile_data/test.txt'
所有者とパーミッション設定
# sudo chown -R apache:apache /var/www/xsendfile_data
# sudo chmod 750 /var/www/xsendfile_data
※ 実運用では公開ディレクトリ配下に置かず、直接URLでアクセスできない場所に置くのが基本です。
ただ、有料製品などの重要なデータでなく、「ちょっと隠蔽したい」ぐらいなら管理しやすいディレクトリでもいいでしょう。
■ Apache 側の設定
httpd.conf もしくは VirtualHost 内に以下を追加します。
- X-Sendfile ----
# X-Sendfile を有効化
XSendFile On
# X-Sendfile で送ってよい実ファイルの置き場
XSendFilePath /var/www/xsendfile_data
-----------------
設定確認
# sudo apachectl configtest
反映
# sudo systemctl reload httpd
※こちらは reload で間違いなく大丈夫です。
■ PHP 側のテストコード
例えば xsendfile_test.php に以下を書きます。
<?php
header('X-Sendfile: /var/www/xsendfile_data/test.txt');
exit;
このphpへブラウザでアクセスし、「X-Sendfile OK.」と表示されれば成功です。
半年前のアンケートとかでスコアの高かったモノをまとめた
— りょうご (@Ryogo_PL) April 28, 2025
『ちびキャラ用 コスチューム素材プラグイン Vol.4』を
公開しておきましたhttps://t.co/Rm9dts90Gx pic.twitter.com/CgfbKVUhUg
昔描いたイラストをマイブームな画風で描き直してみたシリーズ pic.twitter.com/jNxnKCyMsn
— りょうご (@Ryogo_PL) November 12, 2023
昔描いた 東方イラスト をマイブームな画風で描き直してみたシリーズ pic.twitter.com/AV9PMOWa5c
— りょうご (@Ryogo_PL) July 9, 2022

