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

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%n
        
                log/red5.log
                false
        
                
        

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)

  1. 7-Zip runterladen
  2. ein Backup von logback-classic-0.9.28.jar machen
  3. logback-classic-0.9.28.jar mit 7-Zip öffnen
  4. im JAR Archiv in die Struktur \org\slf4j\impl\ rein
  5. dort StaticLoggerBinder.class LÖSCHEN
  6. fertig – speichern muss man nicht, geht automatisch.
  7. 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

 

 

  • *

    Du kannst diese HTML tags verwenden: <a> <abbr> <acronym> <b> <blockquote> <cite> <code> <del> <em> <i> <q> <s> <strike> <strong>

  • Kommentar-Feed für diesen Beitrag
nach oben