私は現在、Centos 6.6 OSでnginx/1.0.15を実行しています。サーバーには次の仕様があります。
問題
サーバーは1ギガビット/秒の接続を備えていますが、400〜500メガビット/秒の後に最高の状態になり、ボトルネックになります。約100接続でサービスが低下し始めます。サーバーとの速度は劇的に低下します(50%の帯域幅がまだ利用可能であるにもかかわらず)。
NGINXサーバーは、静的な.mp4ファイルを提供するためのものです。各ファイルは通常400〜1200 MBです(平均は700 MB)。
私は多くの多くの構成を試しましたが、それらのほとんどすべてが同じ結果を与えてくれます。非常にイライラしています。
サーバーの負荷も0.3を超えることはありません。
私の設定に露骨に間違っている、または見当違いの何かがありますか?何かが役立つかもしれません。
構成
/ etc/nginx/nginx.conf
user nginx;
worker_processes 9;
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;
events {
worker_connections 51200;
use epoll;
}
worker_rlimit_nofile 600000;
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
#access_log /var/log/nginx/access.log main;
access_log off;
aio on;
sendfile off;
tcp_nopush off;
tcp_nodelay on;
#keepalive_timeout 0;
keepalive_timeout 65;
output_buffers 1 3m;
#gzip on;
include /etc/nginx/conf.d/*.conf;
open_file_cache max=10000 inactive=5m;
open_file_cache_valid 2m;
open_file_cache_min_uses 1;
open_file_cache_errors on;
}
/ etc/nginx/conf.d/default.conf
server {
listen 80 default_server sndbuf=32k;
server_name _;
#charset koi8-r;
#access_log logs/Host.access.log main;
include /etc/nginx/default.d/*.conf;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
location /Videos/ {
root /home;
gzip off;
gzip_static off;
mp4;
mp4_max_buffer_size 300m;
}
location /stats {
stub_status on;
}
error_page 404 /404.html;
location = /404.html {
root /usr/share/nginx/html;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
より良いスタートは、次のルールのセットです:
構成:
events {
accept_mutex off;
}
access_log off;
sendfile on;
sendfile_max_chunk 512k;
新しいNginx(1.7.11以降)機能のスレッドプールは、あなたの場合に非常に役立ちます。
location / {
root /home;
aio threads;
mp4;
}
テストサンプルでは、帯域幅を1 Gbpsから最大9 Gbpsに劇的に増やすことができます。九回!たったの1Gbpsですが、すべてが利用されています。
詳細をご覧ください: https://www.nginx.com/blog/thread-pools-boost-performance-9x/
まず最初に、実際の.mp4ファイルを使用することをお勧めします。このファイルには、通常、大きな改善点があります。
したがって、NGINXまたはApacheのチューニングに迷う前に、まず.mp4ファイルをチューニングしてください。
このポストのシネマティックは、各フレームの変更が必要な映画やテレビ番組のようなものです。つまり、「The Croods」のような映画を1 fps(フレーム/秒)に再トランスコードしようとすると、品質が低下して視聴できなくなります。
また、非シネマティックとは、当社のコースウェアがUdemyに投稿されたウェビナーのような画面キャプチャを指します。
最初に、ファイルのオーディオコンポーネントを検討します。オーディオコンポーネントが主に話している場合は、ffmpegを使用して、ビデオストリームをコピーするファイルを再トランスコード(変更なし)+ステレオストリームをモノに変換します。多くの.mp4ファイル(非シネマティック)の場合、ムービーファイルサイズの約1/3はビデオ+ 1/3は左オーディオチャネル+ 1/3は右オーディオチャネルです。ステレオからモノに変更すると、ファイルサイズを大幅に縮小できます。
次に、FDK-AAC( https://github.com/mstorsjo/fdk-aac )を使用してオーディオを再トランスコードし、他のaacエンコーダーよりもはるかに小さいファイルを生成します。最近のffmpegのほとんどのバージョンは、FDK-AACを自動でビルドします。 Macportsでもこれをビルドします。 FDKがそれを行うための1つの考慮事項は、FDKステレオオーディオ圧縮を使用する場合、ステレオトラック+モノラルよりもはるかに小さい圧縮が必要であるため、FDKを使用している場合は、ステレオを使用することです。
第三に、オーディオのビットレートを減らします。多くの場合、これは48kなので、一般的に-ar 44100(ffmpeg)または音声(low fi)を使用する場合は、22050に下げることを検討してください。
4つ目は、ビデオのフレームレートをできるだけ低く設定することです。したがって、画面キャプチャを実行している場合、フレームは10〜60秒に1回しか変更されない可能性があるため、-r $ fpsを使用してフレームレートをドロップできます。30〜60 fpsから1〜5 fpsまで何度も+品質は変わりません一方、ファイルサイズは急落します。
多くの場合、1Gごとに10〜20Mに減る非シネマティックファイルを圧縮します。
5番目に、ファイルのダウンロードではなくストリーミングできるように、faststart mov atomがファイルの先頭にあることを確認します。
私のffmpeg fdkパラメータ...
-c:a libfdk_aac -profile:a aac_he_v2 -afterburner 1 -signaling explicit_sbr -vbr 5 -ac 2 -ar 44100
実際、これが典型的な完全なffmpegコマンドです...
Mp4スクリプトはffmpegのラッパーにすぎず、オーディオ+ビデオトラックが英語であると推測して(マルチトラックavi + mkvファイルの場合)、ffmpegコマンドをビルドするようなものです。興味深いのは、何年にもわたる実験の残りである実際のコマンドです。
最初にffmpegの極端な圧縮でファイルを実行してみてください。次に、ファイルの重みが非常に小さい/小さいかどうかを確認します。Webサーバーの調整は必要ありません。
実験領域:-r $ fps + -v:crf + -v:preset + -arビットレート
少し実験すると、最小ファイルサイズ+許容できる品質の設定が得られます。
+ genpts + SAR/DARのクリアなどの奇妙なオプションの多くは、Rokuユニットで.mp4ファイルを確実に再生するためにあります。これらは、500万以上の世帯に無料で到達できる独自のRokuチャネルをセットアップする場合に備えておくと便利です。
私のffmpegコマンド...
iMac> mp4 --dr --noisy foo.avi
cd '/Users/david/Downloads/Casper.A.Spirited.Beginning.1997.DVDrip.iNTERNAL.XviD-BPDcarrier' Nice -19 ffmpeg -fflags + genpts -i "foo.avi" -map 0:0 -c: v libx264 -crf:v 18 -preset:v veryfast -tune:v film -level:v 4.1 -profile:v high -bufsize:v 5000k -vf setdar = dar = 0、setsar = sar = 0 -x264opts colorprim = bt709 :transfer = bt709:colormatrix = bt709:fullrange = off -r 29.97 -movflags + faststart -map 0:1 -c:a libfdk_aac -profile:a aac_he_v2 -afterburner 1 -signaling explicit_sbr -vbr 5 -ac 2 -ar 44100- metadata title = 'Foo(TC)' -threads 0 -f mp4 -benchmark Foo-640x480-veryfast-crf18-max-tc.mp4.tmp mv -f Foo-640x480-veryfast-crf18-max-tc.mp4.tmp Foo-640x480-veryfast-crf18-max-tc.mp4
Multi_acceptをオンにするとうまくいきました(ビデオは半分ほど止まり、訪問者はもう半分を聞く/見ることができず、非常にイライラしました)。
イベントでnginx.confに設定した唯一のものは次のとおりです。
events {
worker_connections 768;
multi_accept on;
}
**今日は機能しますLOL ....明日はまだ完全に機能するかどうかを確認する必要があります