我将一些ffmpeg视频处理功能包装为openfaas处理程序。
我所有的功能(bash 脚本)在本地都可以正常工作。
部署的功能适用于小视频文件(< 40MB),但不适用于较大的视频(测试 100MB 文件)
我使用 nginx 作为代理。
NGINX 配置:
...
location / {
proxy_read_timeout 1800;
proxy_connect_timeout 1800;
proxy_send_timeout 1800;
send_timeout 1800;
client_max_body_size 2G;
proxy_pass http://127.0.0.1:8080;
}
...
功能视频预览/处理程序:
#!/usr/bin/env bash
# Create a temporary filename
r=`date +%s%N`
IN=/tmp/$r.in.mov
OUT=/tmp/$r.out.mp4
SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
WM=${SCRIPT_DIR}/wmark-nologo-preview.png
# Save stdin to a temp file
cat - > ${IN}
# creates a mp4 version of the mov src,
# with slight cropping on the sides to avoid
# black bars, and max limits to 1280x720
# no padding applied. deinterlaces.
ffmpeg -y -threads 1 -thread_queue_size 32768 -loglevel error -ss 0 -i ${IN} -vcodec libx264 -b:v 2500k -ar 44100 -ab 160k -g 75 -s hd720 -vf "crop=38/40*in_w:38/40*in_h [cr],movie=${WM} [wmark]; [cr][wmark] overlay=main_w-overlay_w:0 ,yadif" -hide_banner ${OUT} 2> /dev/null
cat ${OUT}
# After printing to stdout, the client has received the data via streaming
# Now we delete the temporary file
rm ${IN}
rm ${OUT}
开放式faas yaml:
version: 1.0
provider:
name: openfaas
gateway: https://my.faas.domain
functions:
video-preview:
lang: bash-streaming
handler: ./video-preview
image: *****/video-preview
build_args:
ADDITIONAL_PKG: ffmpeg
environment:
write_timeout: 30m
read_timeout: 30m
exec_timeout: 30m
我成功地在本地测试了该功能:
cat /path/to/input/video.mov | ./video-preview/handler.sh > /path/to/output/video-preview.mp4
和
curl -kSLsf https://my.faas.domain/function/video-preview --data-binary "@/path/to/input/video.mov" > /path/to/output/video-preview.mp4
部署的函数适用于小视频,但较大的视频返回 502 Bad gateway失败。
功能正在部署到具有2vCPU和2G 内存的 DigitalOcean 虚拟服务器。
我的猜测是该函数正在使用 100% 的 CPU 资源并重新启动 docker 容器,导致 502 错误。
我怎样才能防止这种情况?