HimaJyun少し前に「X-SendFile、X-Accel-Redirectの使い方」と言う記事を書きました。この中で「X-SendfileやX-Accel-Redirectを使用するとほんの少し早い」とか書いてありますし、実際ほんの少し早いのですが「どれくらい早い」と言う実測データを求める方も居ると思われるので計測してみました。16.04にインストールされたnginxとApache、比較用としてPHPと直接送信した場合を測定します。各バージョンは以下の通り。16.04からcurlを利用してGETリクエストを送ります。URL)送信プログラムPHPで送信する場合は以下のコードを利用。実際に測定してみよう。普通の状態とりあえず、普通に送信した(サーバ上のファイルに直接アクセスした)時の速度を確認しておきましょう。101Mだいたい秒100MBくらいですね、今回はベストのスコアを載せているので誤差でApacheが早いですが、複数回測定して平均的に速かったのはnginxまぁ、早い/遅いったって、誤差レベルの違いだけど。82.4MApacheは殆ど劣化が生じていない。nginxの方は大幅な性能劣化が発生、と言うより早い時と遅い時の振れ幅が大きくなった感じ(多分だがphpから送信されたコンテンツを一度nginx側で受け止めているからだろう、と予想)Apacheが動的コンテンツに強いと言う話はどうやら本当みたいで......対するnginxは仕組み上そもそも動的コンテンツの扱いが苦手X-Sendfile、X-Accel-Redirectで送信PHPとサーバ送信のいいとこどり、X-SendfileやX-Accel-Redirectで送信してみよう。110Mサーバ側でやっているから当たり前でしょうが、性能劣化なし、Apache、nginx共に最速で配信しています。これを利用すれば、巨大なファイルにアクセス制限(例:購入者限定など)を掛けつつ、高速にファイルを配信する事が可能です。これを使うと?ファイルを高速に配信出来る、が、それ以上に様々なメリットがある。余計なプロセスを使わない例えば、PHPであればphp-fpmがあり、それらは丁度、Apacheのpreforkと同じような動作をします。(事前にいくつかのプロセスを起動する)すなわち、プロセス数の上限があるわけです。巨大なファイルをプログラム側で送信すると、ただファイルを送るだけの処理にPHPのプロセスが1個占有されてしまいます。すると、結果として全体が捌けるアクセス数がプロセス1個分だけ減ってしまう訳です。X-Sendfileを使えば、ヘッダさえ送り出してしまえばそこから先はサーバのお仕事なので、空いたプロセスが次の処理を捌く事が出来ます。「PHPでのお話」みたいに書きましたが、別にこれはPHPに限らないと思いますよ。おススメの使い方おススメの使い方と言うか、ただのオブジェクト指向と抽象化の話でしょうけど......ファイル配信の際に「PHP」「X-Sendfile」「X-Accel-Redirect」を切り替え出来ると便利でしょう。要は抽象化ですが、「ファイル送信クラス」みたいなのを用意し、その中で「PHPからの送信」「X-Sendfile」「X-Accel-Redirect」を切り替える(抽象化してしまう)と楽かと思われます。すれば、切り替えの処理は「ファイル送信クラス」に追い出してしまえるので、「ファイル送信クラス->send("/path/to/file")」みたいにして共通の操作で送信できます。(X-Accel-Redirectは特殊な挙動で案外使い勝手が悪いのでその辺りは要注意)とにもかくにも目立ったデメリットみたいなものがないので、使える状況では積極的に使っていくと良いでしょう。この機能、案外知らない人......多そうなので。2017がリリースされました。......続きを読む→[Java]JDK付属のJVisualVMでプロファイリングプログラムに隠れた無駄な処理を省き、真のパフォーマンスを叩き出すためには欠かせな......続きを読む→PREViPhone5のバッテリ交換やってみたNEXT[Minecraft]1.11対応のSpigot(Bukkit)を用意するナカのヒト:HimaJyun​散って美しいのは桜だけです、情報はまとまっていた方が美しいのです。