我目前在 Centos 6.6 操作系统上运行 nginx/1.0.15。服务器具有以下规格:
- Intel(R) Atom(TM) CPU C2750 @ 2.40GHz(8 核)
- 32GB 内存
- 5 x 6000 GB 7200 RPM(Raid 10)
问题
该服务器具有 1Gbit/s 连接,但达到 400-500 mbit/s 后即达到峰值并出现瓶颈。服务在连接数达到约 100 个时开始下降……并且服务器速度急剧下降(尽管仍有 50% 的带宽可用)
NGINX 服务器仅用于提供静态 .mp4 文件。每个文件通常为 400-1200MB(平均 700MB)
我尝试了很多配置,但几乎所有配置都给出相同的结果。我非常沮丧。
服务器负载也从未超过 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/默认.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;
}
}
答案1
更好的开始可以是以下规则集:
- 禁用日志记录和 accept_mutex
- 启用发送文件
- 设置 sendfile_max_chunk
配置:
events {
accept_mutex off;
}
access_log off;
sendfile on;
sendfile_max_chunk 512k;
新的 Nginx(1.7.11 或更新版本)功能线程池对于您的情况非常有用:
location / {
root /home;
aio threads;
mp4;
}
在测试样本中,它极大地帮助您将带宽从 1Gbps 提高到 9Gbps。九倍!您只有 1Gbps,但它可以充分利用它。
查看更多详细信息:https://www.nginx.com/blog/thread-pools-boost-performance-9x/
答案2
一个好的起点是实际的 .mp4 文件,其中通常有大量可以改进的地方。
因此,在调整 NGINX 或 Apache 之前,请先调整您的 .mp4 文件。
对于这种后期电影来说,它就像一部电影或电视节目,每一帧都需要改变。换句话说,如果试图将《疯狂原始人》这样的电影重新转码为 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 发挥真正的魔力,需要立体声音轨 + 使用 FDK 时,立体声音频压缩比单声道小得多,因此如果您使用 FDK,请坚持使用立体声。
第三,降低音频比特率。很多时候这个比特率是 48k,所以一般使用 -ar 44100 (ffmpeg),或者对于语音 (低保真),考虑降低到 22050。
第四,将视频的帧速率设置得尽可能低。因此,如果您正在进行屏幕捕获,帧可能在 10-60 秒内只会改变一次,因此您可以使用 -r $fps 降低帧速率,很多时候从 30-60 fps 降低到 1-5 fps + 质量保持不变,而文件大小急剧下降。
很多时候我会压缩非电影文件,每 1G 都会减少到 10-20M。
第五,确保 faststart mov atom 位于文件的最前面,这样文件就可以流式传输而不是下载。
我的 ffmpeg fdk 参数...
-c:a libfdk_aac -profile:a aac_he_v2 -afterburner 1 -signalinglicit_sbr -vbr 5 -ac 2 -ar 44100
事实上,这是一个典型的完整的 ffmpeg 命令...
mp4 脚本只是 ffmpeg 的一个包装器,它可以完成诸如猜测哪些音频 + 视频轨道是英文(对于多轨 avi + mkv 文件)+ 然后构建 ffmpeg 命令等任务。真正有趣的是实际的命令,它是多年实验的成果。
首先尝试通过 ffmpeg 极限压缩运行您的文件,然后查看文件重量是否如此低/小,是否不需要进行 Web 服务器调整。
实验区域:-r $fps + -v:crf + -v:preset + -ar bitrate
稍加试验你就会得到最小文件大小+可接受质量的设置。
许多奇怪的选项(例如 +genpts + 清除 SAR/DAR)都是为了确保 .mp4 文件可以在 Roku 设备上播放。如果您设置了自己的 Roku 频道,这些选项就很有用,这是一种免费的方式,可以覆盖 5,000,000 多个家庭。
我的 ffmpeg 命令...
imac> mp4 --dr --noisy foo.avi
tc:diag=v:!h264:mpeg4,a:!aac:ac3 title='Foo (TC)' Foo-640x480-veryfast-crf18-max-tc.mp4
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
答案3
启用 multi_accept 对我来说是有用的(视频通常在中途停止,访问者无法收听/观看另一半,非常令人沮丧)。
我在 nginx.conf 中的事件下设置的唯一内容是:
events {
worker_connections 768;
multi_accept on;
}
**今天可以了,哈哈……明天我们只需要看看它是否还能正常播放