Installation Red5 Mediaserver
Auf FreeBSD ist zur Zeit nur die Red5 Version 0.9 (Stable) verfügbar. Das ist ok für den FlashComs Chatserver 7.0 wo red5 Version 0.9 empfohlen wird. Bei der Chat Server Version 7.1 wird jedoch die Red5 Version 1.0 RC1 empfohlen.
Damit alle Abhängigkeiten normal mitinstalliert werden, würde ich erst ganz normal die Current Version installieren, danach auf die Version 1.0 Rc1 Upgraden (siehe weiter unten).
- Installation Red5 0.9 Final
- Upgrade auf Version Red5 1.0.0 RC2
- Installation von Tarball
- Konfigurierung für SSL Support per HTTPs
- Fehlermeldungen / Problembehebung
- Exception in thread "main" java.lang.NoClassDefFoundError: org/red5/server/Bootstrap
- [ERROR] [pool-2-thread-1] org.red5.server.persistence.FilePersistence - Could not create directory /usr/local/red5/webapps/chat7_trial/persistence/SharedObject
- Port 5080 : Remote Connection refused
- Memory Probleme: java.lang.OutOfMemoryError: Java heap space
- java.io.IOException: Cannot bind to URL [rmi://0.0.0.0:9999/red5]: javax.naming.ConfigurationException [Root exception is java.rmi.UnknownHostException: Unknown host: 0.0.0.0; nested exception is:
- [ERROR] The scratchDir you specified: [..] is unusable.
Installation Red5 0.9 Final
cd /usr/ports/www/red5 make install clean
Bei den Options für JDK alles deaktivieren
lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqk x Options for jdk 1.6.0.3p4_28 x x lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqk x x x [ ] DEBUG Enable debugging support x x x x [ ] IPV6 Enable IPv6 support x x x x [ ] WEB Enable the browser plugin and Java Web Start x x x x [ ] POLICY Install the Unlimited Strength Policy Files x x x x [ ] TZUPDATE Update the time zone data x x x x [ ] JAIL Port is being built within a jail x x x mqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj x tqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqu x < OK > x mqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj
Nun kommt eine Fehlermeldung, dass man wegen Lizenzsachen die Daten manuell runterladen müsse.
IMPORTANT: To build the JDK 1.6.0 port, you should have at least 2.5Gb of free disk space in the build area! Due to licensing restrictions, certain files must be fetched manually. Please download the Update 3 Source from http://www.java.net/download/jdk6/6u3/promoted/b05/jdk-6u3-fcs-src-b05-jrl-24_sep_2007.jar and the Source Binaries from http://www.java.net/download/jdk6/6u3/promoted/b05/jdk-6u3-fcs-bin-b05-jrl-24_sep_2007.jar and the Mozilla Headers from http://www.java.net/download/jdk6/6u3/promoted/b05/jdk-6u3-fcs-mozilla_headers-b05-unix-24_sep_2007.jar . Please download the patchset, bsd-jdk16-patches-4.tar.bz2, from http://www.eyesbeyond.com/freebsddom/java/jdk16.html. Please place the downloaded file(s) in /usr/ports/distfiles and restart the build. *** Error code 1 Stop in /usr/ports/java/jdk16. *** Error code 1 Stop in /usr/ports/java/jdk16.
Wichtig ist ebenfalls, dass man im /usr Verzeichnis genug Platz hat zum builden (2.5GB):
# df -h
Filesystem Size Used Avail Capacity Mounted on
/dev/vtbd0p2 1.5G 611M 779M 44% /
devfs 1.0k 1.0k 0B 100% /dev
/dev/vtbd0p3 1G 8.2M 918M 1% /tmp
/dev/vtbd0p4 5.9G 82M 5.4G 1% /var
/dev/vtbd1p1 9.9G 5.5G 3.6G 61% /usr
/dev/vtbd2s1e 9.7G 8.0k 8.9G 0% /data
/dev/vtbd2s1d 48G 8.0k 44G 0% /www
reicht also knapp ;-)
Also machen nun die Downloads…
cd /usr/ports/distfiles fetch http://www.java.net/download/jdk6/6u3/promoted/b05/jdk-6u3-fcs-src-b05-jrl-24_sep_2007.jar fetch http://www.java.net/download/jdk6/6u3/promoted/b05/jdk-6u3-fcs-bin-b05-jrl-24_sep_2007.jar fetch http://www.java.net/download/jdk6/6u3/promoted/b05/jdk-6u3-fcs-mozilla_headers-b05-unix-24_sep_2007.jar
Dann noch die Patchfiles downloaden und ebenfalls ins /usr/ports/distfiles Verzeichnis kopieren (einfach per zModem / rz)
Danach den Install fortsetzen:
root@corky(/usr/ports/www/red5)> make install clean
So, nun dauert es eine Weile. Bei diablo-jdk kommt der nächste Unterbruch. Als erstes deaktivieren wir aber noch die TZUPDATE Option, da wir die für den Chat nicht benötigen.
lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqk x Options for diablo-jdk 1.6.0.07.02_18 x x lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqk x x x [ ] POLICY Install the Unlimited Strength Policy Files x x x x [ ] TZUPDATE Update the time zone data x x x mqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj x tqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqu x < OK > x mqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqj
So, nun bricht er also mit folgender Meldung ab:
Because of licensing restrictions, you must fetch the distribution manually. Please access http://www.FreeBSDFoundation.org/cgi-bin/download?download=diablo-caffe-freebsd7-amd64-1.6.0_07-b02.tar.bz2 with a web browser and "Accept" the End User License Agreement for "Caffe Diablo 1.6.0". Please place the downloaded file(s) in /usr/ports/distfiles. *** Error code 1 Stop in /usr/ports/java/diablo-jdk16. *** Error code 1 Stop in /usr/ports/java/diablo-jdk16. *** Error code 1 Stop in /usr/ports/java/jdk16. *** Error code 1 Stop in /usr/ports/java/jdk16.
Also diese Files nun auch runterladen:
cd /usr/ports/distfiles/ links http://www.FreeBSDFoundation.org/cgi-bin/download?download=diablo-caffe-freebsd7-amd64-1.6.0_07-b02.tar.bz2
Im Links Browser die Lizenz akzeptieren und Download starten. Das File wird nun direkt ins distfiles Directory gespeichert.
Nun geht die Installation weiter…
root@corky(/usr/ports/www/red5)> make install clean
Sooo… endlich Teil 1 fertig 😉
===> Registering installation for red5-0.9.1_1 ===> Cleaning for red5-0.9.1_1
Das Startup Script befindet sich hier:
/usr/local/etc/rc.d/red5
Red5 wurde hier installiert:
/usr/local/red5
Jetzt noch red5 ins rc.conf Startup Config rein:
vi /etc/rc.conf #-----------------------------------------------# # Red5 Chatserver # #-----------------------------------------------# red5_enable="YES"
Firewall Settings
Damit der Server auch funktioniert, darf man die Firewall nicht vergessen…
vi /etc/ipfw.name.conf # was auch immer der name Deines Configfiles ist
Folgende Zeilen hinzufügen (1935 ist der default Port für den Chat, 843 ist für die Flash Policy.)
# unser chat server / flash policy add 21020 allow tcp from any to me 843 in via vtnet0 setup add 21025 allow tcp from any to me 1935 in via vtnet0 setup
und Firewall neu starten
/etc/rc.d/ipfw restart
Red5 starten & testen
# /usr/local/etc/rc.d/red5 start Starting red5.
Und jetzt die Logs checken für eventuelle Fehler:
tail -f /usr/local/red5/log/red5.log
Jetzt noch Ports checken:
# netstat -a | grep 1935 tcp4 0 0 *.1935 *.* LISTEN # netstat -a | grep 5080 tcp4 0 0 *.5080 *.* LISTEN
Das sind übrigens die Red5 Default-Ports:
cat /usr/local/red5/conf/red5.properties|grep port policy.port=843 http.port=5080 https.port=8443 rtmp.port=1935 rtmps.port=8443 rtmpt.port=8088 mrtmp.port=9035 proxy.source_port=1936 proxy.destination_port=1935 jmx.rmi.port.registry=9999 jmx.rmi.port.remoteobjects
Hier noch der Link zum Red5 Connection Tester.
Hier noch ein weiterer RTMP Port Tester.
Man kann auch mit rtmpdump arbeiten (gibts als Download für Windows, Linux, etc.)
Nun kann man auf den Server Connecten und den Red5 Installer aufrufen:
http://:5080/
Falls Fehler aufgetaucht sind (oder du nicht auf den Port 5080 Connecten kannst), findest Du die Lösung ev. in diesem Abschnitt.
Logfiles
Ich möchte alle Logfiles im /var/log Verzeichnis gespeichert haben. Auch die von red5 😉
Nun ist das Problem, dass bei Red5 praktisch jedes App die Locations der Logfiles in den logback.xml Configfiles gespeichert hat und man bei späteren Updates zu viele Files wieder anpassen müsste. Man kann zwar die Verzeichnisse für die Regulären red5 Logs einfach im /etc/rc.conf anpassen (red5_stdout_log= / red5_stderr_log=) aber eben – alle anderen Logs sind davon nicht betroffen. Daher mache ich die „faule“ Version – einfach ein Symlink:
rm -rf /usr/local/red5/log ln -s /var/log/red5 /usr/local/red5/log chown -R www:www /var/log/red5
Logrotate
Damit die Logfiles nicht zu gross werden möchte ich mit Logrotate die red5 Logfiles verwalten.
Nun haben wir aber das Problem, dass die Lösung per newsyslog NICHT funktioniert, da man nach dem Rotate den Chatserver neu starten müsste (wie man das z.B. auch bei Apache machen muss), damit die Logfiles weitergeschrieben werden. Da der Shutdown und Startup des Chatservers in der Regel ein etwas längerer Prozess ist, gäbe es während des Logrotates öfters ein unschönes Chat Connection Timeout, welches die Enduser ziemlich sicher mit der Zeit nerven würde. Als Referenz habe ich die newsyslog Variante unten aufgeführt. Funktionieren tut es allerdings mit der Red5 Variante. Red5 kann seine Logfiles glücklicherweise selber rotaten.
red5 Variante
Dieser Abschnitt gilt nur noch bis Red5 Version 0.9 – ab Version 1.0 gibt es ein neues Log Layout. Diese Version dann bitte nicht mehr verwenden, sonst startet der Red5 Server nicht!
Funktionierende Version 😉
Die Lösung dazu hab ich in diesem Blog sowie diesem Blog gefunden. Danke dafür! 🙂
cd /usr/local/red5/conf/ cp logback.xml logback.xml.orig vi logback.xml
Das ist nun die modifizierte Config:
[%p] [%thread] %logger - %msg%nlog/red5.logfalse
Und jetzt red5 neu starten damit die Änderungen greifen.
newsyslog Variante
Dieser Lösungsansatz gilt nur als Referenz und zeigt, wie man es nicht funktioniert.
vi /etc/newsyslog.conf
Folgende Zeilen hinzufügen:
# /var/log/red5/red5.log www:www 644 3 100 * JC /var/log/red5/red5.err www:www 644 3 100 * JC /var/log/red5/error.log www:www 644 3 100 * JC /var/log/red5/chat7.log www:www 644 3 100 * JC
newsyslog wird per Cronjob gestartet. Somit muss man den Service nicht neu starten. Das Configfile wird beim nächsten Cron durchlauf automatisch berücksichtigt.
Upgrade auf Version Red5 1.0.0 RC2
Als erstes benötigen wir ant von apache um red5 builden zu können. Wichtig ist, dass Apache Ivy sowie Red5 via Subversion installiert werden. Ansonsten gibt es dauernd install Probleme.
cd /usr/ports/devel/apache-ant make install clean
Jetzt noch Apache Ivy installieren.
cd /usr/local/software svn co https://svn.apache.org/repos/asf/ant/ivy/core/trunk ivy cd ivy ant jar
Nun ivy.jar in die korrekte Location kopieren:
cp build/artifact/jars/ivy.jar /usr/local/share/java/apache-ant/lib
Nun Red5 via Subversion Installieren (via Sources/Tarball Installieren hat bei mir nie geklappt) :
cd /usr/local/software svn checkout http://red5.googlecode.com/svn/java/server/trunk/ red5 cd red5 ant clean dist
Das müsste nun ein bisschen durchlaufen und mit BUILD SUCCESSFUL enden.
jar-determine-classpath:
jar:
[jar] Building jar: /usr/local/software/red5/red5.jar
[jar] Building jar: /usr/local/software/red5/boot.jar
dist:
[copy] Copying 40 files to /usr/local/software/red5/dist/lib
[copy] Copying 26 files to /usr/local/software/red5/dist/conf
[copy] Copying 7 files to /usr/local/software/red5/dist/plugins
[copy] Copying 1 file to /usr/local/software/red5/dist/webapps
[copy] Copying 11 files to /usr/local/software/red5/dist
BUILD SUCCESSFUL
Total time: 3 minutes 39 seconds
Red5 aktivieren
Als erstes die alten Webapps in die neue Version kopieren. In meinem Fall ist es lediglich der Chat:
cp -r /usr/local/red5/webapps/chat /usr/local/software/red5/dist/webapps/
Prüfen, dass die red5.properties korrekt sind. Also bei den Hosts keine Localhost (127.0.0.1) Einträge drin hat, sondern 0.0.0.0
cd /usr/local/software/red5/dist/conf vi red5.properties
Bei Bedarf IP’s Anpassen. Hier der VIM Befehl um gleich alle IPs zu ändern:
:%s/127.0.0.1/0.0.0.0/g
Nun noch die Logfile Location ändern:
cd /usr/local/software/red5/dist rm -rf log; ln -s /var/log/red5 log
Jetzt altes Verzeichnis Backupen zur Sicherheit und die neue Red5 Version kopieren:
/usr/local cp -r red5/ red5_bak /usr/local/etc/rc.d/red5 stop rm -rf red5; mv /usr/local/software/red5/dist/ ./red5 /usr/local/etc/rc.d/red5 start
Fehlermeldungen
Ok, es gibt nun noch etwas, das man korrigieren muss:
Fehler 1 SLF4J:
SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar:file:/usr/local/red5/red5.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: Found binding in [jar:file:/usr/local/red5/lib/logback-classic-0.9.28.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
Hier muss das File
/usr/local/red5/lib/logback-classic-0.9.28.jar
Manuell editiert werden. (Original Lösung hier)
- 7-Zip runterladen
- ein Backup von logback-classic-0.9.28.jar machen
- logback-classic-0.9.28.jar mit 7-Zip öffnen
- im JAR Archiv in die Struktur orgslf4jimpl rein
- dort StaticLoggerBinder.class LÖSCHEN
- fertig – speichern muss man nicht, geht automatisch.
- nun File wieder auf den Server laden.
Jetzt sollte der Server problemlos starten (falls nicht, mal alle fremden webapps löschen und nochmals probieren. Die könnten Probleme machen)
Dann wieder testen mit
http://:5080/
Und siehe da… Red5 Server 1.0.0 RC2 ist installiert 🙂
Installation von Tarball
Leider sind nicht alle Versionen per SVN verfügbar: http://red5.googlecode.com/svn/java/server/tags/
Wenn ich also Server Version 1.0RC1 benötige (aktuell wird per SVN bereits RC2 installiert) muss ich die Installation über einen Tarball Download machen. Dies ist aber mit diversen Problemen verbunden, weil nicht alle Files im Package included sind und es zu vielen Fehlern kommt. Da ich für den Flashcoms Chat dringend die RC1 Version benötige (RC2 gibt einen Fehler aus), muss ich wohl diesen Weg gehen…
Erstmal hier downloaden.
cd /usr/local/software/ mkdir red5_1.0.0RC1 cd red5_1.0.0RC1 fetch http://trac.red5.org/downloads/1_0/red5-1.0.0-RC1.tar.gz tar xzfv red5-1.0.0-RC1.tar.gz cd red5-1.0.0 rm *.bat
Wenn ich nun
ant clean dist
ausführe, resultiert das in einem Fehler, weil die Ivy Files nicht in diesem Package included sind.
BUILD FAILED
/usr/local/software/red5_1.0.0RC1/red5-1.0.0/build.xml:225: The following error occurred while executing this line:
/usr/local/software/red5_1.0.0RC1/red5-1.0.0/build.xml:239: The following error occurred while executing this line:
/usr/local/software/red5_1.0.0RC1/red5-1.0.0/build.xml:181: settings file does not exist: /usr/local/software/red5_1.0.0RC1/red5-1.0.0/ivysettings.xml
Hier das Ticket zu diesem Problem. Nun habe ich in einem anderen Directory (/usr/local/software/red5) bereits die aktuellste red5 Version (RC2) gedownloaded, wo alle nötigen Files dabei sind. Von dort werde ich nun die fehlenden Dateien kopieren.
cp /usr/local/software/red5/ivysettings.xml . cp /usr/local/software/red5/ivy.xml .
WICHTIG! Damit der Build auch gleich komplett durchläuft entpacke ich das src.zip manuell. Denn der Installer scheint das irgendwie nicht selber zu machen…:
mkdir src cp src.zip src cd src unzip src.zip rm -rf src.zip
Es kann sein, dass das src.zip File nicht vorhanden ist (in Version 1.0.0 fehlt dieses File). In diesem Fall war es einfach so, dass im red5-1.0.0.tar.gz File src.zip gefehlt hat — im red5-1.0.0.zip File war die Datei jedoch vorhanden!!
Nun klappt das builden:
ant clean dist
[...] BUILD SUCCESSFUL Total time: 23 seconds
Nun das dist Verzeichnis wieder an den endgültigen Ort kopieren:
cp -r dist/* /usr/local/red5/
Soo… nun funktionierts 🙂 Für eventuelle Fehlermeldungen (SLF4J) und Probleme -> runterscrollen 🙂
Konfigurierung für SSL Support per HTTPs
Hinweis: Ich habe zwar, wie im folgenden Artikel beschrieben, https sowie SSL Support zum Laufen gebracht, jedoch konnte der Mobile Chat nach wie vor NICHT über https://<deineIP>:8888 angesprochen werden. Auch müsste man ein richtiges Zertifikat generieren – nur das vom Webserver zu nehmen reicht nicht.
Damit der Mobile Flashcoms Chat auch unter https funktioniert, muss auch Red5 mit SSL Support konfiguriert werden. Glücklicherweise kann man dazu das bereits bestehende Zertifikat der Webseite nutzen und muss kein neues generieren.
Als erstes muss man das SSL File in den Java Keystore konvertieren. (Das Keytool befindet sich in im JAVA Verzeichnis – in meinem Fall: /usr/local/openjdk8/bin/)
openssl pkcs12 -export -out keystore.p12 -inkey /usr/local/etc/letsencrypt/live/www.domain.com/privkey.pem -in /usr/local/etc/letsencrypt/live/www.domain.com/fullchain.pem -certfile /usr/local/etc/letsencrypt/live/www.domain.com/chain.pem -name tomcat
/usr/local/openjdk8/bin/keytool -importkeystore -srckeystore keystore.p12 -destkeystore keystore.jks -srcstoretype pkcs12
/usr/local/openjdk8/bin/keytool -storepasswd -new <MYPASSWORD> -keystore keystore.jks
/usr/local/openjdk8/bin/keytool -keypasswd -new <MYPASSWORD> -keystore keystore.jks -alias tomcat
Keystore File in die gewünschte Location kopieren:
cp keystore.jks /usr/local/red5/conf
Jetzt noch die red5/tomcat Konfiguration anpassen
cd /usr/local/red5/conf
vi red5.properties
hier das <MYPASSWORD> Passwort eintragen, welches wir oben gesetzt haben, sowie die Location zum keystore angeben.
# RTMPS Keystore Password
rtmps.keystorepass=password
rtmps.keystorefile=conf/keystore.jks
vi jee-container.xml
Hier den Bereich mit <!– Tomcat without SSL enabled –> DEAKTIVIEREN
Und den Bereich <!– Tomcat with SSL enabled –> AKTIVIEREN
Ausserdem darauf achten, dass Keystorepass und Keystorefile aus dem Config genommen werden und nicht statisch ins File geschrieben sind:
<entry>
<key><value>keystoreFile</value></key>
<value>${rtmps.keystorefile}</value>
</entry>
<entry>
<key><value>keystorePass</value></key>
<value>${rtmps.keystorepass}</value>
</entry>
Nun red5 neu starten.
Danach beim Flashcoms Mobile Chat im index.php die Zeile
host: 'http://<deineIP>:8888',
ändern in
host: 'https://<deineIP>:8888',
und Testen 🙂
…Geht leider nicht 🙁
Der Chat läuft jetzt zwar im SSL Modus, man kann ihn auch über https://<deine IP>:5443/ ansprechen, aber den Port 8888 bringe ich leider nicht unter https zum Laufen. Meine Lösung war hier, meine Community zwar auf SSL laufen zu lassen, den Chat aber auf einer Port 80 Subdomain laufen zu lassen. Das war die schnellste Lösung, nicht schön, aber es funktioniert wenigstens.
Link zum Originalartikel
Fehlermeldungen / Problembehebung
Exception in thread „main“ java.lang.NoClassDefFoundError: org/red5/server/Bootstrap
Wenn ich von Tarball her builde hab ich folgenden Fehler erhalten:
Running on FreeBSD Starting Red5 Listening for transport dt_socket at address: 8787 Exception in thread "main" java.lang.NoClassDefFoundError: org/red5/server/Bootstrap Caused by: java.lang.ClassNotFoundException: org.red5.server.Bootstrap at java.net.URLClassLoader$1.run(URLClassLoader.java:200) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:188) at java.lang.ClassLoader.loadClass(ClassLoader.java:306) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:276) at java.lang.ClassLoader.loadClass(ClassLoader.java:251) at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
Zu diesem Problem hab ich diverse Lösungsansätze online gefunden, leider hat davon nichts geholfen. Der eine Vorschlag war, das boot.jar File zu ersetzen mit dem File aus dem original Package (also Tarball nochmals entpacken und das default boot.jar verwenden) nur das klappt auch nicht, da man ja genau dieses File sowie auch red5.jar extra für sein eigenes System builden muss. Und wenn man das default File nimmt, bekommen wir dafür andere Errors.
Problem: der Build war nicht korrekt, da das src.zip vom Installer nicht entpackt wurde.
Lösung: das src.zip vor dem Build manuell entpacken. Für den gesamten Lösungsweg siehe Installationsanleitung von Tarball.
[ERROR] [pool-2-thread-1] org.red5.server.persistence.FilePersistence – Could not create directory /usr/local/red5/webapps/chat7_trial/persistence/SharedObject
tail -f /usr/local/red5/log/red5.log
Ergibt den folgenden Fehler:
[ERROR] [pool-2-thread-1] org.red5.server.persistence.FilePersistence - Could not create directory /usr/local/red5/webapps/chat7_trial/persistence/SharedObject
Also beheben… Red5 läuft als user WWW:
# ps auxf|grep red5 www 43354 0.0 5.4 366884 113628 ?? Is 8:46AM 0:08.79 /usr/local/jdk1.6.0/bin/java -Dpython.home=lib -Dred5.root=/usr/[...]
Also entsprechend noch die Permissions setzen:
chown -R www:www /usr/local/red5/
Und Server nochmal starten und Log angucken. Nun sieht alles ok aus:
[INFO] [Launcher:/installer] org.red5.server.service.Installer - Installer service created
Port 5080 : Remote Connection refused
Als erstes mal per Telnet versuchen:
> telnet 5080 Trying ... telnet: connect to address : Connection refused telnet: Unable to connect to remote host
ok, von Remote geht es also nicht. Jetzt mal auf der lokalen Maschine checken:
> telnet localhost 5080 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'.
Ports anschauen:
# netstat -a | grep 1935 tcp4 0 0 localhost.1935 *.* LISTEN # netstat -a | grep 5080 tcp4 0 0 localhost.5080 *.* LISTEN
Hier ist also das Problem, dass red5 nur auf Localhost hört. Da ich aber möchte, dass man nicht nur Lokal sondern auch von anderen Servern aus auf den Red5 Server zugreifen kann, muss man die default Einstellungen ändern.
cd /usr/local/red5/conf vi red5.properties
Hier ist nun wichtig, dass die Hosts auf 0.0.0.0 eingestellt sind (oder aber auf die effektive Server-IP – sonst kann es ev. auch wieder zu Fehlern kommen) und nich auf 127.0.0.1. Hier das Diff:
< policy.host=0.0.0.0 --- > policy.host=127.0.0.1 6c6 < http.host=0.0.0.0 --- > http.host=127.0.0.1 11c11 < rtmp.host=0.0.0.0 --- > rtmp.host=127.0.0.1 22c22 < rtmps.host=0.0.0.0 --- > rtmps.host=127.0.0.1 34c34 < rtmpt.host=0.0.0.0 --- > rtmpt.host=127.0.0.1 44c44 < mrtmp.host=0.0.0.0 --- > mrtmp.host=127.0.0.1 67c67 < jmx.rmi.host=0.0.0.0 --- > jmx.rmi.host=127.0.0.1
Also die Hosts ändern, danach den red5 Server neu starten. Nun sollte es gehen mit der Connection.
Memory Probleme: java.lang.OutOfMemoryError: Java heap space
Nach einer gewissen Zeit kann es durchaus sein, dass red5 abstürzt. Dann geht die CPU Auslastung auf 100% rauf und der Socket antwortet nicht mehr. Im red5.err Logfile sehen wir dann:
java.lang.OutOfMemoryError: Java heap space at java.lang.String.substring(String.java:1940) at java.lang.String.subSequence(String.java:1973) at java.util.regex.Matcher.getSubSequence(Matcher.java:1151) at java.util.regex.Matcher.group(Matcher.java:473) at java.util.Formatter.parse(Formatter.java:2475) at java.util.Formatter.format(Formatter.java:2413) at java.util.Formatter.format(Formatter.java:2366) at java.lang.String.format(String.java:2770) at org.red5.server.net.rtmp.RTMPConnection.toString(RTMPConnection.java:989) at org.slf4j.helpers.MessageFormatter.safeObjectAppend(MessageFormatter.java:276) at org.slf4j.helpers.MessageFormatter.deeplyAppendParameter(MessageFormatter.java:248) at org.slf4j.helpers.MessageFormatter.arrayFormat(MessageFormatter.java:206) at ch.qos.logback.classic.spi.LoggingEvent.getFormattedMessage(LoggingEvent.java:287) at ch.qos.logback.classic.pattern.MessageConverter.convert(MessageConverter.java:26) at ch.qos.logback.classic.pattern.MessageConverter.convert(MessageConverter.java:23) at ch.qos.logback.core.pattern.FormattingConverter.write(FormattingConverter.java:36) at ch.qos.logback.core.pattern.PatternLayoutBase.writeLoopOnConverters(PatternLayoutBase.java:114) at ch.qos.logback.classic.PatternLayout.doLayout(PatternLayout.java:140) at ch.qos.logback.classic.PatternLayout.doLayout(PatternLayout.java:56) at ch.qos.logback.core.WriterAppender.subAppend(WriterAppender.java:270) at ch.qos.logback.core.WriterAppender.append(WriterAppender.java:120) at ch.qos.logback.core.UnsynchronizedAppenderBase.doAppend(UnsynchronizedAppenderBase.java:93) at ch.qos.logback.core.spi.AppenderAttachableImpl.appendLoopOnAppenders(AppenderAttachableImpl.java:64) at ch.qos.logback.classic.Logger.appendLoopOnAppenders(Logger.java:275) at ch.qos.logback.classic.Logger.callAppenders(Logger.java:262) at ch.qos.logback.classic.Logger.buildLoggingEventAndAppend(Logger.java:465) at ch.qos.logback.classic.Logger.filterAndLog_0_Or3Plus(Logger.java:419) at ch.qos.logback.classic.Logger.warn(Logger.java:748) at org.red5.server.net.rtmp.RTMPConnection$KeepAliveJob.execute(RTMPConnection.java:1089) at org.red5.server.scheduling.QuartzSchedulingServiceJob.execute(QuartzSchedulingServiceJob.java:59) at org.quartz.core.JobRunShell.run(JobRunShell.java:202) at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:525) Exception in thread "RMI TCP Connection(idle)" java.lang.OutOfMemoryError: Java heap space Exception in thread "Timer-2" java.lang.OutOfMemoryError: Java heap space Exception in thread "RMI RenewClean-[0.0.0.0:65006]" java.lang.OutOfMemoryError: Java heap space Exception in thread "pool-6-thread-14" java.lang.OutOfMemoryError: Java heap space Exception in thread "pool-5-thread-1" java.lang.OutOfMemoryError: Java heap space
Dieses Problem kann man loesen, indem man Red5 per Default mehr Limite gibt.
-Xms set initial Java heap size -Xmx set maximum Java heap size
Die Default Startoptionen von Red5 unter FreeBSD sehen so aus:
/usr/local/diablo-jdk1.6.0/bin/java -Dpython.home=lib / -Dred5.root=/usr/local/red5 / -Dlogback.ContextSelector=org.red5.logging.LoggingContextSelector / -Dcatalina.useNaming=true / -Djava.security.debug=failure / -cp /usr/local/red5/boot.jar:/usr/local/red5/conf: org.red5.server.Bootstrap
Nun kann man zusätzliche Startoptionen hinzufügen. Die möglichen Java Optionen kann man per -X ausgeben. Relevant sind die Settings in Rot:
# java -X -Xmixed mixed mode execution (default) -Xint interpreted mode execution only -Xbootclasspath: set search path for bootstrap classes and resources -Xbootclasspath/a: append to end of bootstrap class path -Xbootclasspath/p: prepend in front of bootstrap class path -Xnoclassgc disable class garbage collection -Xincgc enable incremental garbage collection -Xloggc: log GC status to a file with time stamps -Xbatch disable background compilation -Xms set initial Java heap size -Xmx set maximum Java heap size -Xss set java thread stack size -Xprof output cpu profiling data -Xfuture enable strictest checks, anticipating future default -Xrs reduce use of OS signals by Java/VM (see documentation) -Xcheck:jni perform additional checks for JNI functions -Xshare:off do not attempt to use shared class data -Xshare:auto use shared class data if possible (default) -Xshare:on require using shared class data, otherwise fail. The -X options are non-standard and subject to change without notice.
Im Red5 Startup Script hat es folgende Beispiel Settings drin:
# red5_java_opts (str): # Set to "" by default. # Java VM args to use. # Eg: red5_java_opts="-Xrs -Xms512M -Xmx1024M -Xss128K -XX:NewSize=256m -XX:SurvivorRatio=16 # -XX:MinHeapFreeRatio=20 -XX:+AggressiveHeap -XX:+ExplicitGCInvokesConcurrent # -XX:+UseConcMarkSweepGC -Dsun.rmi.dgc.client.gcInterval=990000 # -Dsun.rmi.dgc.server.gcInterval=990000 # -Djava.net.preferIPv4Stack=true -Xverify:none"
Diese Einstellungen werden für HighPerformance Red5 Server benötigt. Also füge ich das ins rc.conf ein.
vi /etc/rc.conf
#-----------------------------------------------# # Red5 Chatserver # #-----------------------------------------------# red5_enable="YES" red5_java_opts="-Xrs -Xms512M -Xmx1024M -XX:NewSize=256m -XX:SurvivorRatio=16 -XX:MinHeapFreeRatio=20 -XX:+AggressiveHeap -XX:+ExplicitGCInvokesConcurrent -Dsun.rmi.dgc.client.gcInterval=990000 -Dsun.rmi.dgc.server.gcInterval=990000 -Djava.net.preferIPv4Stack=true -Xverify:none"
Das sollte für’s erste die Probleme beheben. Nun haben wir beim Red5 Startup -Xms512M -Xmx1024M das heisst, beim Startup stehen Red5 512MB zur Verfügung, welche Max auf 1024M erweitert werden (max Limit).
Benötigter Speicher berechnen
(Hier auf einem CentOS Server)
Zuerst PID suchen
# ps auxf |grep java www 28378 0.0 0.0 3944 720 pts/1 S+ 09:52 0:00 _ grep java www 28199 2.0 3.2 873468 130276 pts/0 Sl 09:45 0:07 /usr/lib/jvm/java-6-sun-1.6.0.07/jre/bin/java -Dpython.home=lib -Dred5.root=/home/ray_server/RayServer -Xint -Xms256M -Xmx600M -Dlogback.ContextSelector=org.red5.logging.LoggingContextSelector -Dcatalina.useNaming=true -Djava.security.debug=failure -cp /home/ray_server/RayServer/red5.jar:/home/ray_server/RayServer/conf:/home/ray_server/RayServer/lib/ejb3-persistence.jar: org.red5.server.Bootstrap
Danach
pmap -d 28199
ausführen. So kann man genau sehen vieviel Memory für diesen Prozesses verwendet wird. Das ist genauer, als wenn ich das über VSZ/RSS machen würde von ps auxf.
Momentan gibt er am Schluss aus:
mapped: 541956K writeable/private: 496640K shared: 5064K
Das sind also 530MB Mapped. Und 485MB Writable/Private. Was auch immer das ist 😉 Daher mach ich, dass der Chat mit 256M aufstartet und auf max. 600M erhöht werden kann.
-Xms256M -Xmx600M
java.io.IOException: Cannot bind to URL [rmi://0.0.0.0:9999/red5]: javax.naming.ConfigurationException [Root exception is java.rmi.UnknownHostException: Unknown host: 0.0.0.0; nested exception is:
Hierbei handelt es sich mit grösster Wahrscheinlichkeit um ein DNS Problem.
1) Hostname des Servers prüfen und bei Bedarf korrigieren
hostname
2) Falls das noch nichts geholfen hat, im /etc/hosts File einen DNS Eintrag hinzufügen.
[ERROR] The scratchDir you specified: [..] is unusable.
Beim Red5 Startup gibts folgenden Fehler:
[ERROR] [main] org.apache.jasper.EmbeddedServletOptions - The scratchDir you specified: /usr/local/red5_1.0.0/work/red5Engine/0.0.0.0/chat71_log_pro is unusable. [ERROR] [main] org.apache.jasper.EmbeddedServletOptions - The scratchDir you specified: /usr/local/red5_1.0.0/work/red5Engine/0.0.0.0/_ is unusable. Context init...
Problem war, dass das work Dir gar nicht vorhanden war – und auch die Permissions müssen korrekt gesetzt werden. Bei mir läuft der Chatserver unter User www. Also:
mkdir /usr/local/red5_1.0.0/work/ chown www:www /usr/local/red5_1.0.0/work