誰でも出来る簡単Red5環境構築

ども、出来ることなら楽したい、めんどくさいことはしたくない、手抜きが大好き!でおなじみアラガです。

先日、FMS勉強会でネタのつもりで僕の手抜きRed5環境構築法を紹介したのですが、意外と役に立つ部分もありそうだったので紹介します。

まず、Red5とはJavaで作られているオープンソースのFMS(Flash Media Server)クローンです。弊社でも、今日の緑さん超能力ラボ等、FMSではなく無料で使えるRed5を採用しているプロジェクトも数多く存在しています。

僕はこのRed5のインストールを何度かしていますが、バージョンが上がったりした際に一発でインストールできなかったり、いろいろと苦戦をしてきました。

しかし、最近ある方法を使って超速に環境をさくっと作れるようになってきました。

以下で紹介します。

超速インストール方法

1.Java6をインストールする

実はこれが一番敷居が高いのですが、方法はググれば沢山出てくるので省略いたします。

2.自分のマシンにred5をインストーラを使ってインストール

これがポイントです。red5のサイトから最新のインストーラ付きred5をインストーラを使ってインストールします。

3.red5をまるまるscpでサーバーにアップロード

windowsでもmacでもokでした。

  1. red5を起動
./red5.sh

この方法のメリットは、依存関係も何もかも1発で出来ることです。コマンドじゃなくてローカルでGUIを使うなんてダサイと思うかもしれませんが、本当に楽でおすすめです。

ただし、antのインストール等をすっとばしているのでサーバーでビルドし直しとかすると、一瞬で壊れるので要注意です。

また、各アプリケーションは自分の環境で(僕はeclipse)でコンパイルしてwebapps以下に放り込みred5を再起動すると動きます。

アクセスログを出す

正直、ストリームサーバーでアクセスログの必要性がよくわからないのですが、(webページで十分)出せとよく言われるので出すことが多いです。こんなときは以下の方法がらくだと思います。

以下のクラスを作成

AccessLog.java

package hoge; // パッケージはアプリケーションごとに作成
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class AccessLog 
{
    protected static Logger log =                                   
         LoggerFactory.getLogger(AccessLog.class);
    public void put(String message) {
        log.info(message);
    }
}

メインのクラス(たいていはApplication.java)に必要に応じた出力を書く

Application.java

public class Application extends ApplicationAdapter {
    private AccessLog accessLog;    

    @Override
    public boolean appStart(IScope app) {
        accessLog = new AccessLog();
        return super.appStart(app);
    }

    // connectだとroom利用時に2回動いてしまいます
    @Override
    public boolean appConnect(IConnection conn, Object[] params) {
        putAccessLog(conn);
        return supper.appConnect();
    }
    // AccessLogに書いても良いと思いますが、Applicationのほうが多くの情報をとれます
    protected void putAccessLog(IConnection conn) {
        String cid = getStrCid(conn.getClient()); // Red5が生成するクライアントの一意のID
        String refererUrl = (String) conn.getConnectParams().get("swfUrl"); // アクセスもとSWFのURL
        String access = (String) conn.getConnectParams().get("app"); // application/room
        String userIP = conn.getRemoteAddress(); // クライアントのIP
        String flashVer = (String) conn.getConnectParams().get("flashVer"); //フラッシュバージョン

        accessLog.put("ACCESS=" + access + ", STATUS=" + status
                + ", CLIENTID=" + cid + ", IP=" + userIP + ", REFERER="
                + refererUrl + ", FLASH-VERSION=" + flashVer);
    }
}

アクセスログに限らずred5でログを出すためにはslfjの設定をしないといけません。注いでにアプリケーションの設定も晒します

logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <appender name="APP"
        class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>log/hoge/app.log</file>
        <append>true</append>
        <rollingPolicy
            class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <FileNamePattern>log/hoge/sys.%d{yyyy-MM-dd}.log</FileNamePattern>
        </rollingPolicy>
        <encoding>UTF-8</encoding>
        <layout class="ch.qos.logback.classic.PatternLayout">
            <Pattern>
                %date [%thread] %-5level %logger{35} - %msg%n
            </Pattern>
        </layout>
    </appender>

    <appender name="ACCESS_LOG"
        class="ch.qos.logback.core.rolling.RollingFileAppender">
        <File>log/hoge/access.log</File>
        <append>true</append>
        <rollingPolicy
            class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <FileNamePattern>log/hoge/access.log.%d{yyyyMMdd}</FileNamePattern>
        </rollingPolicy>
        <encoding>UTF-8</encoding>
        <layout class="ch.qos.logback.classic.PatternLayout">
            <Pattern>%date %msg%n</Pattern>
        </layout>
    </appender>

    <!-- 全体はINFOレベルでまとめて出力 -->
    <root>
        <level value="INFO" />
        <appender-ref ref="APP"/>
    </root>
    <!-- アクセスログは単体で別ファイルに出力 -->
    <logger name="hoge.AccessLog">
        <level value="INFO" />
        <appender-ref ref="ACCESS_LOG" />
    </logger>

</configuration>

勉強会では無かった箇所も晒しました。あんまりらくではないかも。。。

(追記 2008-12-08) logbackを使用するときはlog4jのときとは違って、webapps/myapp/WEB-INF/libいかに書きの.jarを入れないと動きません。

  • logback-classic-0.9.8.jar
  • logback-core-0.9.8.jar
  • slf4j-api-1.4.3.jar

javaはよくわかりませんが、slf4jは設定ファイルではなく、クラスパスにあるjarでロガーを切り替えるみたいです。

同一サーバーに開発環境を作る

cp ?R red5 red5_dev
vi red5_dev/conf/red5.properties 

hoge.portを片っ端から変更する。

例えば+100とすると、開発環境へはrtmp://path.to.red5:2035/appでアクセス可能になります。

本来は別サーバーをたてるのが理想ですが、もったいないので同一サーバーにRed5をもう一つたてるという方法です。

以上、ざっくりでしたが何かのお役に立てば幸いです。

そうそう、red5はjavaだからなーというそこのあなた!kamaitachiを使えばPerlでもrtmpサーバーが作成できますよ!

カヤックではRTMP等を使用したインタラクティブなサイト制作に興味のあるエンジニアや、手抜きをするために苦労をいとわないエンジニアを募集しています!