FFmpeg – Videos HTML5-kompatibel mit FFmpeg konvertieren (webm, mp4, ogv)

Seit HTML5 können Videos nativ, also ohne zusätzliche Software eingebunden werden. Um vorhandene Video-Dateien zu konvertieren, benutze ich FFmpeg. Irgendwann habe ich die Commands mal niedergeschrieben, um mir das Getippe zu ersparen:

## WEBM:
ffmpeg -i movie.file -vcodec libvpx -b:v 600k -acodec libvorbis -ac 2 -b:a 96k -ar 44100 -vf scale=480:-1 -map 0 out.webm
## MP4:
ffmpeg -i movie.file -vcodec libx264 -b:v 600k -acodec libfdk_aac -ac 2 -ar 48000 -b:a 96k  -vf scale=480:-1 -map 0 out.mp4
## OGV:
ffmpeg -i movie.file -vcodec libtheora -b:v 600k -acodec libvorbis -b:a 96k -vf scale=480:-1 -map 0 out.ogv

Ist „libfdk_aac“ nicht vorhanden, so kann auch ein anderer ACC Encoder verwendet werden. Laut FFmpeg ist die Reichenfolge bezüglich der Qualität folgende:
libfdk_aac > libfaac > Native FFmpeg AAC ≥ libvo_aacenc

Mit „-map 0“ werden alle Streams der Datei verarbeitet. „-vf scale=480:-1“ gibt an, dass die Höhe unter Berücksichtung der Aspect Ratio selbstständig ausgewählt wird. Die Breite beträgt 480. Die Bitrates sind natürlich immer anpassbar, für kleine Web-Videos halte ich 480*x und 600k für das Bild für annehmbar.

Natürlich könnte man noch viel mehr einstellen. FFmpeg ist sehr gut dokumentiert, weshalb man auf (fast) jede Frage eine Antwort findet.

Welcher Browser welche Formate unterstützt, wird unter anderem hier beschrieben: http://www.w3schools.com/html/html5_video.asp

Nginx vor Floods schützen (limit_req)

Nginx bietet mit „limit_req“ eine Funktion, die übermäßige Requests limitiert und so auch dazu eingesetzt werden kann, übermäßige PHP Auslastung zu verhindern.

Eine kurze Definition der Parameter vorab:

Zone: Quasi der Handler für die Limitierung. Es kann ein Limit in MB festgelegt werden. Der Benutzer wird bei mir via „$binary_remote_addr“ identifiziert, was etwa 64 Byte sind. 1 MB kann demnach 16384 Requests speichern. Die Zone kann benannt werden.

Rate: Die Anzahl an Requests, die ein einzelner Besucher pro Sekunde anfragen darf.

Burst: Burst ist sozusagen die Warteschlange für Requests, die das Limit übersteigen. Ist zum Beispiel ein Limit von 3 Requests pro Sekunde eingestellt, der Besucher stellt allerdings 5, so gehen 2 Requests in die Warteschlange und werden eine Sekunde ausgeführt. Stellt der Benutzer allerdings 9 Requests, so würden 3 sofort ausgeführt, gingen in den Burst und einer würde den Burst übersteigen. Das Resultat wäre, dass Nginx den Fehler „503 – Service Temporarily Unavailable“ anzeigt.

Delay: Hiermit wird beschrieben, ob Nginx die „quasi Warteschlange“ des Burst benutzt. „nodelay“ bewirkt, dass beim übersteigen der Requests unverzüglich „503 – Service Temporarily Unavailable“ angezeigt würde.

Zuerst wird die Datei /etc/nginx/nginx.conf geöffnet und eine Zone innerhalb von „http“ erstellt. Die Parameter sind nur Beispiele und sollten entsprechend angepasst werden:

http {
limit_req_zone  $binary_remote_addr  zone=one:3m   rate=7r/s;
...

Jetzt den jeweiligen Server bearbeiten, zum Beispiel „/etc/nginx/sites-available/default“. „limit_req“ muss innerhalb einer Location definiert werden, die das Limit erhält, zum Beispiel:

location / {
limit_req zone=one burst=5
}

Wer Nginx mit fastcgi für PHP benutzt, der kann sein Limit auch auf seine PHP-Scripts limitieren. Dazu wird einfach die vorhandene Location für PHP benutzt, zum Beispiel „location ~ \.php$“.

Achtung: Jedes Objekt stellt einen Request dar. Ein Bild auf einer Website würde also schon zwei Requests bedeuten. Es ist daher schlau, die Requests höher einzustellen oder sich direkt auf die Location für PHP (falls vorhanden) zu beziehen. Wird ein Delay eingesetzt, kann dies dem Besucher die Stimmung durch übermäßige Wartezeiten durchaus vermiesen.
Alternativ kann unterhalb von „limit_req“ mit „limit_req_log_level error;“ das Logging definiert werden, um abgewiesene Verbindungen zu analysieren. Ich persönlich verzichte auf das Delay.

Neueste Pakete von Nginx, PHP und MySQL für Debian (Squeeze, Wheezy)

Mit dem dotdeb Repository lassen sich auch in Debian die neuesten Versionen von (u.a.) Nginx, PHP und MySQL einfach installieren.

Das Repository lässt sich schnell einrichten:

echo "deb http://packages.dotdeb.org wheezy all" > /etc/apt/sources.list.d/dotdeb.list
echo "deb http://packages.dotdeb.org wheezy-php55 all" >> /etc/apt/sources.list.d/dotdeb.list
curl http://www.dotdeb.org/dotdeb.gpg | apt-key add -
apt-get update

„wheezy“ kann durch „squeeze“ ersetzt werden. Ältere Versionen werden nicht unterstützt. Wie man sieht, sind die PHP Pakete optional.

Mehr dazu auf www.dotdeb.org

Pure-FTPd mit virtuellem Benutzer für www-data

Pure-FTPd ist schnell eingerichtet und lässt sich im Vergleich zu anderen FTPd sehr einfach bedienen. Die Administration über die Shell ist simpel, Konfigurationsdateien müssen eigentlich nur bei der erstmaligen Einrichtung bearbeitet werden. Die pure-* Werkzeuge – insbesondere „pure-pw“ – erleichtern dem Admin oft das Leben.

Changelog

  • 29.11.2013 – Formatierung gefixt und SSL hinzugefügt

Erst einmal Pure-FTPd aus dem Repository installieren:

apt-get install pure-ftpd

Eigentlich die Standardeinstellung, sollte jedoch besser noch einmal überprüft werden: Die Datei „/etc/default/pure-ftpd-common“ öffnen und sichergehen, dass „STANDALONE_OR_INETD=standalone“ gesetzt ist. Wer später Symlinks im FTP-Client folgen möchte, der darf jetzt ebenfalls die Option „VIRTUALCHROOT=true“ setzen.
Da unser Pure-FTPd Benutzer sich quasi als www-data ausgeben soll, der in der Regel die UID 33 besitzt, muss folgender Befehl ausgeführt werden, um die Anmeldung zu ermöglichen:

echo "33" > /etc/pure-ftpd/conf/MinUID

Ich möchte die PureDB als Datenbank meiner Benutzer verwenden und außerdem PAM-Auth verbieten:

ln -s /etc/pure-ftpd/conf/PureDB /etc/pure-ftpd/auth
echo "no" > /etc/pure-ftpd/conf/PAMAuthentication

Und weil es gerade so Spaß macht, hier noch ein paar weitere Einstellungsmöglichkeiten, die eventuell interessant sind:

echo "20000 21000" > /etc/pure-ftpd/conf/PassivePortRange
echo "yes" > /etc/pure-ftpd/conf/IPV4Only
echo "500" > /etc/pure-ftpd/conf/MaxClientsNumber

Die PassivePortRange muss gegebenenfalls in der Firewall freigeschaltet werden. MaxClientsNumber darf maximal 500 betragen.

SSL (Implicit, AUTH TLS: Der aktuelle Standard) kann bei Bedarf ebenfalls aktiviert werden:

echo "1" > /etc/pure-ftpd/conf/TLS

Wobei 0 bedeuten würde kein TLS, 1 TLS + Klartext, 2 TLS erzwingen, 3 Datenkanal ebenfalls verschlüssen (erzwingen).
Der Schlüssel muss in der Datei „/etc/ssl/private/pure-ftpd.pem“ eingetragen sein. Liegen z.B. .crt, .key und .ca einzeln vor, können diese mit „cat“ zu einer Datei zusammengefügt werden. Ein eigenes self-signed Zertifikat kann alternativ ebenfalls erstellt werden. Vorab das entsprechende Verzeichnis erstellen, falls es nicht vorhanden ist:

mkdir -p /etc/ssl/private/
openssl req -x509 -nodes -days 7300 -newkey rsa:2048 -keyout /etc/ssl/private/pure-ftpd.pem -out /etc/ssl/private/pure-ftpd.pem

Den Key absichern vor fremden Zugriff:

chmod 600 /etc/ssl/private/pure-ftpd.pem

Soll beim Login eine eigene Willkommensnachricht angezeigt werden, etwa „Willkommen auf meinem FTP-Server“, müssen folgende Befehle ausgeführt werden:

echo "/etc/ftpwelcome" > /etc/pure-ftpd/conf/FortunesFile
echo "Willkommen auf meinem FTP-Server" > /etc/ftpwelcome

Via FortunesFile wird tatsächlich nur der Pfad zur Datei, die die eigentliche Nachricht enthält angegeben.

Jetzt wird der virtuelle Benutzer, der sich dem System gegenüber als www-data ausgibt erstellt. In diesem Fall erfolgt die Anmeldung am FTP also als Benutzer „ftpuser“, ein Passwort wird im Anschluss abgefragt. Am Ende des Befehls wird das Verzeichnis angegeben, in das der Benutzer sich einloggen wird:

pure-pw useradd ftpuser -u www-data -g www-data -d /var/www

Noch schnell die Datenbank aktualisieren, damit die Änderungen auch aktiv werden und im Anschluss den Pure-FTPd neustarten:

pure-pw mkdb
service pure-ftpd restart

Sind die Ports 20 und 21 (evtl. eben auch die PassivePorts) in der Firewall freigeschaltet, sollte die Verbindung nun hergestellt werden können. Alle Änderungen im Dateisystem werden als Benutzer „www-data“ ausgeführt.

Weitere Benutzer hinzufügen

Soll später ein neuer Benutzer hinzugefügt werden, reicht die Verwendung von „pure-pw useradd …“ im gleichen Format wie oben. Ganz wichtig: Anschließend immer pure-pw mkdb ausführen!